kubeadm引导欧拉系统高可用的K8S1.28.X
文章目录
- 一. 核心组件架构
- 二. 有状态与无状态应用
- 三. 资源对象
- 3.1 规约与状态
- 3.2 资源的分类-元数据,集群,命名空间
- 3.2.1 元数据
- 3.2.2 集群资源
- 3.3 命名空间级
- 3.3.1 pod
- 3.3.2 pod-副本集
- 3.3.3 pod-控制器
- 四. Kubeadm安装k8s集群
- 4.1 初始操作
- 4.2 ~~所有节点安装Docker(不建议)~~
- 4.2 contained运行时容器安装
- 4.3 所有节点安装kubernates组件
- 4.4 安装高可用组件
- 4.5 集群初始化
- 4.5.2 安装helm
- 4.5.3 离线安装Calico
- 4.5.4 Metrics Server
- 4.5.5 Kuboard
- 4.5.6 集群验证
K8s图
# containerd常用命令
ctr -n=<namespace> c ls # ctr -n=<namespace> containers list 查看containerd容器
ctr -n=<namespace> i ls # ctr -n=<namespace> images list 查看containerd镜像
ctr ns ls # ctr namespace list 查看containerd命名空间# 应当交由k8s pod管理。我们很少直接操作容器
ctr -n=<namespace> c rm <容器ID> # 删除容器
ctr -n=<namespace> i rm <镜像ID> # 删除镜像# kubectl常用命令
kubectl get ns # 查看k8s命名空间
kubectl get nodes # 查看k8s集群节点
kubectl get pods -n <namespace> # 查看某命名空间下所有pod
kubectl get pods -n <namespace> -o wide # 查看pod的详细内容kubectl logs <pod> -n <namespace> # 查看某容器日志记录
kubectl describe <pod> -n <namespace> # Kubernetes 资源(如 pod、节点和部署)的详细信息kubectl delete pod <pod> -n <namespace> # 删除容器
kubectl delete namespaces <namespace> # 删除命名空间kubectl taint nodes k8s-node2 check:NoExecute- # 去除污点
kubectl taint nodes k8s-node2 check=yuanzhang:NoExecute # 设置污点
一. 核心组件架构
Kube-APIServer:集群的控制中枢,各个模块之间信息交耳都需要经过 Kube-APIServer,同
时它也是集群管理、资源配置、整个集群安全机制的入口。
Controller-Manager:集群的状态管理器,保证Pod 或其他资源达到期望值,也是需要和APISewr进行通信,在需要的时候创建、更新或删除它所管理的资源。
Scheduler:集群的调度中心,它会根据指定的一系列条件,选择一个或一批最佳的节点,然后部署我们的 Pod。
Etcd: 键值数据库,报错一些集群的信息,一般生产环境中建议部署三个以上节点(奇数个)
Kubelet: 负责监听节点上 Pod的状态,同时负责上报节点和节点上面Pod 的状态,负责与 Master节点通信,并管理节点上面的Pod。
Kube-proxy:负责Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。查看 Kube-proxy 工作模式:curl 127.0.0.1:10249/proxyMode
ipvs:监听 Master 节点增加和删除 service 以及 endpoint 的消息,调用 Netlink接口创建相应的IPVS 规则。通过IPVS 规则,将流量转发至相应的Pod上。
Iptables:监听 Master 节点增加和删除 service 以及endpoint 的消息,对于每一个Service,他都会场景一个iptables 规则,将service 的 clusterIP 代理到后端对应的 Pod。
Calico:符合CNI标准的网络插件,给每个Pod 生成一个唯一的IP地址,并且把每个节点当做一个路由器。Ciliume
CoreDNS:用于 Kubernetes 集群内部 Service 的解析,可以让 Pod 把 Service 名称解析成 IP 地址,然后通过 Service的IP地址进行连接到对应的应用上。
Containerd: 容器引擎,负责对容器的管理。
Pod: Pod 是 Kubernetes 中最小的单元,它由一组、一个或多个容器组成,每个 Pod 还包含了一个 Pause 容器,Pause 容器是 Pod 的父容器,主要负责僵尸进程的回收管理,通过通过 Pause容器可以使同一个 Pod 里面的多个容器共享存储、网络、PID、IPC等。为不同的容器厂商提供了标准的CRI接口,实现容器调用。
二. 有状态与无状态应用
简单理解: 有数据存储的中间件是有状态应用,反之则是无状态.
无状态 | 有状态 | |
---|---|---|
缺点 | 不能存储数据,需要额外的数据服务支撑 | 集群环境下需要实现主从、数据同步、备份、水平扩容复杂 |
优点 | 对客户端透明,无依赖关系,可以高效实现扩容、迁移 | 可以独立存储数据,实现数据管理 |
三. 资源对象
Kubernetes中的所有内容都被抽象为"资源",如Pod、service.Node等都是资源。“对象"就是"资源"的实例,是持久化的实体。如某个具体的Pod、某个具体的Node。Kubernetes使用这些实体去表示整个集群的状态。
各组件配置API官方文档
3.1 规约与状态
spec
”是“规约"、“规格”的意思,spec是必需的,它描述了对象的期望状态(Desired state) ——希望对象所具有的特征。当创建Kubernetes对象时,必须提供对象的规约
,用来描述该对象的期望状态,以及关于对象的一些基本信息(例如名称)。
status
表示对象的实际状态,该属性由k8s自己维护,k8s会通过一系列的控制器对对应对象进行管理,让对象尽可能的让实际状态与期望状态重合。
3.2 资源的分类-元数据,集群,命名空间
大致分为三类: 元数据,集群,命名空间
3.2.1 元数据
一句话概括:对Kubernetes的所有资源实施了弹性约束和全局约束,并对实例的创建规则进行了描述。
Horizontal Pod Autoscaler (HPA):
PodTemplate
LimitRange
3.2.2 集群资源
Namespace
Node
ClusterRole
ClusterRoleBinding
不能绑定到元数据上的资源
3.3 命名空间级
3.3.1 pod
为什么我们需要Pod?当我们仅有运行时环境时,我们希望多个高度耦合的Java项目能够共享同一个数据卷,以实现数据共享。然而,在一对多的管理情况下,这变得极其不方便。
建议: 在一个Pod中关联了紧耦合的容器。通常情况下,一个Pod只包含一个容器。
3.3.2 pod-副本集
扩缩容的基础实例
3.3.3 pod-控制器
管理pod的控制器有很多,负责pod的无状态,有状态,定时任务,守护进程等的管理
无状态服务-扩缩容控制器 ReplicaSet(RS)
无状态服务-Deployment 针对RS的扩展,具备额外的滚动升级,回滚暂停恢复等
有状态服务-StatefulSet 专门针对于有状态服务进行部署的一个控制器
一句话总结: 保证无缝切换数据不丢失,同时确保项目能够访问新的容器地址,并保持集群主从关系的稳定,就像Redis哈希槽分区一样,确保分区不会混乱。
- 稳定的持久化存储: 即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现
- 稳定的网络标志: 稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service(即没有 Cluster IP 的 Service)来实现
- 有序部署,有序扩展: 有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从 0到 N-1,在下一个Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现
- 有序收缩,有序删除: 有序收缩,有序删除(即从 N-1 到 0)
Headless Service | 用于定义网络标志(DNS domain)DNS:域名服务将域名与 ip 绑定映射关系服务名 => 访问路径(域名) => ip |
volumeClaimTemplate | 用于创建持久化模板,类似docker数据卷 |
DaemonSet | DaemonSet 保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。 |
job | 一次定时任务 |
cronjob | 周期定时任务 |
服务发现
service | Pod 不能直接提供给外网访问,而是应该使用 service。Service 就是把 Pod 暴露出来提供服务 |
Ingress | Ingress 可以提供外网访问 Service 的能力。可以把某个请求地址映射、路由到特定的 service。ingress 需要配合 ingress controller 一起使用才能发挥作用,ingress 只是相当于路由规则的集合而已,真正实现路由功能的,是 Ingress Controller,ingress controller 和其它 k8s 组件一样,也是在 Pod 中运行。 |
配置与存储
- Volume :数据卷,共享 Pod 中容器使用的数据。用来放持久化的数据,比如数据库数据。
- CSI: Container Storage Interface 是由来自 Kubernetes、Mesos、Docker 等社区成员联合制定的一个行业标准接口规范,旨在将任意存储系统暴露给容器化应用程序。CSI 规范定义了存储提供商实现 CSI 兼容的 Volume Plugin 的最小操作集和部署建议。CSI 规范的主要焦点是声明 Volume Plugin 必须实现的接口。
- ConfigMap: 用来放配置,与 Secret 是类似的,只是 ConfigMap 放的是明文的数据,Secret 是密文存放。
- Secret : Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。
Secret 有三种类型:
Service Account:用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;
Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;
kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息。 - DownwardAPI: downwardAPI 这个模式和其他模式不一样的地方在于它不是为了存放容器的数据也不是用来进行容器和宿主机的数据交换的,而是让 pod 里的容器能够直接获取到这个 pod 对象本身的一些信息。
downwardAPI 提供了两种方式用于将 pod 的信息注入到容器内部:
环境变量:用于单个变量,可以将 pod 信息和容器信息直接注入容器内部
volume 挂载:将 pod 信息生成为文件,直接挂载到容器内部中去
role/rolebinding
四. Kubeadm安装k8s集群
kubectl debug #设置临时容器
sidecar # 本地文件日志filebeat收集和业务容器顺序定义
volumn # 更改目录权限,1.18之后不建议修改权限,文件数量大可能起不来容器
configMap和Secret #1.18后不支持运行时修改,避免热更新出错,导致生产事故
至少有 master,node节点服务器
操作系统: Centos7
K8S: 1.24+ 运行时环境不支持docker
运行时环境: Contanied,CRI-O
4.1 初始操作
https://github.com/kubernetes/kubernetes/issues/53533
主机名 | ip |
---|---|
k8s-master01 | 192.168.0.101 |
k8s-master02 | 192.168.0.102 |
k8s-master03 | 192.168.0.103 |
k8s-node01 | 192.168.0.104 |
k8s-node02 | 192.168.0.105 |
k8s-node03 | 192.168.0.106 |
k8s-loadblancer | 192.168.0.107 |
所有节点
配置dns映射文件
vi /etc/hosts
192.168.0.101 k8s-master01
192.168.0.102 k8s-master02
192.168.0.103 k8s-master03
192.168.0.104 k8s-node01
192.168.0.105 k8s-node02
192.168.0.106 k8s-node03
192.168.0.107 k8s-loadblancersystemctl disable --now firewalld
systemctl disable --now dnsmasg
#systemctl disable --now NewworkManager #Centos8无需关闭
setenforce 0
#=========start ========
vim /etc/sysconfig/selinux
# 修改selinux参数
SELINUX=disabled
#=========end =========# swap启用后,在使用磁盘空间和内存交换数据时,性能表现会较差,会减慢程序执行的速度# kubelet 在 1.8 版本以后强制要求 swap 必须关闭
swapoff -a && sysctl -w vm.swappiness=0vim /etc/sysctl.conf
#======start==========
net.ipv4.ip_local_port_range = 1024 65535
#======end==========
sysctl -p#===== 注释swap静态文件读取,有些云服务器没有====
vi /etc/fstab
# /swap.img none swap sw 0 0 # 安装同步时间
yum install ntpdate -y
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone
ntpdate ntp1.aliyun.com#加入到crontab
crontab -e
# =========================
*/5 * * * * ntpdate ntp1.aliyun.com
# =========================# 配置网络
# 配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat >> /etc/sysctl.d/k8s.conf << EOF
#####################################
#关闭ipv6协议
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6=1
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
#######################################
EOFsysctl --system # 生效
Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在 Master01上操作,
集群管理也在 Master01 上操作,阿里云或者 AWS 上需要单独一台kubectl服务器。密钥配置如下:
只在主节点进行
ssh-keygen -t rsafor i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02 k8s-node03;do ssh-copy-id -i .ssh/id_rsa.pub $i;done
所有节点
安装负载均衡配置:
yum install ipvsadm ipset sysstat conntrack libseccompmodprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack # nf_connectrack_ipv4# 设置开机自启动
vi /etc/modules-load.d/ipvs.conf
# ==========================
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack #nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
# ==========================systemctl enable --now systemd-modules-load.service
# 检查是否加载
lsmod | grep -e ip_vs -e nf_conntrackinstall ipset ipvsadm -y
reboot
4.2 所有节点安装Docker(不建议)
需要说明的是k8s 1.24+以停止维护docker,需要额外安装docker-ce符合k8s容器接口标准。或者仅安装containerd容器
docker底层containerd。 之前k8s依赖顶层docker,docker操作containerd。但是docker不符合cri标准,被k8s踢出局了。直接对接底层contained。然后可以用containerd或者cri-o等,cri-o和docker一个级别,但是符合cri标准。
所有节点安装
查阅K8S适配容器
本博主采用欧拉系统,华为云HCE,以及欧拉操作系统开放源自基金会对于yum/dnf源,官方源都有问题。。最后看了一篇csdn成功了换源,如下
# 使用华为云服务Yum安装软件的时候提示错误:
# Error: Failed to download metadata for repo ‘epel’: Cannot download repomd.xml
https://blog.csdn.net/qq_58551342/article/details/137334183
https://cloud.tencent.com/developer/article/2383890
centos7,8系统
# 配置docker源
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum clean all
# 重新构建缓存索引
yum makecache# 查看可用docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r# 安装最新版本的 Docker Engine 和 containerd,或者进入下一步安装特定版本:
yum install docker-ce docker-ce-cli containerd.io -ysystemctl enable --now docker
4.2 contained运行时容器安装
# 配置软件源
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
# 修改安装源为国内地址
sed -i 's#https://download.docker.com#https://mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
# openEuler 的使用方式近似 CentOS,因此,修改软件源的配置,使用 centos 7 的软件源
sed -i 's#$releasever#7#g' /etc/yum.repos.d/docker-ce.repoyum clean all
yum makecachecat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOFmodprobe overlay
modprobe br_netfilter# 应用 sysctl 参数而无需重新启动
sudo sysctl --system# 移除之前安装的
remove docker docker-engine docker.io containerd runcyum install containerd -y
修改配置,符合k8s标准
# 生成默认配置
mkdir -p /etc/containerd
# 生成默认配置文件并写入到 config.toml 中
containerd config default | sudo tee /etc/containerd/config.toml# 配置containerd
vim /etc/containerd/config.toml
#==========start============
[plugins."io.containerd.grpc.v1.cri".registry]config_path = "/etc/containerd/certs.d"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]...[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true # false 修改为 true[plugins."io.containerd.grpc.v1.cri"]...# sandbox_image = "k8s.gcr.io/pause:3.6" crictl images list | grep pausesandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9" #这里一定要注意,要根据下载到本地 pause镜像的版本来进行修改,否则初始化会过不去。
#==========end============# 创建指定配置目录
mkdir /etc/containerd/certs.d/docker.io -pv
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://xxxxxxxx.mirror.aliyuncs.com"]capabilities = ["pull", "resolve"]
EOFsystemctl daemon-reload
systemctl enable --now containerd
4.3 所有节点安装kubernates组件
所有节点安装
欧拉操作系统,参考如下
# 欧拉操作系统
https://docs.openeuler.org/zh/docs/20.03_LTS_SP1/docs/thirdparty_migration/k8sinstall.html
#添加 kubernetes 仓库 欧拉不执行
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum clean all
yum makecache
yum list kubeadm.x86_64 --showduplicates | sort -r
#yum install -y kubelet-1.18.20 kubeadm-1.18.20 kubectl-1.18.20 kubernetes-cni-1.18.20
# 安装kubeadm会把 kubelet,kubectl cni都装上
yum install -y kubeadm-1.28.2-0
# 设置Kubelet开机自启动
systemctl daemon-reload
systemctl enable --now kubelet
4.4 安装高可用组件
负载均衡节点或者所有master节点安装
使用Keepalived和HAproxy创建高可用集群
yum install keepalived haproxy -y
vim /etc/haproxy/haproxy.cfg
#============start=============
# 由于 lb1 和 lb2 上安装了 Keepalived 和 HAproxy,
# 如果其中一个节点故障,虚拟 IP 地址(即浮动 IP 地址)将自动与另一个节点关联,
# 使集群仍然可以正常运行,从而实现高可用。
globallog /dev/log local0 warningchroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/statsdefaultslog globaloption httplogoption dontlognulltimeout connect 5000timeout client 50000timeout server 50000frontend kube-apiserverbind *:6444mode tcpoption tcplogdefault_backend kube-apiserverbackend kube-apiservermode tcpoption tcplogoption tcp-checkbalance roundrobindefault-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100# 请注意 server 字段。请记住 6443 是 apiserver 端口, 代理到的master节点server kube-apiserver-1 192.168.0.101:6443 check # Replace the IP address with your own.server kube-apiserver-2 192.168.0.102:6443 check # Replace the IP address with your own.server kube-apiserver-3 192.168.0.103:6443 check # Replace the IP address with your own.
#============end============
systemctl restart haproxy
systemctl enable --now haproxyvim /etc/keepalived/keepalived.conf
#============start==========
global_defs {notification_email {}router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}
## 检测haproxy程序脚本
vrrp_script chk_haproxy {script "killall -0 haproxy"interval 2weight 2
}vrrp_instance haproxy-vip {state BACKUPpriority 100# 对于 interface 字段,您必须提供自己的网卡信息。您可以在机器上运行 ifconfig 以获取该值。interface eth0 # Network cardvirtual_router_id 60advert_int 1authentication {auth_type PASSauth_pass 1111}
# 为 unicast_src_ip 提供的 IP 地址是您当前机器的 IP 地址,公网ipunicast_src_ip 192.168.0.101 # The IP address of this machine
# 对于也安装了 HAproxy 和 Keepalived 进行负载均衡的其他机器,必须在字段 unicast_peer 中输入其 IP 地址。unicast_peer { # 公网ip# 192.168.0.102 # The IP address of peer machines}virtual_ipaddress { # 公网ip# 192.168.0.10/24 # The VIP address}track_script {chk_haproxy}
}
#===========end===========
# 启动
systemctl restart keepalived
systemctl enable --now keepalived
4.5 集群初始化
利用 kubeadm 创建高可用集群
只在一个master节点初始化
# 节点初始化 均为私网地址,后期通过
# --control-plane-endpoint 负载均衡节点,其他node节点以此为准,一般为公网ip
# --kubernetes-version 初始化的k8s版本要和kubeadm一致
# --image-repository 镜像源
# --pod-network-cidr配置pod网络段,calico需要和其一致 子网划分套用
# --service-cidr 直接套用
# -- apiserver-advertise 当前master节点,内网ip
kubeadm init --control-plane-endpoint "192.168.0.101:6444" \
--upload-certs \
--kubernetes-version=v1.28.2 \
--image-repository=registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.0.101 \
--apiserver-bind-port=6443 \
-–cri-socket unix:///run/containerd/containerd.sock
# 初始化失败执行以下内容
kubeadm reset# 查看组件状态
kubectl get pods -n kube-system# iptables修改为ipvs
kubectl edit configmaps kube-proxy -n kube-system
# 删除之前的kube-proxy
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'# 验证代理模式
kubectl get pod -n kube-system | grep kube-proxy
kubectl logs kube-proxy-bk7pl -n kube-system
netstat -lntp | grep kube-proxy
curl 127.0.0.1:port/proxyMode
# 查看token过期时间
kubeadm token list
# 假如token过期
# 生成node节点token
kubeadm token create --print-join-command
# 生成master的
kubeadm init phase upload-certs --upload-certs
#master节点
kubeadm join 197.168.0.101:80 --token 6btwxm.ln24af24fj4zna76 \--discovery-token-ca-cert-hash sha256:898981bce15f5f4f8654c7a8f8ade7f2c5ea626193f90add6b208df6972362a0 \--control-plane --certificate-key 104fc0e4d56387568a5962c1a8cbb1f42c1395b0704c10fcfd8b753369bfd5fb#node节点
kubeadm join 197.168.0.101:80 --token 6btwxm.ln24af24fj4zna76 \--discovery-token-ca-cert-hash sha256:898981bce15f5f4f8654c7a8f8ade7f2c5ea626193f90add6b208df6972362a0
4.5.2 安装helm
Helm 图表是一种为 Kubernetes(类似于操作系统或操作系统)打包应用程序的方法。ArgoCD 等工具也使用 Helm 来管理集群中的应用程序,负责安装、升级(如果需要时回滚)等。
helm下载
wget https://get.helm.sh/helm-v3.15.1-linux-amd64.tar.gz
tar -zxvf helm-v3.15.1-linux-amd64.tar.gz \
&& mv linux-amd64/helm /usr/local/bin/ \
&& rm -rf linux-amd64
4.5.3 离线安装Calico
官方地址版本对应
安装资源包
本节参考自 离线安装calico
解压calico离线包并将所需文件上传至服务器
首先将calico.yaml文件上传至服务器
然后使用cat calico.yaml |grep image:命令查看calico所需的镜像包。
cat calico.yaml |grep image:
这里显示安装calico需要三个镜像,去解压的离线包imgaes文件夹中找到对应的三个离线镜像包文件,这里对应的分别是calico-cni.tar,calico-kube-controllers.tar和calico-node.tar三个离线包,将这三个离线镜像上传至服务器。
可以使用ctr namespace ls
命令查看containerd的命名空间。k8s的命名空间为k8s.io
离线镜像导入containerd的k8s命名空间中,使用containerd的导入镜像命令将calico的离线镜像包导入到k8s的命名空间中
ctr -n k8s.io images import calico-cni.tar
ctr -n k8s.io images import calico-kube-controllers.tar
ctr -n k8s.io images import calico-node.tar
用之前上传的calico.yaml文件安装calico,calico.yaml可根据自己的实际需要修改。
vi calico.yaml
#=========start=======
#修改calico.yaml里的pod网段。 和kubadm init时候 pod-network-cidr参数保持一致
#把calico.yaml里pod所在网段改成kubeadm init时选项--pod-network-cidr所指定的网段,
#直接用vim编辑打开此文件查找192,按如下标记进行修改:
- name: IPvalue: "autodetect"
- name: IP_AUTODETECTION_METHOD #添加该环境变量value: "interface=eth.*|ens.*"
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDRvalue: "10.244.0.0/16"
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGINGvalue: "true"
#========end ==========
# 为主节点和工作节点添加特定公网 IP 的注释
kubectl annotate node k8s-node01 projectcalico.org/IPv4Address=203.0.113.1
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
4.5.4 Metrics Server
对于 Kubernetes,Metrics API 提供了一组基本的指标,以支持自动伸缩和类似的用例。 该 API 提供有关节点和 Pod 的资源使用情况的信息, 包括 CPU 和内存的指标。
metrics-server 会请求每台节点的 kubelet 接口来获取监控数据,接口通过 HTTPS 暴露,但 Kubernetes节点的 kubelet 使用的是自签证书,若 metrics-server 直接请求 kubelet接口,将产生证书校验失败的错误,因此需要在 components.yaml 文件中加上 --kubelet-insecure-tls启动参数。
且由于 metrics-server 官方镜像仓库存储在 k8s.gcr.io ,国内可能无法直接拉取,您可以自行同步到 CCR或使用已同步的镜像 ccr.ccs.tencentyun.com/mirrors/metrics-server:v0.7.1
metrics server
# 下载 yaml 部署文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml
# containerd容器下载
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1vi components.yaml
#=========start=========
# 修改 metrics-server 启动参数
containers:
- args:- --cert-dir=/tmp- --secure-port=10250- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname- --kubelet-use-node-status-port- --metric-resolution=15s- --kubelet-insecure-tls # 加上该启动参数image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1 # 国内集群,请替换成这个镜像
#=========end=========
kubectl apply -f components.yaml
kubectl taint nodes kube-system check:NoExecute- # 去除污点
kubectl get pod -n kube-system | grep metrics-server
4.5.5 Kuboard
Kuboard github
#kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
wget https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
vi kuboard-v3-swr.yaml
#========start=======
#KUBOARD_SERVER_NODE_PORT: '30080'
KUBOARD_ENDPOINT: http://kuboard-v
#=======end========
kubectl apply -f kuboard-v3-swr.yamlwatch kubectl get pods -n kuboard#访问 Kuboard
#在浏览器中打开链接 http://your-node-ip-address:30080#输入初始用户名和密码,并登录#用户名: admin
#密码: Kuboard123# 卸载
kubectl delete -f kuboard-v3-swr.yaml
rm -rf /usr/share/kuboard
4.5.6 集群验证
kubectl get po --all-namespaces -owide
相关文章:

kubeadm引导欧拉系统高可用的K8S1.28.X
文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…...

【信息学奥赛】字典的键和值对换
【信息学奥赛】字典的键和值对换 💖The Begin💖点点关注,收藏不迷路💖 输入一个字典,要求将该字典的键和值对换。(注意,字典中有键的值是重复的) 输入: 一行࿰…...

使用Django框架搭建Web应用
文章目录 简介安装Django创建一个Django项目创建一个Django应用编写视图配置URL运行开发服务器总结与拓展数据库集成管理后台表单处理模板引擎安全性 简介 Django 是一款基于 Python 语言的开源 Web 应用框架,采用了 MVC(模型-视图-控制器)设…...
我用Mybatis的方式封装了OLAP查询!
背景 相信做数据平台的朋友对OLAP并不陌生,主流的OLAP引擎有Clickhouse,Impala,Starrocks…以及公司二开的OLAP平台,本次要说的OLAP属于最后一种。 最近在做一个BI项目,业务背景很简单,就是一个数据展示平…...
golang rune类型解析,与byte,string对比,以及应用
Golang中的rune类型是一个32位的整数类型(int32),它是用来表示Unicode码点的。rune类型的值可以是任何合法的Unicode码点,它通常用来处理字符串中的单个字符。 在Golang中,字符常量使用单引号来表示,例如 a。使用单引号表示的字符…...

重学java 51.Collections集合工具类、泛型
"我已不在地坛,地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…...

多语言印度红绿灯系统源码带三级分销代理功能
前端为2套UI,一套是html写的,一套是编译后的前端 后台功能很完善,带预设、首充返佣、三级分销机制、代理功能。 东西很简单,首页就是红绿灯的下注页面,玩法虽然单一,好在不残缺可以正常跑。...
HTML拆分与共享方式——多HTML组合技术
作者:私语茶馆 1.应用场景 如果是一个产品级的Web项目,往往非常多的页面部分是重复的(为保持风格一致),每个HTML页面将这些重复部分重新写一次,既带来极大的工作量,也造成后续修改不便。 因此会考虑到将一个HTML的不同部分拆分为多个HTML页面,利用类似Include方式包含…...

K8s集群之 存储卷 PV PVC
目录 默写 1 如何将pod创建在指定的Node节点上 2 污点的种类(在node上设置) 一 挂载存储 1 emptyDir存储卷 2 hostPath存储卷 ①在 node01 节点上创建挂载目录 ② 在 node02 节点上创建挂载目录 ③ 创建 Pod 资源 ④ 在master上检测一下:…...

“腾讯云 AI 代码助手”体验
一、“腾讯云 AI 代码助手”体验 1、注册账号并进行实名认证 2、进入开发环境 3、体验javascript简单函数 代码如下: //请写一个两个日期计算的函数 function dateDiff(date1, date2) {return date2.getTime() - date1.getTime(); } var date1 new Date("2…...

Django入门全攻略:从零搭建你的第一个Web项目
系列文章目录 努力ing Django入门全攻略:从零搭建你的第一个Web项目努力ing… 文章目录 系列文章目录前言一、Django1.0 框架介绍1.1 Django安装1.2 Django项目创建1.3 目录介绍 二、子应用2.1 子应用创建2.2 目录结构2.3 子应用注册2.4 子应用视图逻辑2.4.1 编写视…...

AI大模型日报#0529:杨红霞创业入局“端侧模型”、Ilya左膀右臂被Claude团队挖走
导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE 4.0)、“零一万物”(Yi-34B)生成了今日要点以及每条资讯的摘要。欢迎阅读࿰…...
达梦数据库
达梦数据库 达梦Docker部署 达梦Docker部署 1、下载链接 https://pan.baidu.com/s/1RI3Lg0ppRhCgUsThjWV6zQ?pwdjc62 2、docker启动命令 docker run -d -p 5236:5236 \ --restartalways \ --name dm8 \ -e LD_LIBRARY_PATH/app/dm8/bin \ -e LENGTH_IN_CHAR1 \ -e CASE_SENS…...
什么是Axios
2024年5月23日,周四上午 Axios 是一个基于Promise的HTTP客户端,用于浏览器和node.js环境。它提供了一个简单易用的API来发送HTTP请求,并支持Promise API,这使得异步请求变得容易处理。 Axios的一些主要特点包括: Pro…...

