《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图

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


二、环境信息

主机名 系统版本 内核版本 IP地址 备注
k8s-master-62 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.62 master节点
k8s-worker-63 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.63 worker节点
k8s-worker-64 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.64 worker节点

三、安装和配置先决条件

3.1、主机名设置

说明:分别在对应的节点IP上设置主机名。

root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-master-62
root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-worker-63
root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-worker-64

3.2、配置主机hosts

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

root@k8s-master-62:~# vim /etc/hosts
192.168.1.62 k8s-master-62
192.168.1.63 k8s-worker-63
192.168.1.64 k8s-worker-64

3.3、关闭防火墙

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

root@k8s-master-62:~# ufw status
root@k8s-master-62:~# ufw disable

3.4、关闭selinux

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

root@k8s-master-62:~# apt install selinux-utils
root@k8s-master-62:~# apt install policycoreutils
root@k8s-master-62:~# sed -i 's#SELINUX=permissive#SELINUX=disabled#g' /etc/selinux/config
root@k8s-master-62:~# sestatus -v

说明:如果selinux默认关闭则无需修改。


3.5、关闭swap分区

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

root@k8s-master-62:~# swapoff -a
root@k8s-master-62:~# sed -i 's/^\/swapfile\(.*\)$/#\/swapfile \1/g' /etc/fstab

3.6、时间时区同步

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

1、设置时区为Asia/Shanghai,如果已经是则请忽略

root@k8s-master-62:~# timedatectl
               Local time: 五 2023-03-31 14:11:36 CST
           Universal time: 五 2023-03-31 06:11:36 UTC
                 RTC time: 五 2023-03-31 06:11:36    
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes                       
              NTP service: active                    
          RTC in local TZ: no  

2、使用chrony同步时间

root@k8s-master-62:~# apt install chrony -y
root@k8s-master-62:~# vim /etc/chrony/chrony.conf
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
#pool ntp.ubuntu.com        iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2

root@k8s-master-62:~# systemctl enable chronyd.service
root@k8s-master-62:~# systemctl restart chronyd.service
root@k8s-master-62:~# systemctl status chronyd.service

阿里云NTP服务器地址列表,状态检测如下所示:
在这里插入图片描述

然后就是chrony客户端上的一些常用命令:

#查看可用的时间同步源
chronyc sources -v
 
#查看时间同步源的状态
chronyc sourcestats -v
 
#对客户端系统时间进行强制同步
chronyc -a makestep

3.7、修改内核参数

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

说明:有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失。配置k8s.conf文件,如下所示:

root@k8s-master-62:~# cat <
overlay
br_netfilter
EOF

root@k8s-master-62:~# modprobe overlay
root@k8s-master-62:~# modprobe br_netfilter

# 设置所需的sysctl参数,参数在重新启动后保持不变
root@k8s-master-62:~# cat <
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用sysctl参数而不重新启动
root@k8s-master-62:~# sysctl --system

3.8、启用IPVS模式

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

说明:ube-proxy开启ipvs的前提需要加载以下的内核模块

ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4

注意:如果出现modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory /lib/modules/5.15.0-69-generic错误,这是因为使用了高内核,当前内核版本为5.15.0-69-generic,在高版本内核已经把nf_conntrack_ipv4替换为nf_conntrack了。

# 1、安装ipvs
root@k8s-master-62:~#  apt -y install ipvsadm ipset sysstat conntrack

# 2、加载内核模块脚本
root@k8s-master-62:~# cat > /etc/profile.d/ipvs.modules <
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/profile.d/ipvs.modules

#3、执行加载模块脚本
bash /etc/profile.d/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

四、安装containerd

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

kubernetes 1.24.x以后版本默认CRI为containerd,cri称之为容器运行时插件。

方式一、二进制安装

方式二、apt工具安装

1、安装软件包

root@k8s-master-62:~# apt install containerd -y

2、生成默认配置文件

root@k8s-master-62:~# mkdir -p /etc/containerd&& containerd config default > /etc/containerd/config.toml

3、配置systemd cgroup驱动

