kubeadm 1.24.0 安装k8s以docker
k8s 1.24默认已经不支持docker,可以通过cri-docker让k8s继续使用docker。
环境
- k8s 版本:1.24.0
- 系统: rock linux 8
主机
192.168.20.50 node0
编译cri-docker
编译cri-docker需要一个可以安装golang依赖的网络环境。
- 下载cri-docker
git clone https://github.com/Mirantis/cri-dockerd
- 构建cri-docker的rpm
由于centos 8 已经结束,需要将构建centos 8 的环境修改成rockylinux
cat cri-dockerd/packaging/rpm/centos-8/Dockerfile
ARG GO_IMAGE
# ARG DISTRO=centos
ARG DISTRO=rockylinux # 这里修改成rockylinux
ARG SUITE=8
ARG BUILD_IMAGE={DISTRO}:{SUITE}
...
构建rpm
cd cri-dockerd
make rpm
构建完成后在cri-dockerd/packaging/rpm/rpmbuild/RPMS中可以找到构建好的rpm包。
环境准备
- 关闭swap
所有节点上都要做
swapoff -a
# 注释掉/etc/fstab文件swap的行
- 关闭防火墙
所有节点上都要做
systemctl stop firewalld
systemctl disable firewalld
- 关闭selinux
临时关闭
setenforce 0
永久关闭
cat /etc/sysconfig/selinux
...
SELINUX=disabled
...
- 修改内核模块
配置k8s.conf文件(#k8s.conf文件原来不存在,需要自己创建的)
所有节点上都要做
cat <<EOF>> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
# docker 1.21版本需要设置
# 默认情况下,此值为0,
# 它使内核不路由目的地为127.0.0.0/8的外部流量。
# 这只是为了安全,因为这样的流量是不正常的。
# 参看https://unix.stackexchange.com/questions/111433/iptables-redirect-outside-requests-to-127-0-0-1/112232#112232
net.ipv4.conf.all.route_localnet = 1
EOF
sysctl --system
- 配置lvs 内核模块
所有节点上都要做
cat <<EOF>> /etc/modules-load.d/lvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
br_netfilter
EOF
systemctl enable --now systemd-modules-load.service
- 同步服务器时间
yum install chrony
systemctl enable chronyd --now
chronyc sources
- 安装iproute-tc
k8s 需要iproute-tc
yum install iproute-tc
准备仓库
- dockr.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- k8s.repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
部署k8s
- 安装kubeadm和docker
yum install kubeadm docker-ce yum-plugin-versionlock
yum versionlock kubeadm kubelet kubectl docker-ce
systemctl enable docker --now
systemctl enable kubelet
- docker 配置
将docker-ce的cgroup驱动改为systemd
cat <<EOF>> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"iptables": false,
"ip-masq": false,
"bridge": "none",
"log-driver":"json-file",
"log-opts":{ "max-size" :"100m","max-file":"1"},
"live-restore": false
}
EOF
- 配置kubelet
在多网卡的情况需要设置kubelet的ip
所节点都要配置,其它两个节点上将192.168.254.10替换为相应的ip
cat <<EOF>> /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--node-ip=192.168.20.50
EOF
- 安装cri-dockerd
将之前构建的cri-dockerd的rpm安装在所有k8s节点上
在rocky linux 8 上用yum localinstall 安装不能通过,使用下面的命令安装。
rpm -ivh --nodeps cri-docker-xxx.el8.x86_64.rpm
修改cri-dockerd的启动参数,网络插件参数必需配置,否则安装calico网络插件会失败
cat /usr/lib/systemd/system/cri-docker.service
...
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
...
启动cri-dockerd
systemctl daemon-reload
systemctl enable cri-docker.socket --now
启动成功后会创建/var/run/cri-dockerd.sock,可以使用crictl验证。
crictl \
--runtime-endpoint=unix:///var/run/cri-dockerd.sock \
--image-endpoint=unix:///var/run/cri-dockerd.sock \
info
- 生成配置文件
kubeadm config print init-defaults >kubeadmin-config.yml
- 编辑配置文件
cat kubeadmin-config.yml
...
localAPIEndpoint:
advertiseAddress: 192.168.20.50
bindPort: 6443
...
imageRepository: registry.aliyuncs.com/google_containers
...
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock # 这里修改成cri-dockerd
name: youre_hostname #修改为你自己的主机名
taints: null
...
kubernetesVersion: v1.24.0
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
- 拉取镜像
kubeadm config images pull --config kubeadmin-config.yml
- 安装master
kubeadm init --config kubeadmin-config.yml --upload-certs | tee kubeadmin-init.log
- 取消污点,使master节点上可以承载pod
kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-
安装calico
- 配置NetworManager
在有NetworkManager的系统上需要配置NetworkManager不接管calico的网卡
cat <<EOF>> /etc/NetworkManager/conf.d/calico.conf
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico
EOF
- calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
附重置k8s命令
直接执行kubeadm reset 会如下报错
...
Found multiple CRI endpoints on the host ...
...
可使用如下命令
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock