声明
(1)本文为作者原创,转载请注明出处;
(2)创作时间2023/3/13
安装环境
集群(单节点)在VMware Workstation上搭建主机信息如下:
Host | OS | Hostname | vmnet8 | Role | CPU/Mem/Disk |
1 | Ubuntu20.04 | k8s-master | 11.0.1.20 | master | 4Core, 4G, 30G |
2 | Ubuntu20.04 | k8s-worker | 11.0.1.21 | worker | 4Core, 4G, 30G |
这里只记录master节点的安装,work 节点安装只做简单介绍。
VMware上网络信息配置如下:
Net Name | vmnet8 |
Subnet | 11.0.1.0/24 |
Gateway | 11.0.1.2 |
PC IP | 11.0.1.1 |
Master IP | 11.0.1.20 |
Worker IP | 11.0.1.21 |
系统准备
(1)关闭防火墙(所有节点)
systemctl stop ufw
systemctl disable ufw
(2)关闭swap(所有节点)
sed -i 's/.*swap.*/#&/' /etc/fstab
swapoff --all
(3)添加主机解析(所有节点)
cat >> /etc/hosts << EOF
11.0.1.20 k8s-master
11.0.1.21 k8s-worker
EOF
(4)主机间免密(所有节点)
ssh-keygen
# 将生成的公钥内容复制到所有work节点,略...
(5)修改hostname(所有节点)
hostnamectl set-hostname k8s-master # master node
hostnamectl set-hostname k8s-worker # worker node
docker 安装
基础操作 略
注意:
要配置国内源;
要把cgroup driver 配置为systemd;
# example
sudo tee /etc/docker/daemon.json <<- 'EOF'
{"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"],
"exec-opts": [ "native.cgroupdriver=systemd" ]
}
EOF
安装cri-dockerd
(1)检查系统信息
lsb_release -rc
Release: 20.04
Codename: focal
(2)下载安装文件
下载地址: https://github.com/Mirantis/cri-dockerd/releases/
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd_0.3.1.3-0.ubuntu-focal_amd64.deb
右键复制上面的链接,在节点wget下载。由于墙的原因下载可能会失败,多尝试几次,也看运气。
(3)安装(所有节点)
说明:deb包安装方式是最简单的,推荐使用
dpkg -i cri-dockerd_0.3.1.3-0.ubuntu-focal_amd64.deb
systemctl status cri-docker.service
修改参数:
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 --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
systemctl daemon-reload && systemctl restart cri-docker.service
关于为什么要装cri-dockerd,网上说明很多也很详细,下面从其他博文摘录一些供参考:
从kubernetes 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持kubernetes 主推的CRI(容器运行时接口)标准,所以docker不能再作为kubernetes的容器运行时了,即从kubernetesv1.24开始不再使用docker了。
但是如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。cri-docker是一个支持CRI标准的shim(垫片)。一头通过CRI跟kubelet交互,另一头跟docker api交互,从而间接的实现了kubernetes以docker作为容器运行时。
源博:https://blog.51cto.com/flyfish225/5706901
安装k8s组件(所有节点)
参考阿里云官方步骤:
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.2f871b11SfhTYQ
集群初始化
(1)初始化步骤
查看kubernets版本
kubelet --version
Kubernetes v1.26.2
拉取系统镜像
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --cri-socket unix:///run/cri-dockerd.sock
docker image ls
初始化集群
kubeadm init \
--apiserver-advertise-address=11.0.1.20 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.26.2 \
--service-cidr=10.0.0.0/16 \
--pod-network-cidr=10.10.0.0/16 \
--cri-socket unix://var/run/cri-dockerd.sock
--apiserver-advertise-address=11.0.1.20 是master节点IP;
--service-cidr=10.0.0.0/16 是service 资源 IP池,自己定;
--pod-network-cidr=10.10.0.0/16 是pod资源IP池,自己定;
--cri-socket unix://var/run/cri-dockerd.sock 这条要加上
成功后显示
其中有如下内容,安装worker节点会用到:
kubeadm join 11.0.1.20:6443 --token 29tg8a.kunc59rl9c1miyl1 --discovery-token-ca-cert-hash sha256:8b7b50b683b0c92b3bf2bdb7a420ec69384d95b27db7342df515372fa8f85c20
查看系统pod:
其中coredns这两个pod还没起来,需要安装cni网络插件。
kubectl 命令补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile
(2)排错
如果报错,通过下面这个命令可以看到报错内容:
journalctl -xeu kubelet
如果报pki 证书问题,往pki目录里丢一个ca证书就好:
mkdir /etc/kubenetes/pki
cd /etc/kubenetes/pki
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subject -subj "/C=CN/ST=SH/L=SH/CN=abcd.cn"
(3)重新初始化
重新init之前需要清理环境:
rm -rf /etc/kubernetes/manifest
rm -rf /var/lib/etcd/*
kubeadm reset -f --cri-socket unix://var/run/cri-dockerd.sock
安装cni 网络插件 calico
(1)下载yaml
参考官网步骤:https://docs.tigera.io/calico/3.25/getting-started/kubernetes/quickstart
mkdir .kube
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml -O .kube/
kubectl create -f .kube/tigera-operator.yaml #注意这里要用create而不是apply
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml -O .kube/
#修改cidr参数,让该pod使用init时给pod network的网络
grep cidr .kube/custom-resources.yaml
cidr: 10.10.0.0/16
kubectl create -f .kube/custom-resources.yaml
(2)拉取镜像
由于网络原因,镜像可能拉取失败,导致pod起不来,这时可以手动拉取
# 获取需要拉取的镜像
kubectl describe pods -n calico-system | grep Image: | awk '{print $NF}'| sort |uniq
docker.io/calico/cni:v3.25.0
docker.io/calico/csi:v3.25.0
docker.io/calico/kube-controllers:v3.25.0
docker.io/calico/node-driver-registrar:v3.25.0
docker.io/calico/node:v3.25.0
docker.io/calico/pod2daemon-flexvol:v3.25.0
docker.io/calico/typha:v3.25.0
docker pull docker.io/calico/xxxx #逐个手动拉取
镜像拉取成功后,pod就都跑起来了
检查
kubectl get pod -n kube-system
kubectl get node
10. worker 节点安装
步骤2,3,4,5,6完成后worker节点上执行7中出现的命令:
kubeadm join 11.0.1.20:6443 --token 29tg8a.kunc59rl9c1miyl1 --discovery-token-ca-cert-hash sha256:8b7b50b683b0c92b3bf2bdb7a420ec69384d95b27db7342df515372fa8f85c20
再次查看node,全部Ready就成功了
kubectl get nodes