Kubernetes v1.24 基于containerd部署

环境信息

主机名IP地址
master1192.168.0.1
node1192.168.0.2
node2192.168.0.3

服务器密码:123456

主机名解析

# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
192.168.0.1 master1
192.168.0.2 node1
192.168.0.3 node2

k8s每个节点安装containerd。

containerd安装参考:containerd安装

containerd配置

修改containerd的config.toml配置文件,修改k8s的镜像初始化pause底层网络镜像的下载地址

vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

# 重启containerd
systemctl restart containerd

时间同步

kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间

yum install chrony -y
# 启动chronyd服务
systemctl start chronyd
systemctl enable chronyd
chronyc sources
date

禁用iptable和firewalld服务

kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 1 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
# 2 关闭iptables服务
systemctl stop iptables
systemctl disable iptables

禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled

禁用swap分区

swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap

修改hostname

# 到对应机器上执行
hostnamectl set-hostname master1
hostnamectl set-hostname node1
hostnamectl set-hostname node2

安装kubeadm环境

配置软件仓库

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

# 清除缓存
yum clean all

# 更新yum源
yum update

# 列出kubectl可用的版本
yum list kubectl --showduplicates | sort -r

# 安装最新版本,也可安装指定版本
yum install -y kubelet kubeadm kubectl

# 安装指定版本的kubelet,kubeadm,kubectl
yum install -y kubelet-1.24.3-0 kubeadm-1.24.3-0 kubectl-1.24.3-0

# 查看k8s初始化所需的镜像
kubeadm config images list --kubernetes-version v1.24.3

# 编写一个shell脚本,修改官方镜像地址为阿里云镜像地址-n k8s.io则指定k8s 的namespace下载镜像
cat > /root/imagedown.sh << EOF
nerdctl -n k8s.io pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.3
nerdctl -n k8s.io pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.3
nerdctl -n k8s.io pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.3
nerdctl -n k8s.io pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.3
nerdctl -n k8s.io pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7
nerdctl -n k8s.io pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0
EOF

# 执行脚本
sh imagedown.sh

初始化k8s集群

每台k8s节点设置加载模块,内核参数调优

cat > /etc/modules-load.d/modules.conf << EOF 
ip_vs
br_netfilter
EOF

modprobe ip_vs
modprobe br_netfilter

内核优化

rm -rf /etc/sysctl.conf

cat > /etc/sysctl.conf << EOF 
net.ipv4.ip_forward=1
vm.max_map_count=262144
kernel.pid_max=4194303
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets=6000
net.netfilter.nf_conntrack_max=2097152
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF

sysctl -p

master执行初始化集群,只需要在master上执行

kubeadm init --apiserver-advertise-address=192.168.111.128 \
--apiserver-bind-port=6443  \
--kubernetes-version=v1.24.3  \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--service-dns-domain=cluster.local \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--ignore-preflight-errors=swap

# 选项解释:
# --apiserver-advertise-address  api-server地址也就是master节点地址
# --apiserver-bind-port  api-server服务端口号
# --kubernetes-version  k8s版本号
# --pod-network-cidr  pod网络的地址建议16位或者8位地址
# --service-cidr  svc网络地址建议16位或者8位地址与pod网络区别开来
# --service-dns-domain=cluster.local  集群dns域名地址,默认为cluster.local
# --image-repository  k8s镜像下载地址
# --ignore-preflight-errors=swap  忽略初始化错位,如果开启了swap,可以忽略这个错误

执行完毕后会打印

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:

kubeadm join 192.168.111.128:6443 --token 7hoayb.zd25inepz0ez8bun \
	--discovery-token-ca-cert-hash sha256:eeb975f49ee2e6b09d0364b09d4067eefab76abafd7cde658ca022d0f936cf55 

kubectl凭据配置

kubectl默认使用~/.kube/config文件中凭据信息管理kubernetes。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get nodes
# 这时候master还是NoReady状态,等网络配置完成后,STATUS状态由NotReady变更为Ready

节点加入集群

如果master节点初始化集群时终端输出的加入集群命令丢失,可以使用以下命令重新获取:

kubeadm token create --print-join-command

依次在每个node节点执行

配置网络

下载flannel网络插件,如下载不要下来需要手动下载上传上去

# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  
kubectl apply -f https://file.codei.top/upload/2024-03/kube-flannel.yml

最后

# 查看集群状态
kubectl get nodes

# 查看Pod状态
kubectl get pods -A