02 kubeadm 部署 kubernetes 1.21 集群
学习 K8S
的第一个绊脚石就是搭建 K8S
集群,构建过程中会遇到各种配置或者网络的问题,本文记录使用 kubeadm
工具搭建 K8S
集群,并附上遇到的各种问题的解决方案。
1. 配置说明
资源 | 配置 | 备注 |
---|---|---|
电脑 | MacBook Pro(M1 pro 芯片 8C16G) | arm 架构镜像资源不好找:) |
虚拟机 | VMware-Fusion-e.x.p-19431034_arm64.dmg | |
系统镜像 | CentOS-7-aarch64-08191738 |
虚拟主机名 | CPU | 内存 | 备注 |
---|---|---|---|
master01 | 4C | 8G | master node |
worker01 | 4C | 8G | worker node |
worker02 | 4C | 8G | worker node |
注:本文跳过虚拟机的安装和 centOS7
的安装,没有安装的同学可以参考该文进行安装:https://www.freesion.com/article/3457235684/
2. 主机配置
2.1 主机名配置
# master01 节点
hostnamectl set-hostname master01
# worker01 节点
hostnamectl set-hostname worker01
# worker02 节点
hostnamectl set-hostname worker02
# 验证主机名
hostname
2.2 修改 IP 地址配置
# 以 master01 节点为例,worker01, worker02 类似,下图标红的地方进行修改
# vim /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens160
UUID=895ea3eb-8cec-4c7d-8682-5ed3b3cf40da
DEVICE=ens160
ONBOOT=yes
IPADDR="172.16.149.163"
PREFIX="24"
GATEWAY="172.16.149.2"
DNS1="119.29.29.29"
2.3 主机名绑定本机地址
# 所有主机节点都需要修改
# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 l
ocalhost4.localdomain4
::1 localhost localhost.localdomain localhost6 l
ocalhost6.localdomain6
172.16.149.165 master01
172.16.149.166 worker01
172.16.149.167 worker02
2.4 防火墙设置
# 所有主机节点需要修改
# 关闭现有防火墙firewalld
# 禁用防火墙 service
systemctl disable firewalld
# 关闭防火墙
systemctl stop firewalld
# 查看防火墙状态 not running 才行
firewall-cmd --state
2.5 SELINUX 设置
# 所有主机节点需要操作
# 下面的修改和 X86 架构不一样,得改成 permissive,改成 disable 后面集群会报错
# sed -ri 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
2.6 时间同步设置
# 所有主机节点需要操作
# 查看主机是否安装加载如下 crontab 任务,命令:crontab -l
# 没有的话,执行以下命令进行加载
# crontab -e
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
2.7 升级操作系统内核(arm架构找不到镜像源)
# 所有主机节点需要操作
# 下面仅针对 X86 架构有效
# 避免后面切换 ipvs 代理模式报错
# 查看操作系统内核
uname -r
# 我自己的内核版本够用了,不用升级
5.11.12-300.el7.aarch64
# 导入elrepo gpg key
# elrepo 是一个为 Linux 提供驱动程序和内核映像的存储库
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装 elrepo YUM 源仓库
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# 安装 kernel-ml 版本,ml 为长期稳定版本,lt 为长期维护版本
yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
# grub2 是系统引导程序,系统启动前载入系统内核,更多参考:https://help.ubuntu.com/community/Grub2
# 设置grub2默认引导为0
grub2-set-default 0
# 重新生成grub2引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg
# 更新后,需要重启,使用升级的内核生效。
reboot
# 重启后,需要验证内核是否为更新对应的版本
uname -r
2.8 配置内核转发及网桥过滤
# 所有主机节点需要操作
# 1.添加网桥过滤及内核转发配置文件
cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
# 2.加载br_netfilter模块
modprobe br_netfilter
# 3.查看是否加载
lsmod | grep br_netfilter
# 正常加载输出如下所示
br_netfilter 22256 0
bridge 151336 1 br_netfilter
# 4.加载网桥过滤及内核转发配置文件
sysctl -p /etc/sysctl.d/k8s.conf
# 输出结果如下所示
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
2.9 安装ipset及ipvsadm
# 1.安装ipset及ipvsadm
yum -y install ipset ipvsadm
# 2.配置ipvsadm模块加载方式,添加需要加载的模块
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
EOF
# 3.授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
2.10 关闭 SWAP 分区
# 1.修改完成后需要重启操作系统,如不重启,可临时关闭,命令为 swapoff -a
# 2.永远关闭swap分区,需要重启操作系统
vim /etc/fstab
# 最后一行添加以下内容
/dev/mapper/centos-swap swap swap defaults 0 0
3.Docker 准备
3.1 安装 Docker
# 所有主机操作
# 1.下载阿里 YUM 源及安装版本
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2.查看可安装版本
yum list docker-ce-cli --showduplicates | sort -r
yum list docker-ce --showduplicates | sort -r
# 3.安装指定版本
yum -y install --setopt=obsoletes=0 docker-ce-20.10.9-3.el7
# 4.设置开机自启动
systemctl enable docker ; systemctl start docker
3.2 修改 cgroup 方式
# 所有主机操作
# 1.在/etc/docker/daemon.json添加如下内容,配置 docker daemon
# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 2.重启 docker
systemctl restart docker
4. kubernetes 1.21.0 集群部署
4.1 集群软件及版本说明
kubeadm | kubelet | kubectl | |
---|---|---|---|
版本 | 1.21.0 | 1.21.0 | 1.21.0 |
安装位置 | 集群所有主机 | 集群所有主机 | 集群所有主机 |
作用 | 初始化集群、管理集群等 | 用于接收api-server指令,对pod生命周期进行管理 | 集群应用命令行管理工具 |
4.2 kubernetes YUM 源准备
# 所有主机操作,我的是 macbook M1 芯片所以改了 baseurl
# X86 架构,baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
4.3 集群软件安装
# 所有主机操作
# 1. 安装指定版本
yum -y install kubeadm-1.21.1 kubectl-1.21.1 kubelet-1.21.1
4.4 配置 kubelet
# 为了实现 docker 使用的 cgroupdriver 与 kubelet 使用的 cgroup 的一致性,建议修改如下文件内容
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
# 设置 kubelet 为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
4.5 集群镜像准备
# master 节点操作,K8S 版本对应的镜像文件版本
kubeadm config images list --kubernetes-version=v1.21.1
k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-controller-manager:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0
# 所有节点操作,下载镜像文件
#!/bin/bash
images_list='
registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.1
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.1
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.1
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns:v1.8.0'
for i in $images_list
do
docker pull $i
done
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.1 k8s.gcr.io/kube-apiserver:v1.21.1
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.21.1 k8s.gcr.io/kube-proxy:v1.21.1
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1 k8s.gcr.io/kube-controller-manager:v1.21.1
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.1 k8s.gcr.io/kube-scheduler:v1.21.1
docker tag registry.aliyuncs.com/google_containers/pause:3.4.1 k8s.gcr.io/pause:3.4.1
docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
docker tag registry.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
#删除旧镜像
docker images | grep registry.aliyuncs.com | awk '{print $1":"$2}' | xargs docker rmi -f
4.6 集群初始化
# master01 节点操作
# --pod-network-cidr=不可与节点网络冲突
# --apiserver-advertise-address=master节点地址即可
[root@master01 ~]# kubeadm init --kubernetes-version=v1.21.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.16.149.165
# 保留输出内容,添加节点到集群的时候需要用到下面的 token
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/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You 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/
Then you can join any number of worker nodes by running the following on each as root:
# 注意 discovery 前面的 2 要去掉
kubeadm join 172.16.149.165:6443 --token ftg4sz.32bhq52pher2d8gs \
--discovery-token-ca-cert-hash sha256:22ca7da3a9ff88f0d54af8dfd111e0f22ae2b384bd7514a3e4d3695c13de8704
4.7 集群应用客户端管理集群文件准备
# master01 节点操作
[root@master1 ~]# mkdir -p $HOME/.kube
[root@master1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@master1 ~]# ls /root/.kube/
config
# 这个时候 master01 节点已经加入到集群中
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane,master 5m1s v1.21.1
4.8 集群网络准备
4.8.1 calico 安装
# master01 节点操作
# 1.进入官网地址
https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart
# 2.应用资源清单文件,创建 operator,上面的 2 操作
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml
# 3.通过自定义资源方式安装
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml
# 4.修改文件第13行,修改为使用kubeadm init ----pod-network-cidr对应的IP地址段
vim custom-resources.yaml
......
11 ipPools:
12 - blockSize: 26
13 cidr: 10.244.0.0/16
14 encapsulation: VXLANCrossSubnet
......
# 5.应用资源清单文件
kubectl apply -f custom-resources.yaml
# 6.监视 calico-sysem 命名空间中 pod 运行情况,见下图
# Wait until each pod has the `STATUS` of `Running`.
watch kubectl get pods -n calico-system
# 7.删除 master 上的 taint
kubectl taint nodes --all node-role.kubernetes.io/master-
# 8.查看 calico pod 运行状态
kubectl get pods -n calico-system
# 9.查看 kube-system 命名空间中 coredns 状态,处于 Running 状态表明联网成功。
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-mgtx7 1/1 Running 0 17m
coredns-558bd4d5db-zbkqz 1/1 Running 0 17m
etcd-master01 1/1 Running 0 17m
kube-apiserver-master01 1/1 Running 0 17m
kube-controller-manager-master01 1/1 Running 0 17m
kube-proxy-8jc9w 1/1 Running 0 17m
kube-scheduler-master01 1/1 Running 0 17m
4.8.2 calico 客户端安装
# master01 节点执行
# 1.下载二进制文件
curl -L https://github.com/projectcalico/calico/releases/download/v3.26.4/calicoctl-linux-arm64 -o calicoctl
# 2.安装 calicoctl
mv calicoctl /usr/bin/
# 3.为 calicoctl 添加可执行权限
chmod +x /usr/bin/calicoctl
# 4.查看权限
ls /usr/bin/calicoctl
# 5.查看版本
calicoctl version
Client Version: v3.26.4
Git commit: 6139b6dcd
Cluster Version: v3.26.4
Cluster Type: typha,kdd,k8s,operator,bgp,kubeadm
4.9 集群工作节点添加
# 注意 hostname 不要重复了
# worker01 节点执行
kubeadm join 172.16.149.165:6443 --token um8dd2.alfd4i9xy7819bub \
--discovery-token-ca-cert-hash sha256:b0805b1233bb3070508454ef28a670f89edb9c5a2afc1fb76b3fe9ffa262052d
# worker02 节点执行
kubeadm join 172.16.149.165:6443 --token um8dd2.alfd4i9xy7819bub \
--discovery-token-ca-cert-hash sha256:b0805b1233bb3070508454ef28a670f89edb9c5a2afc1fb76b3fe9ffa262052d
4.10 验证集群可用性
# master01 节点执行
[root@master01 calicodir]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane,master 20m v1.21.1
worker01 Ready <none> 3m19s v1.21.1
worker02 Ready <none> 2m19s v1.21.1
# 查看集群健康状态,这个时候通常是不健康的
[root@master01 calicodir]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0 Healthy {"health":"true"}
# 查看 pod 运行状态
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-8qhw7 1/1 Running 0 45m
coredns-558bd4d5db-f44zf 1/1 Running 0 45m
etcd-master01 1/1 Running 0 45m
kube-apiserver-master01 1/1 Running 0 45m
kube-controller-manager-master01 1/1 Running 0 45m
kube-proxy-4tcsx 1/1 Running 0 45m
kube-proxy-8xdf9 1/1 Running 0 28m
kube-proxy-zhndm 1/1 Running 0 29m
kube-scheduler-master01 1/1 Running 0 45m
5. 报错处理
- 添加工作节点报错
worker 节点重置,kubeadm reset,重新加入节点
- Worker 节点执行 kubectl get pods 报错
kubectl 运行需要使用 kubernetes-admin 来运行,将 master 节点配置文件 /etc/kubernetes/admin.conf 复制过来(同路径),重新执行即可,详见参考资料 9
- 创建 operator 超限问题
kubectl apply -f 01-tigera-operator.yaml --server-side
- 证书过期报错问题
# 查看证书过期时间 kubeadm certs check-expiration
如果证书没有过期,那么可能是时间没有和网络时间同步,同步一下时间,重新进行初始化 kubeadm init 操作,记得要删除
$HOME/.kube
目录下的东西再操作。
6. 参考资料
- https://blog.csdn.net/Weixiaohuai/article/details/133425615
- https://blog.csdn.net/jks212454/article/details/128833232
- https://blog.csdn.net/ximenjianxue/article/details/120432863
- https://www.cnblogs.com/lixuebin/p/10814603.html
- https://developer.aliyun.com/mirror/epel?spm=a2c6h.13651102.0.0.3e221b11MySRVi
- https://blog.csdn.net/qq_18153681/article/details/128082987
- https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
- https://blog.csdn.net/weixin_50763319/article/details/132912747
- https://blog.csdn.net/qq_61314298/article/details/131654753
- https://www.cnblogs.com/xuelisheng/p/11452926.html
- https://www.kuazhi.com/post/407466.html
- https://www.cnblogs.com/sky-cheng/p/14239549.html