《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(一主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大概时间有10s多,这个时间太长了,尝试了各种办法,都解决不了,后面尝试安装了了1.26.15版本就没这个问题,很神奇,希望这个问题能帮到一些朋友,如果你也有遇到这个问题并有解决方案,可以告诉我,本人不胜感激!!!

2、此外在安装K8S1.26.15版本后,安装完calico v3.26.4后,测试dns,无法ping通百度,将control-plane节点和worker节点主机进行重启,就可以ping通,虽然重启解决了,但是不明白为什么?如果你能知道,并告知我,本人将非常感谢!


一、架构图

如下图所示:
在这里插入图片描述


二、环境信息

基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15集群资源合集
在这里插入图片描述


2、部署规划

主机名 K8S版本 系统版本 CPU架构 内核版本I IP地址 备注
k8s-master-28 1.26.15 Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.28 control-plane节点+etcd节点
k8s-worker-42 1.26.15 Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.42 worker节点
k8s-worker-67 1.26.15 Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.67 worker节点

3、集群网段

宿主机 集群Pod网段 集群Service网段
172.18.1.0/24 10.48.0.0/16 10.96.0.0/16

4、基础软件版本

软件 版本 安装方式
kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy 1.26.15 容器镜像
kubeadm、kubectl、kubelet 1.26.15 二进制
etcd v3.5.10 二进制
coredns v1.9.3 容器镜像
calico v3.26.4 容器镜像
pause 3.9 容器镜像
cri-containerd-cni 1.7.2 二进制
ipvsadm 1.29 yum
ipset 7.3 yum
conntrack 1.4.4 yum
socat 1.7.3.2 yum
ebtables 2.0.10 yum
sysstat 12.1.6 yum
cfssljson 1.6.5 二进制
cfssl 1.6.5 二进制
cfssl-certinfo 1.6.5 二进制

说明
1、cri-containerd-cni包包含containerd、runc、cni打工插件。安装containerd,需要同时安装runc及cni网络插件。 containerd不能直接操作容器,需要通过runc来运行容器。默认Containerd管理的容器仅有lo网络(无法访问容器之外的网络), 如果需要访问容器之外的网络则需要安装CNI网络插件。CNI(Container Network Interface) 是一套容器网络接口规范,用于为容器分配ip地址,通过CNI插件Containerd管理的容器可以访问容器之外的网络。

2、ipvsadm:这是一个用于管理Linux内核中的IP虚拟服务器(IPVS)的工具。它允许您配置和管理负载均衡、网络地址转换(NAT)和透明代理等功能。

3、ipset:这是一个用于管理Linux内核中的IP集合的工具。它允许您创建和管理IP地址、IP地址范围和端口号的集合,以便在防火墙规则中使用。

4、conntrack:这是一个用于连接跟踪的内核模块和工具。它允许您跟踪网络连接的状态和信息,如源IP地址、目标IP地址、端口号等。

5、socat(网络工具):这是一个用于在Linux系统中建立各种类型网络连接的工具。在Kubernetes网络中,socat可以 用于创建端口转发、代理和转发等网络连接。

6、ebtables(以太网桥规则管理工具):这是一个用于在Linux系统中管理以太网桥规则的工具。在Kubernetes中,ebtables 用于在网络分区中实现容器之间的隔离和通信。

7、sysstat:这是一个用于系统性能监控和报告的工具集。它包括一些实用程序,如sar、iostat和mpstat,用于收集和显示系统资源使用情况的统计信息。


5、K8S镜像

K8S镜像 calico镜像
registry.k8s.io/kube-apiserver:v1.26.15 docker.io/calico/cni:v3.26.4
registry.k8s.io/kube-controller-manager:v1.26.15 docker.io/calico/kube-controllers:v3.26.4
registry.k8s.io/kube-scheduler:v1.26.15 docker.io/calico/node:v3.26.4
registry.k8s.io/kube-proxy:v1.26.15 -
registry.k8s.io/pause:3.9 -
registry.k8s.io/coredns/coredns:v1.9.3 -

6、k8s版本与calico版本对应关系

calico版本 calico yml文件下载 支持K8S版本
v3.24.x calico.yml v1.22、v1.23、v1.24、v1.25
v3.25.x calico.yml v1.23、v1.24、v1.25、v1.26、v1.27、v1.28
v3.26.x calico.yml v1.24、v1.25、v1.26、v1.27、v1.28
v3.27.x calico.yml v1.27、v1.28、v1.29

三、安装和配置先决条件

3.1、设置主机名

说明:分别在对应的节点IP上设置主机名。

[root@ecs-90c2-0001 ~]# hostnamectl set-hostname k8s-master-28 && bash
[root@ecs-90c2-0002 ~]# hostnamectl set-hostname k8s-worker-42 && bash
[root@ecs-90c2-0003 ~]# hostnamectl set-hostname k8s-worker-67 && bash

3.2、配置主机hosts

说明:以下操作无论是control-plane节点和worker节点均需要执行。

[root@k8s-master-28 ~]# cat >> /etc/hosts <<EOF
172.18.1.28 k8s-master-28
172.18.1.42 k8s-worker-42
172.18.1.67 k8s-worker-67
EOF

3.3、关闭防火墙

说明:以下操作无论是control-plane节点和worker节点均需要执行。

[root@k8s-master-28 ~]# systemctl stop firewalld && systemctl disable firewalld

3.4、设置ulimit

说明:以下操作无论是control-plane节点和worker节点均需要执行。

1、检查ulimit

[root@k8s-master-28 ~]# ulimit -SHn 65535
[root@k8s-master-28 ~]# ulimit -a

2、设置ulimit, 如果已经设置,则忽略,如果未设置请按照如下要求设置。

[root@k8s-master-28 ~]# vim /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
root soft nproc 65535
root hard nproc 65535
* soft nproc 65535
* hard nproc 65535

3.5、关闭selinux

说明:以下操作无论是control-plane节点和worker节点均需要执行。

# 1、临时关闭
[root@k8s-master-28 ~]# setenforce 0
# 2、永久关闭,需重启服务器
[root@k8s-master-28 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
[root@k8s-master-28 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux

3.6、关闭swap分区

说明:以下操作无论是control-plane节点和worker节点均需要执行。

[root@k8s-master-28 ~]# swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab

3.7、时间时区同步

说明:以下操作无论是control-plane节点和worker节点均需要执行。

1、设置时区为Asia/Shanghai,如果已经是则请忽略

# 以 root 用户运行以下命令可以修改当前时区,如修改为上海
[root@k8s-master-28 ~]# timedatectl set-timezone Asia/Shanghai
# 显示当前时区
[root@k8s-master-28 ~]# timedatectl show
Timezone=Asia/Shanghai

2、设置时间与北京时间同步,如果已经是则请忽略



3.8、修改内核参数

说明:以下操作无论是control-plane节点和worker节点均需要执行。

1、创建名为/etc/modules-load.d/containerd.conf 的文件,并且将 overlay和br_netfilter写入。这两个模块overlay 和br_netfilter是containerd运行所需的内核模块

[root@k8s-master-28 ~]# modprobe overlay
[root@k8s-master-28 ~]# modprobe br_netfilter
[root@k8s-master-28 ~]# cat <<EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# 通过运行以下指令确认br_netfilter和overlay模块被加载
[root@k8s-master-28 ~]# lsmod | grep br_netfilter
[root@k8s-master-28 ~]# lsmod | grep overlay

2、设置 必须的内核参数,包括网络转发、桥接网络 、IPv6 数据包的iptables过滤功能

[root@k8s-master-28 ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 开启ip_forward
[root@k8s-master-28 ~]# sed -i 's/net.ipv4.ip_forward=0/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
# 应用sysctl参数而不重新启动
[root@k8s-master-28 ~]# sysctl --system

3.9、启用IPVS模式

说明:以下操作无论是control-plane节点和worker节点均需要执行。

1、安装IPVS工具及依赖

[root@k8s-master-28 ~]# yum install ipvsadm ipset sysstat socat conntrack ebtables  -y

2、确保安装了IPVS所需的内核模块(注:对于 Linux 内核 4.19 及更高版本,请使用 nf_conntrack 代替 nf_conntrack_ipv4)。

[root@k8s-master-28 ~]# uname -r
4.19.90-17.5.ky10.aarch64[root@k8s-master-28 ~]# cat > /etc/profile.d/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
[root@k8s-master-28 ~]# chmod 755 /etc/profile.d/ipvs.modules && bash /etc/profile.d/ipvs.modules
[root@k8s-master-28 ~]# lsmod | grep -e ip_vs -e nf_conntrack

四、安装etcd

说明:以下操作无论只需在etcd节点执行,即k8s-master-28节点。

4.1、生成etcd相关证书

说明:手动创建证书比较麻烦,这里采用了etcd证书一键生成工具来创建etcd相关证书。

1、编辑env.conf文件

[root@k8s-master-28 etcd_ssl]# cat env.conf 
# cfssl生成证书过程日志打印级别<0:调试 1:信息 2:警告 3:错误 4:严重>
export loglevel="3"# etcd集群所有主机ip地址和主机名,<建议多写几个ip,方便后期扩容>,ip地址之间必须使用逗号分隔
export etcd_hostname_list="127.0.0.1,k8s-master-28,172.18.1.28"

2、生成证书

[root@k8s-master-28 etcd_ssl]# ./op.sh build

执行结果如下图所示:
在这里插入图片描述

3、创建证书目录并拷贝证书

[root@k8s-master-28 etcd_ssl]# cd etcd
[root@k8s-master-28 etcd]# mkdir -p /etc/kubernetes/pki/etcd
[root@k8s-master-28 etcd]# cp apiserver-etcd-client-key.pem apiserver-etcd-client.pem /etc/kubernetes/pki/
[root@k8s-master-28 etcd]# cp ca-key.pem ca.pem  /etc/kubernetes/pki/etcd/
[root@k8s-master-28 etcd]# cp healthcheck-client.pem healthcheck-client-key.pem /etc/kubernetes/pki/etcd/
[root@k8s-master-28 etcd]# cp server.pem server-key.pem /etc/kubernetes/pki/etcd/
[root@k8s-master-28 etcd]# cp peer.pem peer-key.pem /etc/kubernetes/pki/etcd/

证书路径,如下图所示:
在这里插入图片描述


4.2、下载etcd二进制安装包

wget https://github.com/etcd-io/etcd/releases/download/v3.5.10/etcd-v3.5.10-linux-arm64.tar.gz
tar axf etcd-v3.5.10-linux-arm64.tar.gz
mv etcd-v3.5.10-linux-arm64/etcd* /usr/bin/

4.3、创建Service文件

[root@k8s-master-28 ~]# vim /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos[Service]
Type=notify
WorkingDirectory=/var/lib/etcd
ExecStart=/usr/bin/etcd \--name=k8s-master-28 \--cert-file=/etc/kubernetes/pki/etcd/server.pem \--key-file=/etc/kubernetes/pki/etcd/server-key.pem \--peer-cert-file=/etc/kubernetes/pki/etcd/peer.pem \--peer-key-file=/etc/kubernetes/pki/etcd/peer-key.pem \--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.pem \--peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.pem \--initial-advertise-peer-urls=https://172.18.1.28:2380 \--listen-peer-urls=https://172.18.1.28:2380 \--listen-client-urls=https://172.18.1.28:2379,http://127.0.0.1:2379 \--advertise-client-urls=https://172.18.1.28:2379 \--initial-cluster-token=etcd-cluster \--initial-cluster="k8s-master-28=https://172.18.1.28:2380" \--initial-cluster-state=new \--data-dir=/var/lib/etcd \--wal-dir="" \--snapshot-count=50000 \--auto-compaction-retention=1 \--auto-compaction-mode=periodic \--max-request-bytes=10485760 \--quota-backend-bytes=8589934592Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999[Install]
WantedBy=multi-user.target

4.4、启动etcd服务

mkdir /var/lib/etcd && chmod 700 /var/lib/etcd
systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd

4.5、检查etcd状态

etcdctl --endpoints="https://172.18.1.28:2379" \
--cacert /etc/kubernetes/pki/etcd/ca.pem --cert /etc/kubernetes/pki/etcd/peer.pem \
--key  /etc/kubernetes/pki/etcd/peer-key.pem endpoint healthetcdctl --endpoints="https://172.18.1.28:2379" \
--cacert /etc/kubernetes/pki/etcd/ca.pem --cert /etc/kubernetes/pki/etcd/peer.pem \
--key  /etc/kubernetes/pki/etcd/peer-key.pem endpoint status --write-out table

4.6、etcd集群备份

说明:备份etcd集群可以通过两种方式完成:etcd内置快照和卷快照。

参考:《Kubernetes备份篇:etcd集群数据备份与恢复》


五、安装containerd容器引擎

说明:以下操作无论是control-plane节点和worker节点均需要执行。

1、升级libseccomp

说明:经过多次试验,安装k8s1.26.15版本时,如果libseccomp版本为2.4.1,则会报错unable to retrieve OCI runtime error。

[root@k8s-master-28 ~]# rpm -qa | grep libseccomp
libseccomp-2.4.1-3.ky10.aarch64
[root@k8s-master-28 ~]# rpm -e `rpm -qa | grep libseccomp` --nodeps
[root@k8s-master-28 ~]# yum install gperf -y
[root@k8s-master-28 ~]# wget https://github.com/seccomp/libseccomp/releases/download/v2.5.4/libseccomp-2.5.4.tar.gz
[root@k8s-master-28 ~]# tar axf libseccomp-2.5.4.tar.gz && cd libseccomp-2.5.4
[root@k8s-master-28 ~]# ./configure && make && make install
[root@k8s-master-28 libseccomp-2.5.4]# find / -name libseccomp.so.2
/usr/local/lib/libseccomp.so.2
/root/libseccomp-2.5.4/src/.libs/libseccomp.so.2
[root@k8s-master-28 ~]# ln -s /usr/local/lib/libseccomp.so.2 /usr/lib64/libseccomp.so.2

2、安装软件包

[root@k8s-master-28 ~]# wget https://github.com/containerd/containerd/releases/download/v1.7.2/cri-containerd-cni-1.7.2-linux-arm64.tar.gz
[root@k8s-master-28 ~]# tar axf cri-containerd-cni-1.7.2-linux-arm64.tar.gz -C /

3、修改配置文件

[root@k8s-master-28 ~]# mkdir -p /etc/containerd&& containerd config default > /etc/containerd/config.toml
[root@k8s-master-28 ~]# sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
[root@k8s-master-28 ~]# sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"#g' /etc/containerd/config.toml

4、网络插件CNI配置文件

[root@k8s-master-28 ~]#  rm -f /etc/cni/net.d/10-containerd-net.conflist 
[root@k8s-master-28 ~]#  cat <<EOF | sudo tee /etc/cni/net.d/cni-default.conf 
{"name": "mynet","cniVersion": "0.3.1","type": "bridge","bridge": "mynet0","isDefaultGateway": true,"ipMasq": true,"hairpinMode": true,"ipam": {"type": "host-local","subnet": "10.48.0.0/16"}
}
EOF

5、重启containerd服务并设置开机自启

[root@k8s-master-28 ~]# systemctl daemon-reload && systemctl restart containerd && systemctl enable containerd

如下图所示:
在这里插入图片描述


六、安装kubelet、kubeadm和kubectl

说明:以下操作无论是control-plane节点和worker节点均需要执行。

6.1、方法一(yum源)

1、编辑镜像源文件,加入阿里云k8s镜像源配置

[root@k8s-master-28 ~]# cat <<EOF | sudo tee  /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2、安装指定版本

[root@k8s-master-28 ~]# yum --showduplicates list kubeadm kubectl kubelet
[root@k8s-master-28 ~]# yum install -y kubelet-1.26.9 kubeadm-1.26.9 kubectl-1.26.9

3、设置kubectl开机自启

[root@k8s-master-28 ~]# systemctl enable kubelet

注意:由于在Kylin Linux Advanced Server V10系统的kubernetes源中,使用yum最高只能安装1.26大版本中的1.26.9小版本,但是我安装的是1.26.15版本,所以当前环境中未采用此方法。


6.2、方法二(二进制)

说明:以下操作无论是control-plane节点和worker节点均需要执行。

1、准备kubeadm、kubelet、kubectl二进制文件

# 方法一
wget -P /usr/bin/ https://dl.k8s.io/v1.26.15/bin/linux/arm64/kubeadm
wget -P /usr/bin/ https://dl.k8s.io/v1.26.15/bin/linux/arm64/kubelet
wget -P /usr/bin/ https://dl.k8s.io/v1.26.15/bin/linux/arm64/kubectl
# 方法二
wget https://dl.k8s.io/v1.26.15/kubernetes-client-linux-arm64.tar.gz
tar axf kubernetes-client-linux-arm64.tar.gz
cp kubernetes/node/bin/{kubeadm,kubelet,kubectl}  /usr/bin

2、准备kubelet.service文件

wget https://raw.githubusercontent.com/kubernetes/release/v0.4.0/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service
cp kubelet.service /usr/lib/systemd/system/kubelet.service

3、准备10-kubeadm.conf文件

wget https://raw.githubusercontent.com/kubernetes/release/v0.4.0/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf
mkdir -p /usr/lib/systemd/system/kubelet.service.d
cp 10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

4、设置kubectl开机自启

systemctl enable kubelet

七、k8s镜像下载

说明:以下操作无论是control-plane节点和worker节点均需要执行。

1、查看镜像

[root@k8s-master-28 ~]# kubeadm config images list --kubernetes-version=v1.26.15
registry.k8s.io/kube-apiserver:v1.26.15
registry.k8s.io/kube-controller-manager:v1.26.15
registry.k8s.io/kube-scheduler:v1.26.15
registry.k8s.io/kube-proxy:v1.26.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.10-0
registry.k8s.io/coredns/coredns:v1.9.3

2、下载镜像

#!/bin/bash
k8s_version=v1.26.15
pause_version=3.9
etcd_version=3.5.10-0
coredns_version=v1.9.3
registry_address=registry.cn-hangzhou.aliyuncs.com/google_containers
ctr -n k8s.io image pull --platform linux/arm64 ${registry_address}/kube-apiserver:${k8s_version}
ctr -n k8s.io image pull --platform linux/arm64 ${registry_address}/kube-controller-manager:${k8s_version}
ctr -n k8s.io image pull --platform linux/arm64 ${registry_address}/kube-scheduler:${k8s_version}
ctr -n k8s.io image pull --platform linux/arm64 ${registry_address}/kube-proxy:${k8s_version}
ctr -n k8s.io image pull --platform linux/arm64 ${registry_address}/pause:${pause_version}
ctr -n k8s.io image pull --platform linux/arm64 ${registry_address}/etcd:${etcd_version}
ctr -n k8s.io image pull --platform linux/arm64 ${registry_address}/coredns:${coredns_version}

3、导出镜像

#!/bin/bash
k8s_version=v1.26.15
pause_version=3.9
etcd_version=3.5.10-0
coredns_version=v1.9.3
registry_address=registry.cn-hangzhou.aliyuncs.com/google_containers
ctr -n k8s.io image export --platform linux/arm64 \
kube-apiserver-${k8s_version}.tar.gz ${registry_address}/kube-apiserver:${k8s_version}
ctr -n k8s.io image export --platform linux/arm64 \
kube-controller-manager-${k8s_version}.tar.gz ${registry_address}/kube-controller-manager:${k8s_version}
ctr -n k8s.io image export --platform linux/arm64 \
kube-scheduler-${k8s_version}.tar.gz ${registry_address}/kube-scheduler:${k8s_version}
ctr -n k8s.io image export --platform linux/arm64 \
kube-proxy-${k8s_version}.tar.gz ${registry_address}/kube-proxy:${k8s_version}
ctr -n k8s.io image export --platform linux/arm64 \
pause-${pause_version}.tar.gz ${registry_address}/pause:${pause_version}
ctr -n k8s.io image export --platform linux/arm64 \
etcd-${etcd_version}.tar.gz ${registry_address}/etcd:${etcd_version}
ctr -n k8s.io image export --platform linux/arm64 \
coredns-${coredns_version}.tar.gz ${registry_address}/coredns:${coredns_version}

4、导入镜像

#!/bin/bash
k8s_version=v1.26.15
pause_version=3.9
etcd_version=3.5.10-0
coredns_version=v1.9.3
ctr -n k8s.io image import --platform linux/arm64 pause-${pause_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 kube-apiserver-${k8s_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 kube-controller-manager-${k8s_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 kube-scheduler-${k8s_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 kube-proxy-${k8s_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 etcd-${etcd_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 coredns-${coredns_version}.tar.gz

说明:由于网络问题,国内服务器无法访问registry.k8s.io镜像仓库地址,建议使用国内阿里云的镜像仓库下载k8s镜像。如果你的是专网环境,请找一台能访问阿里云镜像仓库的服务器下载然后打包成tar.gz格式,上传到要部署的专网服务器,通过ctr image import命令导入镜像即可。


八、calico镜像及yaml文件下载

calico 3.26版本对应K8S版本,如下图所示:

# 支持系统
RedHat Linux 7
CentOS 7
Flatcar Container Linux
Fedora CoreOS
Ubuntu 18.04
Debian 8
# 支持k8s版本
v1.24
v1.25
v1.26
v1.27
v1.28

1、calico.yml文件下载

说明:以下操作只需要在control-plane节点执行。

[root@k8s-master-28 ~]#  wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml
[root@k8s-master-28 ~]#  grep "image:" calico.yaml | uniq -c2           image: docker.io/calico/cni:v3.26.42           image: docker.io/calico/node:v3.26.41           image: docker.io/calico/kube-controllers:v3.26.4

2、镜像下载

说明:以下操作无论是control-plane节点和worker节点均需要执行。

#!/bin/bash
calico_version=v3.26.4
ctr -n k8s.io image pull --platform linux/arm64 docker.io/calico/cni:${calico_version}
ctr -n k8s.io image pull --platform linux/arm64 docker.io/calico/node:${calico_version}
ctr -n k8s.io image pull --platform linux/arm64 docker.io/calico/kube-controllers:${calico_version}

3、镜像导出

#!/bin/bash
calico_version=v3.26.4
ctr -n k8s.io image export --platform linux/arm64 \
calico-cni-${calico_version}.tar.gz docker.io/calico/cni:${calico_version}
ctr -n k8s.io image export --platform linux/arm64 \
calico-node-${calico_version}.tar.gz docker.io/calico/node:${calico_version}
ctr -n k8s.io image export --platform linux/arm64 \
calico-kube-controllers-${calico_version}.tar.gz docker.io/calico/kube-controllers:${calico_version}

4、镜像导入

#!/bin/bash
calico_version=v3.26.4
ctr -n k8s.io image import --platform linux/arm64 calico-cni-${calico_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 calico-node-${calico_version}.tar.gz
ctr -n k8s.io image import --platform linux/arm64 calico-kube-controllers-${calico_version}.tar.gz

九、安装control-plane节点

9.1、control-plane节点初始化集群

说明:以下操作只需要在control-plane节点执行。

1、生成默认kubeadm初始化config文件

[root@k8s-master-28 ~]# kubeadm config print init-defaults > kubeadm-config.yaml

2、修改kubeadm默认config文件

[root@k8s-master-28 ~]# vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: "172.18.1.28"bindPort: 6443
nodeRegistration:criSocket: unix:///run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-master-28taints:- effect: NoSchedulekey: node-role.kubernetes.io/master- effect: NoSchedulekey: node-role.kubernetes.io/control-plane
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.26.15
controlPlaneEndpoint: "172.18.1.28:6443"
networking:dnsDomain: cluster.localpodSubnet: 10.48.0.0/16serviceSubnet: 10.96.0.0/16
etcd:external:endpoints:- https://172.18.1.28:2379caFile: /etc/kubernetes/pki/etcd/ca.pem # 连接etcd所需证书certFile: /etc/kubernetes/pki/apiserver-etcd-client.pemkeyFile: /etc/kubernetes/pki/apiserver-etcd-client-key.pem
imageRepository: "registry.cn-hangzhou.aliyuncs.com/google_containers"
apiServer:extraArgs:service-node-port-range: 30000-36000
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

3、使用kubeadm init初始化集群

[root@k8s-master-28 ~]# kubeadm init --config=kubeadm-config.yaml

执行结果,如下图所示:
在这里插入图片描述

4、对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理

[root@k8s-master-28 ~]#  mkdir -p $HOME/.kube
[root@k8s-master-28 ~]#  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master-28 ~]#  sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master-28 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master-28 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
[root@k8s-master-28 ~]# source /etc/profile

9.2、启动kubectl自动补全功能

说明:以下操作只需要在control-plane节点执行。

[root@k8s-master-28 ~]# yum install bash-completion -y
[root@k8s-master-28 ~]# source /usr/share/bash-completion/bash_completion
[root@k8s-master-28 ~]# echo 'source <(kubectl completion bash)' >>~/.bashrc
[root@k8s-master-28 ~]# source ~/.bashrc

十、安装worker节点

10.1、方法一

说明:以下操作在所有worker节点执行。

1、将worker节点加入k8s集群

#注意:kubeamd join命令的token只有24h,24h就过期,需要执行kubeadm token create --print-join-command重新生成。
kubeadm join 172.18.1.28:6443 --token 10lcf0.sw61lxyrnhpqpa98 \--discovery-token-ca-cert-hash sha256:e00937963435faeb4e9cd9863c8298f499f20125ceca2bc345b6b3824be4d321 

如下图所示:
在这里插入图片描述


10.2、方法二

1、k8s-worker-42节点准备kubeadm-join-node.yml配置文件
说明:以下操作仅在k8s-worker-42节点执行。

[root@k8s-worker-42 ~]# vim kubeadm-join-node.yml 
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:bootstrapToken:apiServerEndpoint: "172.18.1.28:6443"token: 10lcf0.sw61lxyrnhpqpa98 caCertHashes:- sha256:e00937963435faeb4e9cd9863c8298f499f20125ceca2bc345b6b3824be4d321unsafeSkipCAVerification: truetimeout: 4m0stlsBootstrapToken: 10lcf0.sw61lxyrnhpqpa98
nodeRegistration:criSocket: unix:///run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-worker-42  # 如果有其它worker节点加入集群,只需将name字段的值修改为当前主机的主机名,其它内容不变taints: []

2、k8s-worker-67节点准备kubeadm-join-node.yml配置文件
说明:以下操作仅在k8s-worker-67节点执行。

[root@k8s-worker-67 ~]# vim kubeadm-join-node.yml 
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:bootstrapToken:apiServerEndpoint: "172.18.1.28:6443"token: 10lcf0.sw61lxyrnhpqpa98 caCertHashes:- sha256:e00937963435faeb4e9cd9863c8298f499f20125ceca2bc345b6b3824be4d321unsafeSkipCAVerification: truetimeout: 4m0stlsBootstrapToken: 10lcf0.sw61lxyrnhpqpa98
nodeRegistration:criSocket: unix:///run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-worker-67  # 如果有其它worker节点加入集群,只需将name字段的值修改为当前主机的主机名,其它内容不变taints: []

注意:token、caCertHashes、tlsBootstrapToken的值在初始化k8s-master-28后就可以获取。

3、执行kubeadm-join-node.yml文件

说明:以下操作在所有worker节点执行。

kubeadm join --config=kubeadm-join-node.yml

十一、部署calico网络插件

说明:以下操作只需要在control-plane节点执行。

1、修改calico.yaml文件,增加IP_AUTODETECTION_METHOD字段

            - name: CALICO_NETWORKING_BACKENDvalueFrom:configMapKeyRef:name: calico-configkey: calico_backend- name: IP_AUTODETECTION_METHOD     # 增加内容value: can-reach=172.18.1.28      # 增加内容# Cluster type to identify the deployment type- name: CLUSTER_TYPEvalue: "k8s,bgp"

说明:官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-node mesh 。我们可以修改成 can-reach 或者 interface 的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。

2、修改calico.yaml文件,修改CALICO_IPV4POOL_CIDR字段

            # The default IPv4 pool to create on startup if none exists. Pod IPs will be# chosen from this range. Changing this value after installation will have# no effect. This should fall within `--cluster-cidr`.- name: CALICO_IPV4POOL_CIDRvalue: "10.48.0.0/16"

3、执行calico.yaml文件

[root@k8s-master-28 ~]# kubectl apply -f calico.yaml 

4、部署完成后,等待一段时间,重启服务器

说明:以下操作无论是control-plane节点和worker节点均需要执行。

[root@k8s-master-28 ~]# reboot

注意:经测试,部署完成后等待一段时间calico日志恢复正常,然后需重启服务器,否则会出现在pod中无法ping通百度。


十二、K8S集群测试

12.1、检查集群状态

说明:以下操作只需要在control-plane节点执行。

kubectl get nodes -o wide
kubectl get cs
kubectl get pods -A -o wide
kubectl get svc -A  -o wide

如下图所示:
在这里插入图片描述


12.2、DNS测试

说明:以下操作只需要在control-plane节点执行。

[root@k8s-master-28 ~]# kubectl run busybox --image busybox:1.34 --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter./ # cat /etc/resolv.conf 
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10/ # nslookup default.svc.cluster.local
Server:         10.96.0.10
Address:        10.96.0.10:53/ # ping www.baidu.com
PING www.baidu.com (183.2.172.185): 56 data bytes
64 bytes from 183.2.172.185: seq=0 ttl=50 time=4.510 ms
64 bytes from 183.2.172.185: seq=1 ttl=50 time=4.346 ms

注意:如果部署完之后发现无法解析kubernetes.default和ping通百度网站,可以尝试重启K8S集群节点所有节点主机。


12.3、功能性测试

说明:以下操作只需要在control-plane节点执行。

1、部署一个简单的Nginx服务(必须)

vim nginx.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentports:- name: httpprotocol: TCPcontainerPort: 80resources:limits:cpu: "1.0"memory: 512Mirequests:cpu: "0.5"memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:annotations:name: nginx-test-service
spec:ports:- port: 80targetPort: 80nodePort: 32001protocol: TCPselector:app: nginxsessionAffinity: Nonetype: NodePort

2、测试Nginx服务是否正常,如下所示:
在这里插入图片描述


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/313133.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SnapGene Mac激活版 分子生物学软件

SnapGene Mac是一款功能全面、操作便捷的综合性分子生物学软件&#xff0c;专为Mac用户打造。它集成了DNA序列编辑、分析、可视化和团队协作等多种功能&#xff0c;为科研人员提供了一个高效、可靠的分子生物学研究工具。 SnapGene Mac激活版下载 在SnapGene Mac中&#xff0c;…

java八股文知识点讲解(个人认为讲的比较好的)

1、解决哈希冲突——链地址法&#xff1a;【第7章查找】19哈希表的查找_链地址法解决哈希冲突_哔哩哔哩_bilibili 2、解决哈希冲突——开放地址法 &#xff1a; 【第7章查找】18哈希表的查找_开放定址法解决哈希冲突_哔哩哔哩_bilibili 3、小根堆大根堆的创建&#xff1a;选择…

夸克AI PPT初体验:一键生成大纲,一键生成PPT,一键更换模板!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

免费的 ChatGPT、GPTs、AI绘画(国内版)

&#x1f525;博客主页&#xff1a;白云如幻❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识&#x1f917; 以下内容来自于李宏…

OpenCV从入门到精通实战(六)——多目标追踪

基于原生的追踪 使用OpenCV库实现基于视频的对象追踪。通过以下步骤和Python代码&#xff0c;您将能够选择不同的追踪器&#xff0c;并对视频中的对象进行实时追踪。 步骤 1: 导入必要的库 首先&#xff0c;我们需要导入一些必要的Python库&#xff0c;包括argparse、time、…

Java web应用性能分析之客户端慢

客户端慢的原因包括&#xff1a; 终端设备老化&#xff08;手机、PAD、电脑年限久远、运行期间产生了很多垃圾未清除&#xff09;终端网络设备老化&#xff08;路由器、交换机老化&#xff09;跟我们使用的手机一样&#xff0c;路由器也需要及时更新换代&#xff0c;否则硬件跟…

Word学习笔记之奇偶页的页眉与页码设置

1. 常用格式 在毕业论文中&#xff0c;往往有一下要求&#xff1a; 奇数页右下角显示、偶数页左下角显示奇数页眉为每章标题、偶数页眉为论文标题 2. 问题解决 2.1 前期准备 首先&#xff0c;不论时要求 1、还是要求 2&#xff0c;这里我们都要做一下设置&#xff1a; 鼠…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题&#xff0c;包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

飞行机器人专栏(十四)-- Kinect DK 人体骨骼点运动提取方法

系列文章目录 Ubuntu 18.04/20.04 CV环境配置&#xff08;下&#xff09;--手势识别TRTposeKinect DK人体骨骼识别_ubuntu kinect骨骼测试-CSDN博客文章浏览阅读1.3k次。trt_pose_ros kinect实现手势识别和人体骨骼识别&#xff0c;用于机器人运动控制参考_ubuntu kinect骨骼测…

mybatis进阶篇-执行CRUD操作-typeAliases别名-接口绑定

目录结构 1.创建数据表&#xff08;book&#xff09; # 创建book表 create table book(id int auto_increment primary key,name varchar(255) ,price double ,num int );2.mybatis.xml配置文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOC…

C++教你如何模拟实现string,如何实现string写时拷贝

文章目录 前言成员变量默认成员函数默认构造函数拷贝构造函数析构函数赋值运算符重载 容量相关函数&#xff08;Capacity&#xff09;reserve函数resize函数size函数capacity 函数clear函数 修改函数&#xff08;Modifiers&#xff09;swap函数insert函数字符插入字符串插入 ap…

零基础小白,如何入门计算机视觉?

目录 前言 计算机视觉技术学习路线 基础知识 1. 数学基础 2. 编程基础 3. 图像处理基础 基础算法与技术 1. 特征提取与描述符 2. 图像分割与对象检测 3. 三维重建与立体视觉 机器学习与深度学习 1. 机器学习基础 2. 深度学习 高级主题与应用 1. 高级机器学习与深度学习 2. 计算…

基于docker的Jenkin的服务平台搭建

项目拓扑图 项目环境: jenkins-2.440 sonarqube-9.9.4 apache-maven-3.9.6 gitlab-ce-12.4.2 java17 docker20 harbor.v2.6.0 centos7.9 项目目的: 模拟企业构建一个流行的持续集成和持续部署环境,可以更轻松地创建和管理构建环境&#xff0c;实现自动化构建和部署应用程序的…

读天才与算法:人脑与AI的数学思维笔记03_AlphaGo

1. 国际象棋 1.1. 1997年计算机“深蓝”&#xff08;Deep Blue&#xff09;击败了顶尖国际象棋手&#xff0c;但机器取代数学研究机构还言之尚早 1.2. 下国际象棋与数学的形式化证明颇有相似之处&#xff0c;但学者认为中国围棋的思维方式更能够体现数学家思考的创造性和直觉…

使用lambda表达式Collectors.toMap 遇到的报错,带有源码分析

概述 正常hashMap中的key和value都允许为null&#xff0c;但是在list转map中&#xff0c;使用lambda表达式要求key和value都不能为null。这很反常识 起因 本身上游返回contentId和traceId 内容id和跟踪id&#xff0c;但是项目人员变动修改了接口没有给traceId导致 代码 pu…

kafka---topic详解

一、分区与高可用 在Kafka中,事件(events 事件即消息)是以topic的形式进行组织的;同时topic是分区(partitioned)的,这意味着一个topic分布在Kafka broker上的多个“存储桶”(buckets)上。这种数据的分布式放置对于可伸缩性非常重要,因为它允许客户端应用程序同时从多个…

MySQL Explan执行计划详解

Explan执行计划 首先我们采用explan执行计划 执行一条sql&#xff0c;发现返回了12个列&#xff0c;下面会详细解释每一列 1、ID列 id列的值是代表了select语句执行顺序&#xff0c;是和select相关联的&#xff1b;id列的值大的会优先执行&#xff0c;如果id列为空最后执行&a…

【数据挖掘】实验8:分类与预测建模

实验8&#xff1a;分类与预测建模 一&#xff1a;实验目的与要求 1&#xff1a;学习和掌握回归分析、决策树、人工神经网络、KNN算法、朴素贝叶斯分类等机器学习算法在R语言中的应用。 2&#xff1a;了解其他分类与预测算法函数。 3&#xff1a;学习和掌握分类与预测算法的评…

大数据------JavaWeb------JDBC(完整知识点汇总)

JDBC 定义 全称为Java数据库连接&#xff08;Java DataBase Connectivity&#xff09;&#xff1a;是使用java语句来操作所有关系型数据库的一套API JDBC本质 它是官方定义的一套操作所有关系型数据库的规则&#xff08;即接口&#xff09;&#xff0c;各个数据库厂商会去实现…