VM 部署K8S
前言
本次使用VM搭建k8s,由于搭建流程复杂,在此记录。
需提前安装好VM(可参考:VM安装),起两台虚拟机(模拟master和worker),且VM里已安装好Docker(可参考:Docker安装与了解)。环境及版本如下:
- VMware:17.0.0 build-20800274
- Docker:26.1.4
有可能会在安装k8s的时候遇见各种各样的问题,下面有整理我在安装时遇见的问题以及参考的链接,出现问题可先参考,不行可Google。
目标
搭建k8s一主(master)一从(worker)节点集群
过程
k8s对VM要求
- 每台VM 2GB+的内存
- 2CPU+
- 集群中所有的网络可以ping通
- 关闭防火墙
- 每个节点设置不同的hostname
- 关闭交换分区
设置基础环境
# 分别在master节点和worker节点执行如下:#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
安装kubelet、kubeadm、kubectl
- kubelet:负责Pod的启动和容器运行时
- kubeadm:引导集群的快速创建等
- kubectl:k8s执行命令
# master节点和worker节点执行# 配置k8s 下载的地址
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF# 安装
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes# 启动kubelet且设置开机自启
sudo systemctl enable --now kubelet
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。
systemctl status kubelet
使用kubeadm构建集群
Master节点拉取镜像
# 下载镜像 总共7个sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOFchmod +x ./images.sh && ./images.sh
Worker节点拉取镜像
# 至少需要kube-proxy镜像,本次只拉取kube-proxy镜像docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/kube-proxy:v1.20.9
Master节点初始化
命令解释
kubeadm init
–apiserver-advertise-address=${填写自己虚拟机的IP} \ # master 节点ip
–control-plane-endpoint=cluster-endpoint \ # 域名值
–image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \ # 镜像仓库
–kubernetes-version v1.20.9 \ # k8s 版本
–service-cidr=10.96.0.0/16 \ # 网络范围 一般不用改 网络范围不重叠
–pod-network-cidr=192.168.0.0/16 # 此为默认值,k8s 给pod分配网络ip的范围 一般不用改重要: 由于虚拟机的IP基本都是以 192.168.x.x开头, 而pod-network要求IP不与apiserver-advertise-address、service-cidr重叠,需要进行修改
#所有机器添加master域名映射,每个节点都需要执行,让每个节点知道master节点
echo "${填写自己虚拟机的IP} cluster-endpoint" >> /etc/hosts # master节点 #主节点初始化 # 只需要在master节点运行
kubeadm init \
--apiserver-advertise-address=${填写自己虚拟机的IP} \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=172.168.0.0/16 # 由于虚拟机的IP基本都是以 192.168.x.x开头, 而pod-network要求IP不与apiserver-advertise-address、service-cidr重叠,需要进行修改
执行后看到如下提示,则表示执行成功。请暂存一下执行成功后的内容
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
设置 .kube/config
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络组件
使k8s的所有节点可以互通有无
curl https://docs.projectcalico.org/manifests/calico.yaml -O
由于calico默认的IPV4POOL_CIDR的网络区间为 192.168.0.0/16,而我们上面节点初始化的时候将其改为172.168.0.0/16,所以需要改动calico.yml文件:
- 打开calico.yml文件
- 找见192.168.0.0/16进行如下修改
# 打开下面的注释,并且将其进行修改
- name: CALICO_IPV4POOL_CIDRvalue: "172.168.0.0/16"
创建calico资源
kubectl apply -f calico.yaml # 部署 calico 网络插件
Worker Node加入
按照初始化Master节点时的Token和命令加入Master节点,如下:
kubeadm join cluster-endpoint:6443 --token uu0mpy.fdsjy3wojwwpatyj \--discovery-token-ca-cert-hash sha256:3d0c32c41667faf5424f6a3506e330bdaa57edda63c3d0f09bb4346c0b7c5b4f
验证
# master节点执行
kubectl get nodes# 结果
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 5d20h v1.20.9
k8s-node Ready <none> 4d9h v1.20.9
遇见问题总结
内存和CPU初始化设置不足导致集群创建失败
解决方式:
调整CPU和内存即可
镜像拉取慢与出现It seems like the kubelet isn‘t running or healthy问题
- 由于目前大部分国内纷纷关闭多个镜像加速站点,可尝试不同的云镜像仓库多尝试一下来解决镜像慢的问题
- 后者的问题是因为kubelet的cgroup驱动与Docker的cgroup驱动不一致导致的,可以修改Docker配置文件中的cgroup配置即可
- 以下是我目前使用的Docker配置文件
{"registry-mirrors": ["http://docker.m.daocloud.io","https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","https://9wj0qjo9.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
Calico插件一直拉取失败
解决方式:
本地使用Docker手动拉取calico镜像:
- 看下镜像拉取镜像的版本等信息
kubectl describe pod calico-node-wmhrw -n kube-system
- 手动拉取
docker pull calico/cni:v3.15.1 # 版本号以自己的为准
- 重新查看是否启动成功
kubectl get pods -A
kubeadm init失败重置处理
kubeadm可能会有各种各样失败的原因,由于可能已经写了我们不知道什么的文件以及端口的占用,此时,我们可以通过重置的方式,重新开始init操作。
解决方式:
- 执行重置命令
kubeadm reset -f
- 删除相关文件
rm -rf /etc/cni /etc/kubernetes /var/lib/dockershim /var/lib/etcd /var/lib/kubelet /var/run/kubernetes ~/.kube/*
- 重启Docker
systemctl restart docker
初始化忘记Token
可使用下面命令重新生成Token
sudo kubeadm token create --print-join-command
之后在Worker节点重新替换Token重新执行
参考资料
- 笔记-1
- 笔记-2
- kubeadm init 重置问题解决
- Worker节点接入集群报错处理
- Kubelet的cgroup与Docker不一致处理
- ImagePullBackOff出现问题的解决