环境
- 2个节点,每个节点都是虚拟机,每个节点2核2G
- 每个节点设置使用netplan设置静态地址
- master节点:192.168.113.131
- worker01节点:192.168.113.132
- k8s版本1.22.1
- Ubuntu Server版本20.04.3
- 使用k8sopt账户安装,权限和root一致
准备
静态IP修改
赋权和修改netplan配置文件。
sudo chmod o+w /etc/netplan/00-installer-config.yaml
vi /etc/netplan/00-installer-config.yaml
地址内容。
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
dhcp4: no
addresses: [192.168.113.132/24]
gateway4: 192.168.113.2
nameservers:
addresses: [114.114.114.114,8.8.8.8]
version: 2
使用netplan应用配置。
创建k8sopt用户
使用root用户创建账号。
创建用户后,执行下面的命令,在出现的编辑画面中添加一个k8sopt,和root使用同样的权限配置。
离线文件
- k8s镜像文件
- flannel-v0.15.0.tar
- mirrored-flannelcni-flannel-cni-plugin-v1.2.tar
- coredns-v1.8.4.tar
- kube-controller-manager-v1.22.1.tar
- kube-scheduler-v1.22.1.tar
- pause-3.5.tar
- etcd-3.5.0-0.tar
- kube-apiserver-v1.22.1.tar
- kube-proxy-v1.22.1.tar
- flannel部署配置文件
1.安装docker
系统安装过程中不要选装docker,版本不一样,如果安装过docker,先卸载。
卸载docker。
sudo apt-get remove docker docker-engine docker.io containerd runc
安装docker。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
2.安装kubeadm
sudo apt-get install -y apt-transport-https ca-certificates curl
Ubuntu系统中如果安装了ca-certificates、curl,会跳过已安装的组件。
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
sudo apt-get install kubeadm
在上述安装 kubeadm 的过程中,kubeadm 和 kubelet、kubectl、kubernetes-cni 这几个二进制文件都会被自动安装好。
安装后执行显示版本信息命令,正常显示版本即为安装完成。
kubeadm version
kubectl version
kubelet --version
3.关闭swap
先为下面两个文件添加其他用户可写的权限
sudo chmod o+w /etc/sysctl.conf
sudo chmod o+w /ect/fstab
编辑/ect/fstab
并注释关于swap的配置。
在/etc/sysctl.conf
中添加swap设置,然后重启。
echo vm.swappiness=0 >> /etc/sysctl.conf
sudo reboot
重启完成后,使用命令free -m
,其中的swap均为0。
4.安装集群
4.1.准备k8s镜像
将docker save
保存出来的镜像放到/home/k8sopt/k8simages
目录下,并赋予可读可写可执行权限。
sudo chmod -R +rwx k8simages
进入k8simages
导入images,可以将下列命令写一个shell执行。
sudo docker load < flannel-v0.15.0.tar
sudo docker load < mirrored-flannelcni-flannel-cni-plugin-v1.2.tar
sudo docker load < coredns-v1.8.4.tar
sudo docker load < kube-controller-manager-v1.22.1.tar
sudo docker load < kube-scheduler-v1.22.1.tar
sudo docker load < pause-3.5.tar
sudo docker load < etcd-3.5.0-0.tar
sudo docker load < kube-apiserver-v1.22.1.tar
sudo docker load < kube-proxy-v1.22.1.tar
镜像都导入后,可查看一下所有的imags以及tag。
4.2.修改docker的cgroup驱动为systemd
“cgroupfs”作为Docker cgroup驱动程序,k8s推荐的驱动程序是“systemd”。
手动改一下。
sudo vi /etc/docker/daemon.json
编辑内容内容:
{
"exec-opts":["native.cgroupdriver=systemd"]
}
保存退出,重启docker。
sudo systemctl restart docker
执行命令查看docker的信息
在显示的信息中找到Cgroup Driver,确认值是systemd
4.3.初始化k8s的control-plane
sudo kubeadm init --kubernetes-version=v1.22.1 --pod-network-cidr=10.0.2.0/24
如果这一步报错,纠正错误后,一定要执行kubeadm reset
后再进行init。
正常初始化后,显示成功信息,注意信息中提示要配环境变量、配置pod网络、使用token加入节点:
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.113.131:6443 --token eb6vwx.ogq90ew0rjmaavxw \
--discovery-token-ca-cert-hash sha256:357143b69f278c2dc07fef4d325087ff19a86d1b1553c01f829f4826fedd5cb8
4.4.配置环境变量
按照上面的显示内容配置环境变量。
非root用户配置环境变量。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置完成后,看一下node有几个
结果显示有一个node,状态是notready。
显示一下这个node的详细信息。
kubectl describe node kxh
在显示的一堆信息中conditions的表中最后有个Ready开头的行,在这一行的最右侧有Message显示NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
,意思就是要装网络插件。
4.5.安装网络插件
将提前准备好的flannel部署配置文件kube-flannel.yml复制到/home/k8sopt
目录下,在该目录下应用该文件。
kubectl apply -f kube-flannel.yml
成功执行后,通过命令查看flannel容器的运行情况。
kubectl get pods -n kube-system
可以看到kube-flannel跑了一个是实例,处于running状态。
再看一下master节点的状态。
能看到master节点已经是Ready的状态。
5.部署work节点
5.1.确认hostname
所有节点的hostname必须设置不同,worker节点的hostname设置成要求的worker节点的名字。
sudo o+w /etc/hostname
vi /etc/hostname
比如可以设置成k8s-worker01
。
修改hostname完成后重启。
5.2.确保docker的cgroup驱动为systemd。
如果不是systemd的,kubelet运行会失败。
5.3.准备必要的镜像
必须要在worker节点上提前准备好两个docker images。
参考部署master节点时导入镜像的方法,导入以下两个images。
sudo docker load < kube-proxy-v1.22.1.tar
sudo docker load < pause-3.5.tar
5.4.worker节点加入集群
执行kubeadm init完成时显示的join命令。
如果有显示证书等文件已经存在的,先执行kubeadm reset
后,再执行kubeadm join
。
sudo kubeadm join 192.168.113.131:6443 --token eb6vwx.ogq90ew0rjmaavxw \
--discovery-token-ca-cert-hash sha256:357143b69f278c2dc07fef4d325087ff19a86d1b1553c01f829f4826fedd5cb8
注意:如果执行失败的,在修复问题后执行sudo kubeadm reset
重置后,再进行join。
执行成功后,显示已加入集群的信息。
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
稍过一会,在master查询所有节点信息,能看到worker节点已经是Ready了。
也可以查看worker节点的详细启动信息,注意其中的conditions里面有没有未满足和失败的条件。
kubectl describe node k8s-worker01
如果第一次做的时候,没有在worker节点上准备好必要的镜像,那么join完的woker节点是notready的状态,这是后可以在master上驱逐以及删除woker节点,并进行修复后,再join。
kubectl drain k8s-worker01 --force
kubectl delete nodes k8s-worker01
5.5 可能出现的podCIDR问题
在节点看似都Ready后,要看一下master上pod的状态,会看到有一个运行在worker节点上的flannel处于crashBackOff状态。
kubectl get pods -n kube-system
通过查看出错flannel pod的日志,会发现日志中显示未设置podCIDR。
kubectl logs kube-flannel-ds-dsw2k -n kube-system
按照这篇帖子,对worker节点进行CDIR的设置,可以解决,原因参考这个链接。
按照解决方法,对worker节点打一个patch,打完以后,过一小会就能看到flannel pod都正常运行了。
kubectl patch node k8s-worker01 -p '{"spec":{"podCIDR":"10.0.2.0/24"}}'
6.测试
sudo docker pull nginx
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods,svc
可以看到nginx service对节点映射的端口号,我这里是32416,使用worker节点地址加上端口号在浏览器中访问可以看到nginx默认网页内容。