React 其他 Hooks
其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext (先回顾一下之前的 Context 知识,借用之前 ppt 和源码) Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…...

echarts配置记录,一些已经废弃的写法
1、normal,4.0以后无需将样式写在normal中了 改前: 改后: DEPRECATED: normal hierarchy in labelLine has been removed since 4.0. All style properties are configured in labelLine directly now. 2、axisLabel中的文字样式无需使用te…...

电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载
电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载地址: 链接:https://pan.baidu.com/s/1vlCtC3LGFMzYpSUUDY-tEg 提取码:8110...
Redis实践记录与总结
最近生产环境缓存数据库数据过大(如何搭建单服务redis缓存数据库?以及可视化工具Another Redis Desktop Manager使用),导致在对数据库做rdb快照备份时消耗内存过大,缓存数据库宕机一小时。基础运维通过增加虚拟机内存暂…...
持续总结中!2024年面试必问 20 道 Rocket MQ面试题(三)
上一篇地址:持续总结中!2024年面试必问 20 道 Rocket MQ面试题(二)-CSDN博客 五、什么是生产者(Producer)和消费者(Consumer)在RocketMQ中? RocketMQ是一个高性能、高吞…...
Android 自定义Adapter关键函数getView性能最优使用
文章目录 1、自定义Adapter关键函数getView()标准写法2、布局文件list_item_user.xml3、解释3、示例使用4、结果5、进一步优化和扩展5.1. **优化性能:ViewHolder模式**5.2. **处理多种类型的视图**5.3. **使用RecyclerView.Adapter** 6、RecyclerView使用示例7、结果…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...