《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使用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-master-42 1.26.15 Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.42 control-plane节点+etcd节点
华为云 k8s-master-134 1.26.15 Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.134 control-plane节点+etcd节点
华为云 k8s-worker-67 1.26.15 Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.67 worker节点
华为云----- 172.18.1.189 vip(虚拟ip)
华为云 k8s-lb-01- Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.97 Nginx + keepalived
华为云 k8s-lb-02- Kylin Linux Advanced Server V10 aarch64 4.19.90-17.5.ky10.aarch64 172.18.1.116 Nginx + keepalived

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-master-42 && bash
[root@ecs-90c2-0003 ~]# hostnamectl set-hostname k8s-master-134 && bash
[root@ecs-90c2-0004 ~]# hostnamectl set-hostname k8s-worker-67 && bash
[root@ecs-90c2-0005 ~]# hostnamectl set-hostname k8s-lb-01 && bash
[root@ecs-90c2-0006 ~]# hostnamectl set-hostname k8s-lb-02 && 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-master-42
172.18.1.134 k8s-master-134
172.18.1.67 k8s-worker-67
EOF

3.3、关闭防火墙

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

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

3.4、设置ulimit

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

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节点、kube-lb节点均需要执行。

# 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节点、kube-lb节点均需要执行。

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

3.7、时间时区同步

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

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集群

4.1、生成etcd集群相关证书

说明:手动创建证书比较麻烦,这里采用了etcd证书一键生成工具来创建etcd相关证书,可以在任意一节点主机上生成etcd集群相关证书, 当前环境默认在k8s-master-28节点上使用工具一键生成etcd证书。然后手动拷贝到证书到其它control-plane节点相同目录上。


1、编辑env.conf文件

说明:以下操作只需在k8s-master-28节点上执行。

