kubeadm快速搭建Kubernetes1.21.14集群

发布时间 2023-08-25 14:58:17作者: 谢科锋

1.配置要求

###本次实验环境使用Kubernetes1.21.14版本 docker19.03.14版本 内核3.10.0-1160.90.1.el7.x86_64搭建

CentOS 7.9 可以部署 Kubernetes 1.21.x 版本。在部署之前,需要检查主机是否符合 Kubernetes 系统要求,
包括:
操作系统要求:CentOS 7.9,内核版本不低于 3.10。
容器运行时要求:Docker 1.13.x 或更高版本、cri-o 1.18 或更高版本。
硬件资源要求:至少 2GB 的可用内存、2个或更多的CPU内核、20GB
Kubernetes 版本     最低内核版本
1.22.x             4.14.0
1.21.x             3.10.0
1.20.x             3.10.0
1.19.x             3.10.0
1.18.x             3.10.0
1.17.x             3.10.0

2.准备环境

角色 IP
master 192.168.26.101
node1 192.168.26.102
node2 192.168.26.103

 

 

 

 

2.1设置防火墙为 Iptables 并设置空规则,关闭selinux

[root@xkf ~]# systemctl stop firewalld && systemctl disable firewalld
[root@xkf ~]# yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F &&service iptables save
[root@xkf ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@xkf ~]# setenforce 0

 

2.2关闭swap交换分区

