前前后后也部署过几套k8s集群了,但每次都要看其他人的文档,每次又要出不同的问题,再加上想部署一套使用containerd作为容器运行时的集群环境,于是乎写下这一篇细致的参考文档。
操作系统 | 主机 IP | 主机名 | 角色 |
CentOS7.9 | 192.168.239.125 192.168.239.199(VIP) | k8s-master01 | master1 |
CentOS7.9 | 192.168.239.126 | k8s-master01 | master2 |
CentOS7.9 | 192.168.239.127 | k8s-master01 | master3 |
1. 环境准备(在所有主机上操作)
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭 selinux
SELinux可能干扰容器网络接口和文件访问权限。
# 临时关闭
setenforce 0
#永久关闭
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
关闭 swap
# 临时
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
修改主机名
hostnamectl set-hostname k8s-master01 在master1上操作
hostnamectl set-hostname k8s-master02 在master2上操作
hostnamectl set-hostname k8s-master03 在master3上操作
配置 Host
cat >> /etc/hosts << EOF
192.168.239.125 k8s-master01
192.168.239.126 k8s-master02
192.168.239.127 k8s-master03
EOF
时间同步
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources
安装依赖包
yum install -y conntrack ntpdate ntp ipset jq iptables curl sysstat libseccomp wget vim net-tools git
升级系统内核(可选)
# 升级系统内核为 4.44(可选)
# CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的Kubernetes 不稳定,查看内核命令uname -r,升级步骤如下:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"
# 重启后产看内核变化
reboot
设置内核参数
br_netfilter模块可以使 iptables 规则可以在 Linux Bridges 上面工作,用于将桥接的流量转发至iptables链
启用 bridge-nf-call-iptables 这个内核参数 (置为 1),表示 bridge 设备在二层转发时也去调用 iptables 配置的三层规则 (包含 conntrack)
具体可参考【博客515】k8s中为什么需要br_netfilter与net.bridge.bridge-nf-call-iptables=1-CSDN博客
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
vm.swappiness=0
EOF
# 生效
sysctl --system
加载内核模块
# 加载 overlay 模块
$ modprobe overlay
# 加载 br_netfilter 模块
$ modprobe br_netfilter
安装 ipvsadm并配置 至于为什么选择ipvs而不使用iptables,可自行搜索
yum install ipvsadm -y
#由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块
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
#运行并查看
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
若发现没有nf_conntrack_ipv4,因为新内核的原因,已经合并到了nf_conntrack
systemctl daemon-reload
systemctl enable ipvsadm
systemctl restart ipvsam
2. 安装 containerd(所有节点运行)
containerd 是从 docker 中分离出来的一个项目,可以作为一个底层容器运行时,现在它成了 Kubernete 容器运行时更好的选择。从 1.24 开始,K8S 已取消 docker 作为其默认运行时。只关心容器生命周期的话,docker太大了,containerd是个更好的选择,其次,kubelet 任何一次重要功能的更新,都不得不考虑 Docker 的处理场景,然后更新 Docker部分代码(早期dockershim 依然是 kubelet 代码的一部分)。
安装依赖
yum install yum-utils device-mapper-persistent-data lvm2 iproute-tc -y
配置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 containerd
yum install containerd.io-1.6.6-3.1.el8.x86_64 -y
如果说no pacakge,运行yum list --showduplicates containerd.io,选择适合版本。
生成配置文件
containerd config default > /etc/containerd/config.toml
修改配置文件
# 修改 cgroups 为 systemd
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 修改 pause 镜像地址(一定要保证执行成功,最好运行后去检查一下,当然,如果你肉身在国外就无妨)
sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
# 修改容器存储路径到空间比较充裕的路径
root = "/var/lib/containerd"
配置 crictl
cat <<EOF> /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
启动服务
systemctl enable containerd
systemctl daemon-reload
systemctl restart containerd
#检查一下
systemctl status containerd
3. 安装 kubeadm、kubelet、kubectl(所有节点执行)
配置 yum 源
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
安装
# 安装组件
yum install kubectl-1.24.1-0.x86_64 kubelet-1.24.1-0.x86_64 kubeadm-1.24.1-0.x86_64 -y
# 设置开机启动
systemctl enable kubelet
systemctl daemon-reload
systemctl restart kubelet
4. 安装集群
安装 Keepalived 服务,安装完后ip a检查一下
yum install keepalived -y
修改配置文件:
vim /etc/keepalived/keepalived.conf
# 参考如下配置,<strong>若发现ping不通vip,关闭vrrp_strict</strong>
global_defs {
router_id GA_K8S
}
vrrp_instance VI_1 {
# 节点类型(master或 backup,1 个集群只有 1 个 MASTER角色,其它为 BACKUP角色)
state MASTER
# 绑定的网卡
interface eth0
virtual_router_id 200
# 优先级,值越大,优先级越高
priority 100
nopreempt
advert_int 1
# authentication三个节点都一样
authentication {
auth_type PASS
auth_pass jdvm2vm8weiyhlwa
}
virtual_ipaddress {
# VIP 地址
192.168.239.199
}
}
systemctl daemon-reload
systemctl restart keepalived
systemctl enable keepalived
安装 Haproxy
yum install -y haproxy
修改配置文件(参考如下)
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
frontend kubernetes-frontend <strong>#注意</strong>
bind *:16443
mode tcp
default_backend kubernetes-backend
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
backend kubernetes-backend <strong>#注意</strong>
mode tcp
timeout queue 1h
timeout server 1h
timeout connect 1h
log global
balance roundrobin
server rancher01 192.168.239.125:6443
server rancher02 192.168.239.126:6443
server rancher03 192.168.239.127:6443
systemctl daemon-reload
systemctl enable haproxy
# 检查一下
systemctl restart haproxy
初始化 Master 节点(参考如下,可复制过去修改一下ip)
# 生成并修改配置文件
mkdir /app
kubeadm config print init-defaults > kubeadm.yaml
#可参考我的kubeadm.yaml
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
localAPIEndpoint:
# 控制平面的 IP 地址
advertiseAddress: 192.168.239.125 <strong>#注意</strong>
bindPort: 6443
nodeRegistration:
# 容器运行时 socket 文件地址
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
# 控制平面主机名(可选)
name: k8s-master01
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
apiServer:
timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "192.168.239.199:16443" <strong># 注意</strong>
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
# 镜像服务地址
imageRepository: registry.aliyuncs.com/google_containers
# Kubernetes 版本
kubernetesVersion: 1.24.1 <strong># 注意</strong>
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 <strong># 注意</strong>
# Service 的网段
serviceSubnet: 10.96.0.0/16
scheduler: {}
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
拉取镜像并初始化master节点
# 查看所需镜像列表
kubeadm config images list --config /app/kubeadm.yml
# 拉取镜像
kubeadm config images pull --config /app/kubeadm.yml
# 根据配置文件启动 kubeadm 初始化 k8s <strong>(只在master1节点执行)</strong>
kubeadm init --config=/root/app/kubeadm.yml --upload-certs
若初始化失败
kubeadm reset
rm -rf /etc/kubernetes/
根据概率来说,你可能会遇到部署失败问题,运行journalctl -u kubelet得到如下问题

检查一下kubeadm.yaml,是否ip填写错误。检查一下sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml是否执行成功。
如果部署成功,会显示两个命令,一个加入worker节点的,一个是加入control-plane节点的,请选择将master节点加入,如
kubeadm join 192.168.239.199:16443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:3708c507fb572724d7d85c2f738826d5028f26165120a6bfaec1a67265b01bae --control-plane --certificate-key 293f6d84152b6f98aa8e20bda478a0cda506482b58cd4bb1bb0db7d8524469b8
<strong>#上面命令在其他两个节点执行</strong>
下面的命令在执行完后需要在所有节点执行,会有提示,如
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装fannel网络插件
需要mirrored-flannelcni-flannel.tar mirrored-flannelcni-flannel-cni-plugin.tar flannel.tar flannel.yaml这四个文件,请自行搜索并下载,若需要,联系wuhongyu191@gmail.com。
下载好后,执行
ctr -n k8s.io i import mirrored-flannelcni-flannel-cni-plugin.tar
ctr -n k8s.io i import mirrored-flannelcni-flannel.tar
ctr -n k8s.io i import flannel.tar
# 看看镜像是否有
crictl images
移除污点
# master1节点执行
kubectl taint nodes k8s-master01 node-role.kubernetes.io/master:NoSchedule-
# master2节点执行
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-
# master3节点执行
kubectl taint nodes k8s-master03 node-role.kubernetes.io/master:NoSchedule-
最后执行
kubectl apply -f flannel.yaml
查看集群状态
kubectl get nodes

kubectl get pods -A

OVER!!!