K8S 入门实战(2)

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. 报错处理

  1. 添加工作节点报错

worker 节点重置,kubeadm reset,重新加入节点

在这里插入图片描述

  1. Worker 节点执行 kubectl get pods 报错

kubectl 运行需要使用 kubernetes-admin 来运行,将 master 节点配置文件 /etc/kubernetes/admin.conf 复制过来(同路径),重新执行即可,详见参考资料 9

在这里插入图片描述

  1. 创建 operator 超限问题
kubectl apply -f 01-tigera-operator.yaml --server-side

在这里插入图片描述

  1. 证书过期报错问题
# 查看证书过期时间
kubeadm certs check-expiration

如果证书没有过期,那么可能是时间没有和网络时间同步,同步一下时间,重新进行初始化 kubeadm init 操作,记得要删除 $HOME/.kube 目录下的东西再操作。

6. 参考资料

  1. https://blog.csdn.net/Weixiaohuai/article/details/133425615
  2. https://blog.csdn.net/jks212454/article/details/128833232
  3. https://blog.csdn.net/ximenjianxue/article/details/120432863
  4. https://www.cnblogs.com/lixuebin/p/10814603.html
  5. https://developer.aliyun.com/mirror/epel?spm=a2c6h.13651102.0.0.3e221b11MySRVi
  6. https://blog.csdn.net/qq_18153681/article/details/128082987
  7. https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
  8. https://blog.csdn.net/weixin_50763319/article/details/132912747
  9. https://blog.csdn.net/qq_61314298/article/details/131654753
  10. https://www.cnblogs.com/xuelisheng/p/11452926.html
  11. https://www.kuazhi.com/post/407466.html
  12. https://www.cnblogs.com/sky-cheng/p/14239549.html

关注公众号一起学习——无涯的计算机笔记

相关文章

文章浏览阅读942次。kube-controller-manager 和 kubelet 是...
文章浏览阅读3.8k次。上篇文章详细介绍了弹性云混部的落地历...
文章浏览阅读897次。对于cpu来说,这种分配方式并不会有太大...
文章浏览阅读796次,点赞17次,收藏15次。只要在Service定义...
文章浏览阅读763次。但是此时如果配置成 NONE, 租户创建成功...
文章浏览阅读2.7k次,点赞2次,收藏13次。公司使用的是交老的...