[root@xkf ~]# swapoff -a  #临时
[root@xkf ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab   #永久

 

2.3设置主机名,添加hosts文件

[root@xkf ~]# hostnamectl set-hostname master
[root@xkf ~]# bash
[root@master ~]# vim /etc/hosts
[root@master ~]# cat /etc/hosts
192.168.26.101 master
192.168.26.102 node1
192.168.26.103 node2
[root@master ~]# scp /etc/hosts root@192.168.26.102:/etc/hosts
[root@master ~]# scp /etc/hosts root@192.168.26.103:/etc/hosts

 

2.4调整内核参数,将桥接的IPv4流量传递到iptables的链

需要开启网络桥接功能
[root@master ~]# brctl show
提示“command not found”,则需要先安装bridge-utils
[root@master ~]# yum -y install bridge-utils
打开某些内核参数
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl -p
调整
[root@master ~]# cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
EOF
[root@master ~]# cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
[root@master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
[root@master ~]# sysctl --system   #生效

 

2.5时间同步

[root@master ~]# yum install ntpdate -y
[root@master ~]# ntpdate time.windows.com
30 Apr 07:26:27 ntpdate[2628]: adjust time server 52.231.114.183 offset -0.002402 sec

 

2.6升级系统内核

#2.6.1更新系统软件包:
[root@master ~]# yum update

#2.6.2添加ELRepo软件源:
[root@master ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@master ~]# yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

#2.6.3安装kernel-ml软件包:
[root@master ~]# yum --enablerepo=elrepo-kernel install kernel-ml

#2.6.4修改GRUB引导菜单,使操作系统默认启动新内核:
[root@master ~]# grub2-set-default 0

#2.6.5生成GRUB引导配置文件:
[root@master ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

#2.6.7重启系统,让新内核生效:
reboot

##2.7kube-proxy开启ipvs的前置条件(解决svc和pod之间的调度关系)
加载的 IPVS 模块所对应的 modprobe 命令
[root@master ~]# 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
[root@master ~]#  chmod 755 /etc/sysconfig/modules/ipvs.modules 
执行其中包含的 modprobe 命令,将所需的 IPVS 模块加载到内核中
[root@master ~]#  bash /etc/sysconfig/modules/ipvs.modules 
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh               16384  0 
ip_vs_wrr              16384  0 
ip_vs_rr               16384  0 
ip_vs                 200704  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          180224  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              16384  3 nf_conntrack,xfs,ip_vs

 

3.所有节点安装Docker/kubeadm/kubelet

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

3.1 安装Docker

3.1.1卸载旧版本的 Docker

[root@master ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

 

3.1.2安装依赖包

[root@master ~]# yum update -y
[root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

 

3.1.3配置阿里云

[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 

3.1.4安装

列出所有可用的 Docker 版本
[root@master ~]# yum list docker-ce --showduplicates | sort -r
安装指定版本
[root@master ~]# yum install docker-ce-19.03.14 docker-ce-cli-19.03.14 containerd.io

#打开docker并设置开机自启
[root@master ~]# systemctl enable docker && systemctl start docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

#查看版本
[root@node2 ~]# docker --version
Docker version 19.03.14, build 5eb3275d40

 

3.1.5创建Docker 的配置文件

创建Docker 的配置文件并进行相应的配置,以便提高 Docker 运行的安全性和性能
# 创建 /etc/docker 目录
[root@master ~]# mkdir -p /etc/docker
# 配 daemon.
[root@master ~]# cat > /etc/docker/daemn.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver":"json-file",
  "log-opts":{
    "max-size": "100m"
    }
}
EOF
[root@master ~]# mkdir -p /etc/systemd/system/docker.service.d
# 重启docker服务
[root@master ~]# systemctl daemon-reload && systemctl restart docker && systemctl enable docker

 

3.2添加阿里云yum软件源

[root@master ~]#  cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
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

 

3.3安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

这三条命令分别用于列出 kubeadm、kubelet 和 kubectl 可用的软件包版本
yum list kubeadm --showduplicates
yum list kubelet --showduplicates
yum list kubectl --showduplicates
kubeadm:初始化工具   kubelet:命令行管理工具     kubectl:跟docker (cri)交互创建容器

[root@master ~]# yum -y install kubelet-1.21.14-0    kubeadm-1.21.14-0  kubectl-1.21.14-0

#查看版本
[root@master ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.14", GitCommit:"0f77da5bd4809927e15d1658fb4aa8f13ad890a5", GitTreeState:"clean", BuildDate:"2022-06-15T14:16:13Z", GoVersion:"go1.16.15", Compiler:"gc", Platform:"linux/amd64"}

[root@master ~]# systemctl enable kubelet  不可以启动但要设置开机自启,初始化时会自动启动
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

 

4.部署Kubernetes Master,node节点

4.1部署Kubernetes Master节点

[root@master ~]#  kubeadm init \
  --apiserver-advertise-address=192.168.26.101 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.21.14 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
#由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。
#末尾显示为初始化成功
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  
kubeadm join 192.168.26.101:6443 --token maynsp.qmr39gylukq0wb77 \
    --discovery-token-ca-cert-hash sha256:2a7d51b2cb779fb504fc5e0e41eb3c7b067d603e3ecce7dea1c6ffe46ea0a918 
    
#使用 kubectl 工具 运行以下命令:
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config

 

4.2部署node节点加入集群

#节点加入集群
[root@node1 ~]# kubeadm join 192.168.26.101:6443 --token maynsp.qmr39gylukq0wb77 \
    --discovery-token-ca-cert-hash sha256:2a7d51b2cb779fb504fc5e0e41eb3c7b067d603e3ecce7dea1c6ffe46ea0a918 
[root@node2 ~]# kubeadm join 192.168.26.101:6443 --token maynsp.qmr39gylukq0wb77 \
    --discovery-token-ca-cert-hash sha256:2a7d51b2cb779fb504fc5e0e41eb3c7b067d603e3ecce7dea1c6ffe46ea0a918 

 

5.部署calico网络插件

#部署calico网络插件
[root@master ~]# rz -E
rz waiting to receive.
[root@master ~]# ls
\  anaconda-ks.cfg  calico(1).yaml  kubernetes.conf
[root@master ~]# kubectl apply -f calico\(1\).yaml 

#查看节点信息需要等待一会:都为 Ready 
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE    VERSION
master   Ready    control-plane,master   112m   v1.21.14
node1    Ready    <none>                 110m   v1.21.14
node2    Ready    <none>                 110m   v1.21.14

#获取 Kubernetes 集群中 kube-system 命名空间中所有 Pod 的当前状态
[root@master ~]# kubectl get pods -n kube-system -o wide
NAME                                       READY   STATUS    RESTARTS   AGE    IP               NODE     NOMINATED NODE   READINESS GATES
calico-kube-controllers-67bb5696f5-5s6hz   1/1     Running   0          96m    10.244.166.129   node1    <none>           <none>
#............都为1/1
kube-scheduler-master                      1/1     Running   0          103m   192.168.26.101   master   <none>           <none>

 

5.1测试,排错

#显示 Kubernetes 控制平面组件的健康状态
[root@master ~]# 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"}  
#有报错,正常状态为
                       ok                  
                        ok                  
                     Healthy   {"health": "true"}
#解决
[root@master ~]# cd /etc/kubernetes/manifests/
[root@master manifests]# vim kube-scheduler.yaml 
[root@master manifests]# vim kube-controller-manager.yaml 
两个文件都注释掉
#    - --port=0
重新加载
[root@master manifests]# systemctl daemon-reload 
[root@master manifests]# systemctl restart kubelet.service 
#正确没有报错
[root@master manifests]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"} 

#检查 Pod 的状态
[root@master manifests]# kubectl get pods -n kube-system | grep scheduler
kube-scheduler-master                      1/1     Running   0          2m25s