总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级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集群运维实战