一、环境说明
主机节点
服务器系统 | 节点IP | 节点类型 | CUP/内存 | Hostname | 内核 |
BClinux for euler21.10 | 192.168.1.92 | 主节点 | 4核/8G | master | 4.19.90 |
BClinux for euler21.10 | 192.168.1.93 | 工作节点1 | 4核/8G | node1 | 4.19.90 |
BClinux for euler21.10 | 192.168.1.94 | 工作节点2 | 4核/8G | node2 | 4.19.90 |
软件说明
软件 | 版本 |
kubernetes | v1.25.4 |
containerd | 1.7.12 |
二、环境准备
注:所有节点上执行------------------------开始----------------------------
2.1 修改hostname
1 2 3 | hostnamectl set-hostname master hostnamectl set-hostname node1 hostnamectl set-hostname node2 |
2.2 三台机器网络连通(修改所有节点)
1 2 3 4 5 | [root@master ~]# cat >> /etc/hosts << EOF 192.168.1.92 master 192.168.1.93 node1 192.168.1.94 node2 EOF |
2.3 关闭防火墙
#systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld && firewall-cmd --state
2.4 关闭selinux
#setenforce 0
#sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && sestatus
2.5 关闭swap
修改/etc/fstab文件,注释掉 SWAP 的自动挂载,使用free -m确认 swap 已经关闭。
#swapoff -a
#也可以修改/etc/fstab文件,注释掉swap的挂载,永久关闭
#sed -ri 's/.*swap.*/#&/' /etc/fstab
2.6 配置iptables的ACCEPT规则
#iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
2.7 设置系统参数
swappiness 参数调整,swap关闭,也必须添加此参数:
#cat >> /etc/sysctl.d/k8s.conf << EOF
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
2.8 执行如下命令使修改生效
#modprobe br_netfilter
#sysctl -p /etc/sysctl.d/k8s.conf
2.9 安装 ipvs
cat >> /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#chmod 755 /etc/sysconfig/modules/ipvs.modules
#bash /etc/sysconfig/modules/ipvs.modules
#备注:出现modprobe: FATAL: module nf_conntrack_ipv4 not found ,则把nf_conntrack_ipv4 改为nf_conntrack便可
#lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上面脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
[root@node1 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4 15053 19
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 4
ip_vs 145458 10 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 10 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,
nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
三、安装 ipset 软件包
3.1 安装 ipset 软件包
yum install ipset -y
为了便于查看 ipvs 的代理规则,最好安装一下管理工具 ipvsadm:
yum install ipvsadm -y
3.2 同步服务器时间
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
chronyc sources
四:安装containerd
下载地址:https://github.com/containerd/containerd/releases
下载后上传到arm主机再执行如下
[root@bclinux ~]# tar xf cri-containerd-1.7.12-linux-arm64.tar.gz -C /
配置containerd:
[root@bclinux ~]# mkdir /etc/containerd -p && containerd config default > /etc/containerd/config.toml
修改2条配置:
/etc/containerd/config.toml配置文件修改:
65行:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8" 【修改pause容器镜像为国内】
137行:SystemdCgroup = true 【让Runc使用system cgroup驱动,对容器进行资源划分,隔离。】
[root@bclinux ~]# systemctl start containerd.service && systemctl enable containerd.service
[root@bclinux ~]# systemctl status containerd.service
五:安装三大件( kubelet、kubeadm、kubectl)
在确保 Containerd安装完成后,上面的相关环境配置也完成了,现在我们就可以来安装 Kubeadm 了, 我们这里是通过指定yum 源的方式来进行安装。
5.1 下载 kubernetes 源码库(注意bashurl地址后面的arrch64表示arm的源码库)
cat >> /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=kubernetes
enabled=1
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF
5.2 安装 kubeadm、kubelet、kubectl(我安装的指定版本1.25.4,有版本要求自己设定版本)
#yum install -y kubelet-1.25.4 kubeadm-1.25.4 kubectl-1.25.4
备注:arm主机安装k8s时容易报失败,若出现失败,则反复多执行几次就行了
5.3 设置运行时
#crictl config runtime-endpoint /run/containerd/containerd.sock
5.4 可以看到我们这里安装的是 v1.25.0版本,将 kubelet 设置成开机启动
#systemctl daemon-reload
#systemctl enable kubelet && systemctl start kubelet
注:所有节点上执行------------------------结束----------------------------
六、初始化集群初始化master(master执行)
6.1 然后接下来在 master 节点配置 kubeadm 初始化文件,可以通过如下命令导出默认的初始化配置:
kubeadm config print init-defaults > kubeadm.yaml
然后根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要 注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定 cgroupDriver 为systemd
6.2 修改内容:
-
advertiseAddress: 192.168.1.92 # 修改为自己的master节点IP
-
name: master # 修改为master主机名
-
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 修改为阿里云镜像地址
-
kubernetesVersion: 1.25.4 # 确认是否为要安装版本,版本根据执行:kubelet --version 得来
-
podSubnet: 172.16.0.0/16 # networking: 下添加pod网络
-
scheduler: {} # 添加模式为 ipvs
-
cgroupDriver: systemd # 指定 cgroupDriver 为 systemd
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.72.20
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.25.4
networking:
dnsDomain: cluster.local
podSubnet: 172.16.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
6.3 使用上面的配置文件进行初始化
kubeadm init --config=kubeadm.yaml
6.4 执行拷贝 kubeconfig 文件
#mkdir -p $HOME/.kube
#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.5 添加节点(node1、node2)
记住初始化集群上面的配置和操作要提前做好,将 master 节点上面的 $HOME/.kube/config 文件拷贝到
node 节点对应的文件中,安装 kubeadm、kubelet、kubectl,然后执行上面初始化完成后提示的 join 命 令即可:
-
如果忘记了上面的
join 命令可以使用命令kubeadm token create --print-join-command重新获取。
#node节点主机执行:
#[root@node1 ~]# kubeadm join 192.168.1.92:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:d87669b0c3630a0c5f566097cedee190764712ee0c8d41fc2db00521fcf9f680
6.6 查看集群状态:
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 2m57s v1.25.4
node1 NotReady 47s v1.25.4
node2 NotReady 29s v1.25.4
七、安装网络插件
可以看到是 NotReady 状态,这是因为还没有安装网络插件,必须部署一个 容器网络接口 (CNI) 基于 Pod 网络附加组件,以便您的 Pod 可以相互通信。在安装网络之前,集群 DNS (CoreDNS) 不会启动。接下来安装网络插件,这里我们安装 calico
7.1 下载calico文件
#[root@master ~]# wget https://docs.projectcalico.org/manifests/calico.yaml
7.2 编辑calico.yaml文件:
(初始化master的时候podSubnet: 172.16.0.0/16,但calico.yaml
文件默认IP为:192.168.0.0/16,所以需要改为172.16网段)
# 找到CALICO_IPV4POOL_CIDR,取消注释并这里需要修改172.16.0.0/16
- name: CALICO_IPV4POOL_CIDR
value:
"172.16.0.0/16"
7.3 安装calico网络插件
[root@master ~]# kubectl apply -f calico.yaml
7.4 查看pod运行状态(每秒刷新一次)
[root@master ~]# watch -n 1 kubectl get pod -n kube-system
[root@master ~]# kubectl get pod -n kube-system
7.5 查看集群状态
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 4d15h v1.25.4
node1 Ready 4d15h v1.25.4