root@k8s-master-62:~# sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml

4、重载沙箱(pause)镜像

root@k8s-master-62:~# sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml

5、重启containerd服务并设置开机自启

root@k8s-master-62:~# systemctl restart containerd && systemctl enable containerd

说明:由于网络问题,无法下载国外的K8S镜像,所以这里使用阿里云的镜像仓库地址registry.cn-hangzhou.aliyuncs.com/google_containers代替。如果你有阿里云的账号,可以对 containerd配置镜像加速地址来实现快速下载镜像。


五、安装kubelet、kubeadm和kubectl

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

1、安装使用Kubernetes apt仓库所需要的包

root@k8s-master-62:~# apt-get install -y apt-transport-https ca-certificates curl

2、编辑镜像源文件,加入阿里云k8s镜像源配置

root@k8s-master-62:~# cat </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

3、编辑镜像源文件,加入阿里云k8s镜像源配置

root@k8s-master-62:~# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add

4、更新源

root@k8s-master-62:~# apt-get update

5、安装指定版本kubeadm、kubelet、kubectl

root@k8s-master-62:~# apt-get install -y kubelet=1.24.12-00 kubeadm=1.24.12-00 kubectl=1.24.12-00

六、k8s镜像下载

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

1、查看需要下载的镜像

registry.k8s.io/kube-apiserver:v1.24.12
registry.k8s.io/kube-controller-manager:v1.24.12
registry.k8s.io/kube-scheduler:v1.24.12
registry.k8s.io/kube-proxy:v1.24.12
registry.k8s.io/pause:3.7
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.8.6

2、下载相关镜像

#!/bin/bash
k8s_version=v1.24.12
pause_version=3.7
etcd_version=3.5.6-0
coredns_version=v1.8.6
registry_address=registry.cn-hangzhou.aliyuncs.com/google_containers
ctr image pull --all-platforms ${registry_address}/kube-apiserver:${k8s_version}
ctr image pull --all-platforms ${registry_address}/kube-controller-manager:${k8s_version}
ctr image pull --all-platforms ${registry_address}/kube-scheduler:${k8s_version}
ctr image pull --all-platforms ${registry_address}/kube-proxy:${k8s_version}
ctr image pull --all-platforms ${registry_address}/pause:${pause_version}
ctr image pull --all-platforms ${registry_address}/etcd:${etcd_version}
ctr image pull --all-platforms ${registry_address}/coredns:${coredns_version}

3、将镜像并打包成tar.gz格式

#!/bin/bash
k8s_version=v1.24.12
pause_version=3.7
etcd_version=3.5.6-0
coredns_version=v1.8.6
registry_address=registry.cn-hangzhou.aliyuncs.com/google_containers
ctr image export --all-platforms kube-apiserver-${k8s_version}.tar.gz ${registry_address}/kube-apiserver:${k8s_version}
ctr image export --all-platforms kube-controller-manager-${k8s_version}.tar.gz ${registry_address}/kube-controller-manager:${k8s_version}
ctr image export --all-platforms kube-scheduler-${k8s_version}.tar.gz \${registry_address}/kube-scheduler:${k8s_version}
ctr image export --all-platforms kube-proxy-${k8s_version}.tar.gz ${registry_address}/kube-proxy:${k8s_version}
ctr image export --all-platforms pause-${pause_version}.tar.gz ${registry_address}/pause:${pause_version}
ctr image export --all-platforms etcd-${etcd_version}.tar.gz ${registry_address}/etcd:${etcd_version}
ctr image export --all-platforms coredns-${coredns_version}.tar.gz ${registry_address}/coredns:${coredns_version}

说明:由于网络问题,无法访问registry.k8s.io镜像仓库地址,这里使用国内阿里云的镜像仓库来下载k8s镜像。如果你的是专网环境,请找一台能访问阿里云镜像仓库的服务器下载然后打包成tar.gz格式,上传到要部署的专网服务器,通过ctr image import命令导入镜像即可。


七、calico镜像及yml文件下载

calico 3.25版本对应K8S版本,如下图所示:

1、支持系统
RedHat Linux 7
CentOS 7
CoreOS Container Linux stable
Ubuntu 16.04
Debian 8

2、支持k8s版本
v1.23
v1.24
v1.25
v1.26

1、calico.yml文件下载
说明:以下操作只需要在master节点执行。

root@k8s-master-62:~# wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
root@k8s-master-62:~# grep "image:" calico.yaml 
          image: docker.io/calico/cni:v3.25.0
          image: docker.io/calico/cni:v3.25.0
          image: docker.io/calico/node:v3.25.0
          image: docker.io/calico/node:v3.25.0
          image: docker.io/calico/kube-controllers:v3.25.0

2、calico相关镜像下载
说明:以下操作无论是master节点和worker节点均需要执行。

#!/bin/bash
calico_version=v3.25.0
ctr image pull --all-platforms docker.io/calico/cni:${calico_version}
ctr image pull --all-platforms docker.io/calico/node:${calico_version}
ctr image pull --all-platforms docker.io/calico/kube-controllers:${calico_version}
ctr image export --all-platforms cni-${calico_version}.tar.gz \
	docker.io/calico/cni:${calico_version} 
ctr image export --all-platforms node-${calico_version}.tar.gz \
	docker.io/calico/node:${calico_version}
ctr image export --all-platforms kube-controllers-${calico_version}.tar.gz \
	docker.io/calico/kube-controllers:${calico_version}

七、使用kubeadm init初始化集群

说明:以下操作仅在master节点执行。

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

root@k8s-master-62:~# kubeadm config print init-defaults > kubeadm.yaml

2、修改kubeadm默认config文件

root@k8s-master-62:~# vim kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.1.62
  bindPort: 6443
apiServer:
  extraArgs:
    service-node-port-range: 30000-36000
imageRepository: "registry.cn-hangzhou.aliyuncs.com/google_containers"
kubernetesVersion: 1.24.12
networking:
  dnsDomain: cluster.local
  podSubnet: 10.48.0.0/16
  serviceSubnet: 10.96.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

3、使用kubeadm init初始化集群

root@k8s-master-62:~# kubeadm init --config=kubeadm.yaml

如下图所示:
《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》_第1张图片

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

root@k8s-master-62:~# mkdir -p $HOME/.kube
root@k8s-master-62:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8s-master-62:~# chown $(id -u):$(id -g) $HOME/.kube/config
root@k8s-master-62:~# export KUBECONFIG=/etc/kubernetes/admin.conf

5、安装网络插件Calico

root@k8s-master-62:~# kubectl apply -f calico.yam

如下图所示:
《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》_第2张图片

6、设置kubelet开机自启

root@k8s-master-62:~# systemctl enable kubelet

八、将worker节点加入k8s集群

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

1、将worker节点加入k8s集群

#注意:kubeamd join命令的token只有24h,24h就过期,需要执行kubeadm token create --print-join-command重新生成。
root@k8s-worker-63:~# kubeadm join 192.168.1.62:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:4dc96a7ecd538256dd5116b8c0f7a1155e52874532a1e10f3c7d02a15922d0a9

如下图所示:
在这里插入图片描述
2、设置kubelet开机自启

root@k8s-master-62:~# systemctl enable kubelet

九、k8s集群测试

1、查看集群节点状态

root@k8s-master-62:~# kubectl get nodes
root@k8s-master-62:~# kubectl get cs
root@k8s-master-62:~# kubectl get pods -A
root@k8s-master-62:~# kubectl get svc -A

如下图所示:
《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》_第3张图片

2、验证k8s DNS是否可用和是否可以正常访问网络

root@k8s-master-62:~# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ # ping www.baidu.com
PING www.baidu.com (14.119.104.254): 56 data bytes
64 bytes from 14.119.104.254: seq=0 ttl=53 time=7.779 ms
64 bytes from 14.119.104.254: seq=1 ttl=53 time=8.404 ms

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


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

你可能感兴趣的:(《企业级K8s集群运维实战》,ubuntu20.04,kubernetes,k8s1.24.12)