[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,k8s-master-42,k8s-master-134,172.18.1.28,172.18.1.42,172.18.1.134"

2、生成证书

说明:以下操作只需在k8s-master-28节点上执行。

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

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


3、创建证书目录

说明:以下操作分别在k8s-master-28、k8s-master-42、k8s-master-134等control-plane节点上执行。

mkdir /etc/kubernetes/pki/etcd -p

4、拷贝证书到相应目录

说明:以下操作只需在k8s-master-28节点上执行。

[root@k8s-master-28 etcd_ssl]# cd etcd
[root@k8s-master-28 etcd]# cp apiserver-etcd-client*.pem /etc/kubernetes/pki/
[root@k8s-master-28 etcd]# cp ca*.pem peer*.pem server*.pem healthcheck-client*.pem /etc/kubernetes/pki/etcd/
[root@k8s-master-28 etcd]# scp apiserver-etcd-client*.pem root@172.18.1.42:/etc/kubernetes/pki/
[root@k8s-master-28 etcd]# scp ca*.pem peer*.pem server*.pem healthcheck-client*.pem root@172.18.1.42:/etc/kubernetes/pki/etcd/
[root@k8s-master-28 etcd]# scp apiserver-etcd-client*.pem root@172.18.1.134:/etc/kubernetes/pki/
[root@k8s-master-28 etcd]# scp ca*.pem peer*.pem server*.pem healthcheck-client*.pem root@172.18.1.134:/etc/kubernetes/pki/etcd/

最终证书文件效果,如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


注意:

1、其中ca-key.pem、ca.pem、apiserver-etcd-client.pem、apiserver-etcd-client-key.pem文件是kube-apiserver连接etcd所需证书。这4个证书文件必须要上传到 所有control-plane节点上,需提前手动创建好证书存放目录。其中ca-key.pem、ca.pem建议目录为/etc/kubernetes/pki/etcd,apiserver-etcd-client.pem、apiserver-etcd-client-key.pem建议目录为 /etc/kubernetes/pki。

2、其中ca-key.pem、ca.pem、healthcheck-client-key.pem、healthcheck-client.pem、peer-key.pem、peer.pem、server-key.pem、server.pem是etcd集群所需要证书。这8个证书文件必须要上传到 所有etcd节点上。这8个证书文件建议目录为/etc/kubernetes/pki/etcd。

3、如果某一个节点如k8s-master-28节点,它即为control-plane节点,也是etcd节点,则证书文件列表如下图所示:
在这里插入图片描述

4、这里就默认在k8s-master-28(即172.18.1.28)节点上生成相关证书,并将证书分别复制到etcd各个节点相应目录及control-plane节点相关目录下,其中证书目录需提前创建好,当前K8S集群环境apiserver节点和etcd节点为同一主机,所以拷贝完之后证书文件列表如上图所示,这里就以k8s-master-28(即172.18.1.28)节点展示,其它节点也跟这个一样。

证书文件 秘钥文件 建议路径 节点 说明
ca.pem ca-key.pem /etc/kubernetes/pki/etcd etcd所在节点 etcd集群ca根证书
peer.pem peer-key.pem /etc/kubernetes/pki/etcd etcd所在节点 etcd集群peer证书
server.pem server-key.pem /etc/kubernetes/pki/etcd etcd所在节点 etcd集群server证书
healthcheck-client.pem healthcheck-client-key.pem /etc/kubernetes/pki/etcd etcd所在节点 etcd集群client证书
ca.pem ca-key.pem /etc/kubernetes/pki apiserver所在节点 apiserver连接etcd客户端证书

4.2、二进制安装etcd集群

说明:以下操作需在所有etcd节点上执行,即k8s-master-28、k8s-master-42、k8s-master-134。

4.2.1、下载软件包

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.2.2、创建Service文件

1、k8s-master-28节点

说明:以下操作只需在k8s-master-28节点上执行。

[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,k8s-master-42=https://172.18.1.42:2380,k8s-master-134=https://172.18.1.134: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=8589934592
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999[Install]
WantedBy=multi-user.target

2、k8s-master-42节点

说明:以下操作只需在k8s-master-42节点上执行。

[root@k8s-master-42 ~]# 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-42 \--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.42:2380 \--listen-peer-urls=https://172.18.1.42:2380 \--listen-client-urls=https://172.18.1.42:2379,http://127.0.0.1:2379 \--advertise-client-urls=https://172.18.1.42:2379 \--initial-cluster-token=etcd-cluster \--initial-cluster="etcd01=https://172.18.1.28:2380,k8s-master-42=https://172.18.1.42:2380,k8s-master-134=https://172.18.1.134: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=8589934592
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999[Install]
WantedBy=multi-user.target

3、k8s-master-134节点

说明:以下操作只需在k8s-master-134节点上执行。

[root@k8s-master-134 ~]# 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-134 \--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.134:2380 \--listen-peer-urls=https://172.18.1.134:2380 \--listen-client-urls=https://172.18.1.134:2379,http://127.0.0.1:2379 \--advertise-client-urls=https://172.18.1.134:2379 \--initial-cluster-token=etcd-cluster \--initial-cluster="etcd01=https://172.18.1.28:2380,k8s-master-42=https://172.18.1.42:2380,k8s-master-134=https://172.18.1.134: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=8589934592
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999[Install]
WantedBy=multi-user.target

4.2.3、启动etcd服务

说明:以下操作需在所有etcd节点上执行,即k8s-master-28、k8s-master-42、k8s-master-134,数据目录需提前创建。

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

4.2.4、检查etcd集群状态

说明:以下操作需在可在任意一个etcd节点上执行。

etcdctl --endpoints="https://172.18.1.28:2379,https://172.18.1.42:2379,https://172.18.1.134: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,https://172.18.1.42:2379,https://172.18.1.134: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 tableetcdctl --endpoints="https://172.18.1.28:2379,https://172.18.1.42:2379,https://172.18.1.134:2379" \
--cacert /etc/kubernetes/pki/etcd/ca.pem --cert /etc/kubernetes/pki/etcd/peer.pem \
--key  /etc/kubernetes/pki/etcd/peer-key.pem member list

4.2.5、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节点均需要执行。

5.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版本,所以当前环境中未采用此方法。


5.2、方法二(二进制)

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

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

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

2、准备kubelet.service文件

[root@k8s-master-28 ~]# wget https://raw.githubusercontent.com/kubernetes/release/v0.4.0/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service
[root@k8s-master-28 ~]# cp kubelet.service /usr/lib/systemd/system/kubelet.service

3、准备10-kubeadm.conf文件

[root@k8s-master-28 ~]# wget https://raw.githubusercontent.com/kubernetes/release/v0.4.0/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf
[root@k8s-master-28 ~]# mkdir -p /usr/lib/systemd/system/kubelet.service.d
[root@k8s-master-28 ~]# cp 10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

4、设置kubectl开机自启

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

七、k8s镜像下载

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、下载镜像

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

#!/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文件下载

说明:以下操作只需要在kubectl管理节点执行,这里默认在k8s-master-28节点。

[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

九、安装负载均衡高可用

k8s的高可用,主要是实现Master节点的高可用。APIServer以HTTP API提供接口服务,可以使用常规的四层或七层代理实现高可用和负载均衡。如Nginx、Haproxy等代理服务器。使用vip和keepalive实现,代理服务器的高可用,然后将集群的访问地址从APIServer的地址改为vip的地址,这样就实现了K8S集群的高可用。 这里采用的方案是 Nginx+keepalived


9.1、安装Nginx

说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

1、编译Nginx

yum install pcre-devel  zlib-devel -y
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar axf nginx-1.24.0.tar.gz && cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --with-stream
make && make install

说明:Nginx采用二进制部署方式。这一步操作,目的是得到Nginx服务的二进制文件。


2、创建目录
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

mkdir -p /etc/kube-lb/logs
mkdir -p /etc/kube-lb/conf
mkdir -p /etc/kube-lb/sbin

3、复制二进制文件
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

\cp /usr/local/nginx/sbin/nginx  /etc/kube-lb/sbin/kube-lb
chmod +x /etc/kube-lb/sbin/kube-lb

4、创建kube-lb的配置文件
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

vim  /etc/kube-lb/conf/kube-lb.conf 
user root;
worker_processes 1;
error_log  /etc/kube-lb/logs/error.log warn;
events {worker_connections  3000;
}
stream {upstream kube-apiserver {server 172.18.1.28:6443 max_fails=2 fail_timeout=3s;server 172.18.1.42:6443 max_fails=2 fail_timeout=3s;server 172.18.1.134:6443 max_fails=2 fail_timeout=3s;}server {listen 0.0.0.0:6443;proxy_connect_timeout 1s;proxy_pass kube-apiserver;}
}

5、创建kube-lb的systemd unit文件
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

vim /etc/systemd/system/kube-lb.service 
[Unit]
Description=kube-lb proxy
After=network.target
After=network-online.target
Wants=network-online.target[Service]
Type=forking
ExecStartPre=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -t
ExecStart=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb
ExecReload=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -s reload
PrivateTmp=true
Restart=always
RestartSec=15
StartLimitInterval=0
LimitNOFILE=65536[Install]
WantedBy=multi-user.target

6、启动kube-lb服务,并设置开机自启
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

systemctl daemon-reload  && systemctl restart kube-lb && systemctl enable kube-lb    

9.2、安装keepalived

1、编译keepalived
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

yum install openssl-devel libnl3-devel -y
wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar axf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure --prefix=/usr/local/keepalived
make && make install

说明:keepalived采用二进制部署方式。这一步操作,目的是得到keepalived服务的二进制文件。


2、创建目录
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

mkdir -p /etc/keepalived/conf
mkdir -p /etc/keepalived/sbin

3、复制二进制文件
说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

cp /usr/local/keepalived/sbin/keepalived /etc/keepalived/sbin/keepalived
chmod +x /etc/keepalived/sbin/keepalived

4、kube-lb-01节点创建keepalived 配置文件

说明:以下操作只需在kube-lb-01节点执行。

vim /etc/keepalived/conf/keepalived.conf
global_defs {
}vrrp_track_process check-kube-lb {process kube-lbweight -60delay 3
}vrrp_instance VI-01 {state MASTERpriority 120unicast_src_ip 172.18.1.97/24unicast_peer {172.18.1.116/24}dont_track_primaryinterface eth0virtual_router_id 222advert_int 3track_process {check-kube-lb}virtual_ipaddress {172.18.1.189/24}
}

5、kube-lb-02节点创建keepalived 配置文件

说明:以下操作只需在kube-lb-02节点执行。

vim /etc/keepalived/conf/keepalived.conf
global_defs {
}vrrp_track_process check-kube-lb {process kube-lbweight -60delay 3
}vrrp_instance VI-01 {state BACKUPpriority 119unicast_src_ip 172.18.1.116/24unicast_peer {172.18.1.97/24}dont_track_primaryinterface eth0virtual_router_id 222 advert_int 3track_process {check-kube-lb}virtual_ipaddress {172.18.1.189/24}
}

6、创建keepalived的systemd unit文件

说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

vim /etc/systemd/system/keepalived.service
[Unit]
Description=VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target
Documentation=https://keepalived.org/manpage.html[Service]
Type=forking
KillMode=process
ExecStart=/etc/keepalived/sbin/keepalived -D -f /etc/keepalived/conf/keepalived.conf
ExecReload=/bin/kill -HUP $MAINPID[Install]
WantedBy=multi-user.target

7、华为云申请虚拟VIP地址并绑定kube-lb-01节点和kube-lb-02

说明:云主机的虚拟VIP地址,必须通过平台申请,无法像本地局域网主机一样,只需在配置文件定义即可,如果没有进行此操作,将会导致云主机上同网段内的主机无法访问虚拟VIP地址。

1、将华为云虚拟VIP地址绑定到kube-lb-01节点和kube-lb-02节点上
在这里插入图片描述


8、启动keepalived服务,并设置开机自启

说明:以下操作kube-lb-01节点和kube-lb-02节点均需要执行。

systemctl daemon-reload  && systemctl restart keepalived && systemctl enable keepalived

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


十、安装control-plane节点

10.1、使用kubeadm初始化k8s集群

说明:这里将k8s-master-28节点作为初始化集群节点,所以以下操作只需k8s-master-28节点执行。

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

root@k8s-master-28:~# kubeadm config print init-defaults > kubeadm-first-master.yml

2、修改kubeadm默认config文件

[root@k8s-master-28 ~]# vim kubeadm-first-master.yml
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: 0ftir6.xoyu75tzv1u4tejkdescription: "kubeadm bootstrap token"ttl: 87600h0m0s
localAPIEndpoint:advertiseAddress: "172.18.1.28"bindPort: 6443
certificateKey: bcdb10e6cacb6da0db1ceb1a95c94924e8bc1a7dd7b31b55f21bcd4091bbce79
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
controlPlaneEndpoint: "172.18.1.189:6443"
apiServer:certSANs:- 172.18.1.28- 172.18.1.42- 172.18.1.134- k8s-master-28- k8s-master-42- k8s-master-134- 172.18.1.189extraArgs:authorization-mode: Node,RBACservice-node-port-range: 30000-36000timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
dns: {}
etcd:external:endpoints:- https://172.18.1.28:2379- https://172.18.1.42:2379- https://172.18.1.134:2379caFile: /etc/kubernetes/pki/etcd/ca.pemcertFile: /etc/kubernetes/pki/apiserver-etcd-client.pemkeyFile: /etc/kubernetes/pki/apiserver-etcd-client-key.pem
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kubernetesVersion: 1.26.15
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/16podSubnet: 10.48.0.0/16
scheduler: {}
controllerManager: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

总结:

1、token用来在节点与控制面之间建立双向的信任关系。 在向集群中添加节点时使用,可使用如下方式获取:

[root@k8s-master-28 ~]# kubeadm token generate
0ftir6.xoyu75tzv1u4tejk

2、certificateKey 用来设置一个秘钥,该秘钥将对uploadcerts init阶段上传到集群中某 Secret 内的秘钥和证书加密,可使用如下方式获取:

[root@k8s-master-28 ~]# kubeadm certs certificate-key
bcdb10e6cacb6da0db1ceb1a95c94924e8bc1a7dd7b31b55f21bcd4091bbce79

3、kubeadm-first-master.yml中定义的criSocket必须与/etc/crictl.yaml的内容保持一致,否则初始化会失败。

[root@k8s-master-28 ~]# cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock

3、使用kubeadm init初始化集群

root@k8s-master-28:~# kubeadm init --config kubeadm-first-master.yml --upload-certs

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


总结:–upload-certs参数用于将生成的证书上传到其他的节点,以作为加入集群的凭证,通过上传证书,其他节点可以安全地加入到集群中。如果你选择不将 kubeadm init 与 --upload-certs 命令一起使用, 则意味着你将必须手动将证书从主控制平面节点复制到将要加入的控制平面节点上。

执行结果,如下所示:

Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of the control-plane node running the following command on each as root:kubeadm join 172.18.1.189:6443 --token 0ftir6.xoyu75tzv1u4tejk \--discovery-token-ca-cert-hash sha256:8a3cc0a5c4fdcc99c1765d8c0ec592173579f776056ef81584cedf1aaf84662e \--control-plane --certificate-key bcdb10e6cacb6da0db1ceb1a95c94924e8bc1a7dd7b31b55f21bcd4091bbce79Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.Then you can join any number of worker nodes by running the following on each as root:kubeadm join 172.18.1.189:6443 --token 0ftir6.xoyu75tzv1u4tejk \--discovery-token-ca-cert-hash sha256:8a3cc0a5c4fdcc99c1765d8c0ec592173579f776056ef81584cedf1aaf84662e 

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

[root@k8s-master-28 ~]# mkdir -p $HOME/.kube
[root@k8s-master-28 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master-28 ~]# 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

10.2、扩容集群-添加control-plane节点

10.2.1、方法一

说明:根据上述执行结果,以下命令分别在k8s-master-42节点和k8s-master-134节点上执行。

  kubeadm join 172.18.1.189:6443 --token 0ftir6.xoyu75tzv1u4tejk \--discovery-token-ca-cert-hash sha256:8a3cc0a5c4fdcc99c1765d8c0ec592173579f776056ef81584cedf1aaf84662e \--control-plane --certificate-key bcdb10e6cacb6da0db1ceb1a95c94924e8bc1a7dd7b31b55f21bcd4091bbce79

注意:–certificate-key默认两小时后过期,可使用如下操作重新获取:

root@k8s-master-28:~# kubeadm init phase upload-certs --upload-certs --config=kubeadm-first-master.yml 

10.2.2、方法二

1、k8s-master-42节点准备kubeadm-join-master.yml文件

说明:以下命令分别在k8s-master-42节点上执行。

[root@k8s-master-42 ~]# vim kubeadm-join-master.yml 
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:bootstrapToken:apiServerEndpoint: "172.18.1.189:6443"token: 0ftir6.xoyu75tzv1u4tejkcaCertHashes:- sha256:8a3cc0a5c4fdcc99c1765d8c0ec592173579f776056ef81584cedf1aaf84662eunsafeSkipCAVerification: truetimeout: 4m0stlsBootstrapToken: 0ftir6.xoyu75tzv1u4tejk 
controlPlane:localAPIEndpoint:advertiseAddress: "172.18.1.42"bindPort: 6443certificateKey: bcdb10e6cacb6da0db1ceb1a95c94924e8bc1a7dd7b31b55f21bcd4091bbce79
nodeRegistration:criSocket: unix:///run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-master-42taints:- effect: NoSchedulekey: node-role.kubernetes.io/master- effect: NoSchedulekey: node-role.kubernetes.io/control-plane

2、k8s-master-134节点准备kubeadm-join-master.yml文件

说明:以下命令分别在k8s-master-134节点上执行。

[root@k8s-master-134 ~]# vim kubeadm-join-master.yml 
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:bootstrapToken:apiServerEndpoint: "172.18.1.189:6443"token: 0ftir6.xoyu75tzv1u4tejkcaCertHashes:- sha256:8a3cc0a5c4fdcc99c1765d8c0ec592173579f776056ef81584cedf1aaf84662eunsafeSkipCAVerification: truetimeout: 4m0stlsBootstrapToken: 0ftir6.xoyu75tzv1u4tejk 
controlPlane:localAPIEndpoint:advertiseAddress: "172.18.1.134"bindPort: 6443certificateKey: bcdb10e6cacb6da0db1ceb1a95c94924e8bc1a7dd7b31b55f21bcd4091bbce79
nodeRegistration:criSocket: unix:///run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-master-134taints:- effect: NoSchedulekey: node-role.kubernetes.io/master- effect: NoSchedulekey: node-role.kubernetes.io/control-plane

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


3、执行kubeadm-join-master.yml配置文件

说明:以下命令分别在k8s-master-42节点和k8s-master-134节点上执行。

kubeadm join --config=kubeadm-join-master.yml

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

说明:以下命令分别在k8s-master-42节点和k8s-master-134节点上执行。

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile

10.3、启动kubectl自动补全功能

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

yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
source ~/.bashrc

十一、扩容集群-添加worker节点

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

11.1、方法一

1、将worker节点加入k8s集群

kubeadm join 172.18.1.189:6443 --token 0ftir6.xoyu75tzv1u4tejk \--discovery-token-ca-cert-hash sha256:8a3cc0a5c4fdcc99c1765d8c0ec592173579f776056ef81584cedf1aaf84662e 

注意:kubeamd join命令的token只有默认只有24h,24h就过期,需要执行kubeadm token create --print-join-command重新生成。

root@k8s-master-28:~# kubeadm token create --print-join-command

11.2、方法二

1、k8s-worker-67节点准备kubeadm-join-node.yml配置文件

[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.189:6443"token: 0ftir6.xoyu75tzv1u4tejkcaCertHashes:- sha256:8a3cc0a5c4fdcc99c1765d8c0ec592173579f776056ef81584cedf1aaf84662eunsafeSkipCAVerification: truetimeout: 4m0stlsBootstrapToken: 0ftir6.xoyu75tzv1u4tejk
nodeRegistration:criSocket: unix:///run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-worker-67  # 如果有其它worker节点加入集群,只需将name字段的值修改为当前主机的主机名,其它内容不变taints: []

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


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

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

十二、部署calico网络插件

说明:以下操作只需要在k8s-master-28节点执行。

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集群测试

13.1、检查集群状态

说明:以下操作可在任意一个control-plane节点执行,当前默认在k8s-master-28节点。

kubectl get nodes -o wide
kubectl get cs
kubectl get pods -A -o wide
kubectl get svc -A  -o wide
kubeadm certs check-expiration

1、查看集群状态,如下图所示:
在这里插入图片描述

2、查看证书有效期为99年,如下图所示:
在这里插入图片描述


13.2、DNS测试

说明:以下操作可在任意一个control-plane节点执行,当前默认在k8s-master-28节点。

[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
options ndots:5/ # 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.42): 56 data bytes
64 bytes from 183.2.172.42: seq=0 ttl=50 time=3.904 ms
64 bytes from 183.2.172.42: seq=1 ttl=50 time=3.830 ms

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


13.3、高可用测试

1、虚拟vip高可用测试

关闭kube-lb-01点前,可发现vip在k8s-lb-02节点主机上,如下图所示:
在这里插入图片描述

关闭kube-lb-01点后,可发现vip在k8s-lb-02节点主机上,如下图所示:
在这里插入图片描述

vip主备切换后检查集群状态,如下图所示:
在这里插入图片描述


2、apiserver高可用测试

关闭k8s-master-28节点,通过k8s-master-42节点查看集群状态,如下图所示:
在这里插入图片描述
关闭k8s-master-28节点,通过k8s-master-134节点查看集群状态,如下图所示:
在这里插入图片描述


13.4、功能性测试

说明:以下操作只需要在k8s-master-28节点执行。

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.mzph.cn/bicheng/363.shtml

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

相关文章

Mysql嵌套查询太简单了

1、子查询的分类 不相关查询&#xff1a; 子查询能独立执行 相关查询&#xff1a; 子查询不能独立运行 相关查询的执行顺序&#xff1a; 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询, 若WHERE子句返回值为真&#xff0c;则取此元组放入结果…

maven3.9+下载安装

maven介绍 Maven 是一个项目管理和理解工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;概念。Maven 可以帮助开发者定义项目结构、依赖关系、构建过程以及其他任务。它主要用于 Java 项目&#xff0c;但也可以用于其他类型的项目。Maven 的主要目标是简化构建…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

OpenCV从入门到精通实战(四)——答题卡识别判卷系统

基于OpenCV的答题卡识别系统&#xff0c;其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术&#xff0c;自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述&#xff1a; 1. 导入必要的库 系统首先导入…

偏微分方程算法之一阶双曲差分法

目录 一、研究目标 二、理论推导 2.1 引言 2.2 迎风格式 2.3 完全不稳定差分格式 2.4 蛙跳格式&#xff08;Leapfrog&#xff09; 2.5 Lax-Friedrichs格式 2.6 Lax-Wendroff格式 2.7 Beam-Warming格式 2.8 隐格式 2.9 Courant-Friedrichs-Lewy条件&#xff08;CFL条…

(51单片机)第十一章-串行口应用提高

11.1 方式0应用 在第6章中&#xff0c;已经对51单片机的串行口结构做过详细介绍&#xff0c;并且通过实例讲解了串行口的4种工作方式中方式1的具体用法&#xff0c;本节详细讲述串行口方式0的用法。 串行口方式0被称为同步移位寄存器的输入/输出方式&#xff0c;主要用于扩展并…

【结构型模式】外观模式

​一、外观模式概述 外观模式定义与意图&#xff1a;外观类为复杂的子系统提供了一个统一的入口。外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。&#xff08;对象结构型模式&#xff09; 外观模式的特点&#xff1a; 1.又叫做门面模式&#xf…

试驾小米SU7后,我准备退了我的订单

文 | AUTO芯球 作者 | 雷歌 我真想退了我之前大定的小米SU7Pro版&#xff01; 前两天我不是和朋友三人一起开着问界M9去试驾SU7了嘛&#xff0c; 说实话&#xff0c;这一圈下来&#xff0c;有欣喜有失望。 SU7的优点特别明显&#xff0c;也很突出&#xff0c; 就是它的底…

了解MySQL InnoDB多版本

了解MySQL InnoDB多版本 在数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC&#xff0c;这使得它可以在提供高事务性能的同时&#xff0c;也保证了数据的一致性和隔离性 MVCC简…

MySQL中的死锁预防和解决

MySQL中的死锁预防和解决 死锁是数据库管理系统中常见的问题&#xff0c;特别是在高并发的应用场景下。MySQL数据库中的死锁会导致事务处理速度减慢&#xff0c;甚至完全停止&#xff0c;因此理解并预防死锁至关重要。本文将详细介绍如何预防MySQL中的死锁&#xff0c;包括常用…

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

Ubuntu 安装 wine

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 如果你使用 Ubuntu 系统&#xff0c;而有些软件只在 Windows 上运行&#xff0c;例如&#xff1a;PotPlayer&#xff0c;那么该如何在 Ubuntu 系统中使用到这些 Windows 的软件呢&#xff1f;答案是安装 wine。 简单的安装步骤如…

IDEA使用SCALA

一、在IDEA中下载插件 在设置->插件中找到scala&#xff0c;并下载。 下载完成后重启idea 二、在idea中创建spark的RDD操作项目 新建项目选中Scala。 创建完成后为项目添加java包&#xff0c;这个添加的是spark安装包中jars目录下的所有jar包 然后编写RDD操作 import or…

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法

HBuilder真机调试检测不到荣耀Magic UI系列&#xff08;包括手机和电脑&#xff09;解决办法解决方法&#xff1a; 1.在开发人员选项中开启USB调试 如何进入开发者选项&#xff1f; 设置->关于->版本号&#xff0c;点击版本号直至出现您已处于开发者模式 2.选择USB配置…

【SQL每日一练】分组过滤练习题

文章目录 前言MySQL语法注意&#xff1a; 前言 题目&#xff1a;现在运营想查看每个学校用户的平均发贴和回帖情况&#xff0c;寻找低活跃度学校进行重点运营&#xff0c;请取出平均发贴数低于5的学校或平均回帖数小于20的学校。 drop table if exists user_profile; CREATE …

37-2 Python 的 requests 库发送 POST 请求

准备 sqlilabs 靶场: 构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、发送 POST 请求 首先使用bp对 sqlilabs 靶场的第12关抓个包,了解这个关卡是如何发包的 打开靶场:本地ip+ /sqli-labs-master/Less-12/ 先随便输入个账号登录如…

DevOps(七)Jenkins发布第一个流水线任务

Jenkins的流水线&#xff08;Pipeline&#xff09;是一种强大的工具&#xff0c;用于定义和管理持续集成和持续交付&#xff08;CI/CD&#xff09;过程。它允许你以代码的形式&#xff08;即"Pipeline as Code"&#xff09;定义整个构建、测试和部署流程&#xff0c;…

第10章 物理安全要求

10.1 站点与设施设计的安全原则 假如没有对物理环境的控制&#xff0c;任何管理的、技术的或逻辑的访问控制技术都无法提供足够的安全性。 如果怀有恶意的人员获取了对设施及设备的物理访问权&#xff0c;那么他们几乎可以为所欲为&#xff0c;包括肆意破坏或窃取、更改数据。…

原来是这样的Three.js,我悟了

最近在b站上面看到up主&#xff1a;gamemcu的3D作品&#xff0c;着实让人感到非常震撼&#xff0c;作品中的SU7模型&#xff0c;利用的是Blender进行建模&#xff0c;利用了webGL的技术进行开发。由此启发了我对3D极大的乐趣。因此&#xff0c;凭借一点点&#x1f90f;的前端知…

RK3588 Android13 TvSetting 中增加 Usb 模式 Host/OTG 切换

前言 电视产品,客户要求在设置中设备偏好设置子菜单下增加一个USB模式切换菜单,一开始准备直接开整。但发现在开发者选项里就已经包含了一个USB模式 菜单了,只是没有 OTG HOST 这两选项,那就把这个菜单挪出来再增加一下就完事了,开整。 客户提供对比机图 效果图 framew…