k8s集群搭建教程(使用cri-docker+flannel)
一个想当厨子的码农 Lv2

k8s集群搭建教程(使用cri-docker+flannel)

1. 准备工作(所有节点)

1.1 系统环境(我是没配置也部署成功了,可以先部署,如果失败了再回来进行系统环境优化)

  • 系统环境优化配置

CentOs 7.x系统自带的3.10.x内核存在一些bug,导致运行的docker,kubernetes不稳定,获取源:

1
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
  • 安装内核,装完成后检查 /boot/grub2/grub.cfg中对应内核menuentry中是否包含 initrd16 配置,如果没有,再安装一次!耗时可能会有点久
1
yum --enablerepo=elrepo-kernel install -y kernel-lt 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#查看系统的全部内核
rpm -qa | grep kernel
#kernel-3.10.0-1160.el7.x86_64
#kernel-lt-5.4.271-1.el7.elrepo.x86_64
#kernel-tools-libs-3.10.0-1160.el7.x86_64
#kernel-tools-3.10.0-1160.el7.x86_64


#设置开机从新内核启动
grub2-set-default 'CentoS Linux(5.4.271-1.el7.elrepo.x86_64) 7 (Core)'
reboot

#查看正在使用的内核
uname -r

1.2 系统参数设置

  • 所有节点关闭swap和防火墙
1
2
3
4
5
6
systemctl stop firewalld
systemctl disable firewalld
#临时关闭swapoff
swapoff -a
#永久关闭swapoff(如果想永久关闭,将下面命令的#去掉)
#sed -ri 's/.*swap.*/#&/' /etc/fstab
  • 禁用SELINUX
1
2
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
  • 所有节点设置主机名
1
2
3
hostnamectl set-hostname  k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
  • 所有节点主机名/IP加入hosts解析
1
2
3
4
5
6
vi /etc/hosts

加入如下内容:
192.168.183.132 k8s-master
192.168.183.133 k8s-node1
192.168.183.134 k8s-node2
  • 所有节点配置k8s内核
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
vm.swappiness=0 #禁止使用swap空间,只有当系统OOM时才允许使用它
vm.overcommit_memory=1 #不检查物理内存是否够用
vm.panic_on_oom=0 #开启OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
  • limit优化
1
2
3
4
5
6
7
8
9
10
ulimit -SHn 65535

cat <<EOF >> /etc/security/limits.conf
soft nofile 655360
hard nofile 131072
soft nproc 655350
hard nproc 655350
soft memlock unlimited
hard memlock unlimited
EOF

2. 组件安装(所有节点)

2.1 Docker安装

如果你的系统未安装过Docker,直接按照下面步骤操作即可。如果之前安装过,请先自行百度卸载干净。

  • 安装软件包并设置存储库
1
2
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 安装Docker
1
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 启动Docker
1
2
3
systemctl start docker
systemctl enable docker
docker info
  • 创建 /etc/docker目录
1
2
3
4
5
6
7
8
9
10
11
12
mkdir /etc/docker

#配置daemon
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts":{
"max-size":"100m"
}
}
EOF
1
2
3
4
mkdir -p /etc/systemd/system/docker.service.d

#重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
  • 注意事项
1
kubernetes 1.24+版本之后,docker必须要加装cir-docker

2.2 安装cri-docker

go安装

  • 下载
1
wget https://golang.google.cn/dl/go1.20.12.linux-amd64.tar.gz
1
2
#安装go
rm -rf /usr/local/go && tar -C /usr/local/ -xzvf go1.20.12.linux-amd64.tar.gz
  • 设置环境变量
1
2
3
4
5
6
7
8
9
vi /etc/profile
添加以下内容到profile 文件中(gopath应提前创建好,或者配置完成后别忘了创建)
#go setting
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin

#保存退出执行
source /etc/profile

构建cri-dockerd

1
git clone https://github.com/Mirantis/cri-dockerd.git

编译

1
2
3
4
5
6
7
cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

Kubernetes使用

  • 编辑:
1
vi /etc/systemd/system/cri-docker.service

在ExecStart后面追加,如:

1
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
  • 创建cri-docker启动文件,然后拷贝到其他节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vi /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

StartLimitBurst=3

StartLimitInterval=60s

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
vi /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
1
2
3
scp /usr/lib/systemd/system/cri-docker.service /usr/lib/systemd/system/cri-docker.socket root@k8s-node1:/usr/lib/systemd/system/

scp /usr/lib/systemd/system/cri-docker.service /usr/lib/systemd/system/cri-docker.socket root@k8s-node2:/usr/lib/systemd/system/
  • 启动cri-docker并设置开机自动启动
1
2
3
systemctl daemon-reload ; systemctl enable cri-docker --now
#查看状态
systemctl is-active cri-docker

2.3 所有节点安装 kubeadm,kubelet 和 kubectl

1
2
3
4
5
6
7
8
9
10
11
12
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=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
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
  • 设置kubelet开机自启
1
systemctl enable --now kubelet.service

3. 搭建k8s集群

3.1 k8s初始化

  • 在master上初始化k8s
1
2
3
4
5
6
7
kubeadm init \
--apiserver-advertise-address=192.168.183.132 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock
  • 按照提示创建kubeconfig文件
1
2
3
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
  • 重新初始化
1
2
3
4
5
6
7
8
kubeadm reset --cri-socket /var/run/cri-dockerd.sock

rm -rf .kube/
sudo mkdir ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/
cd ~/.kube
mv admin.conf config
systemctl restart kubelet

3.2 node节点的加入

  • 加入节点

在node节点如k8s-node1上执行:

1
2
3
kubeadm join kubeadm初始化成功后的token --cri-socket /var/run/cri-dockerd.sock
例如我的kubeadm初始化成功后的token为:
192.168.183.132:6443 --token vib96t.hmkd7hj7ykdigmp1 --discovery-token-ca-cert-hash sha256:c0bb3a82a4642cc4fe253edd0533ad8136b34dc243f274aa3cea27abc46e321f
  • 查看节点状态
1
2
3
kubectl get nodes

此时所有节点的状态为NotReady,这是因为还没有安装flannel网络插件
  • 网络插件下载并安装
1
2
3
4
5
6
#如果网络故障也可直接在网站中下载好文件后上传至虚拟机中(自行翻墙)
wget https://github.com/flannel-io/flannel/releases/download/v0.24.3/kube-flannel.yml
#执行
kubectl apply -f kube-flannel.yml
#或者(两者的结果是一样的,只是执行工作原理不一样,想深究的可以自行查阅资料)
kubectl create -f kube-flannel.yml
  • 再次查看节点状态全部变为 Ready
1
2
kubectl get nodes
#如果查看节点没有变成ready,先等个几分钟,因为网络传输需要一定的时间。等几分钟后如果还是NotReady,再根据报错原因查找解决方案
 评论
评论插件加载失败
正在加载评论插件