使用VM安装K8S

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
    • 关闭交换分区

设置基础环境

shell 复制代码
# 分别在master节点和worker节点执行如下:

#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<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执行命令
shell 复制代码
# 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.gpg
   http://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节点拉取镜像
shell 复制代码
# 下载镜像 总共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
EOF
   
chmod +x ./images.sh && ./images.sh
Worker节点拉取镜像
shell 复制代码
# 至少需要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重叠,需要进行修改

shell 复制代码
#所有机器添加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重叠,需要进行修改

执行后看到如下提示,则表示执行成功。请暂存一下执行成功后的内容

shell 复制代码
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
设置 .kube/config
shell 复制代码
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络组件

使k8s的所有节点可以互通有无

shell 复制代码
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进行如下修改
shell 复制代码
# 打开下面的注释,并且将其进行修改
- name: CALICO_IPV4POOL_CIDR
   value: "172.168.0.0/16"

创建calico资源

shell 复制代码
kubectl apply -f calico.yaml   # 部署 calico 网络插件

Worker Node加入

按照初始化Master节点时的Token和命令加入Master节点,如下:

shell 复制代码
kubeadm join cluster-endpoint:6443 --token uu0mpy.fdsjy3wojwwpatyj \
    --discovery-token-ca-cert-hash sha256:3d0c32c41667faf5424f6a3506e330bdaa57edda63c3d0f09bb4346c0b7c5b4f

验证

shell 复制代码
# 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配置文件
bash 复制代码
{
  "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镜像:

  • 看下镜像拉取镜像的版本等信息
bash 复制代码
kubectl describe pod calico-node-wmhrw  -n kube-system
  • 手动拉取
bash 复制代码
docker pull calico/cni:v3.15.1 # 版本号以自己的为准
  • 重新查看是否启动成功
bash 复制代码
kubectl get pods -A

kubeadm init失败重置处理

kubeadm可能会有各种各样失败的原因,由于可能已经写了我们不知道什么的文件以及端口的占用,此时,我们可以通过重置的方式,重新开始init操作。

解决方式:

  • 执行重置命令
bash 复制代码
kubeadm reset -f
  • 删除相关文件
bash 复制代码
rm -rf /etc/cni /etc/kubernetes /var/lib/dockershim /var/lib/etcd /var/lib/kubelet /var/run/kubernetes ~/.kube/*
  • 重启Docker
bash 复制代码
systemctl restart docker

初始化忘记Token

可使用下面命令重新生成Token

bash 复制代码
sudo kubeadm token create --print-join-command

之后在Worker节点重新替换Token重新执行

参考资料

相关推荐
HoweWWW1 小时前
k8s 微服务 ingress-nginx 金丝雀发布
微服务·容器·kubernetes
向往风的男子1 小时前
【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(三十一)
学习·容器·kubernetes
HoweWWW1 小时前
k8s中的存储
linux·容器·kubernetes
苏supper3 小时前
k8s的NodeIP、PodIP、ClusterIP、ExternalIP
kubernetes
东边的那根草~13 小时前
2024年9月12日(k8s环境及测试 常用命令)
docker·容器·kubernetes
方圆师兄13 小时前
k8s 常见问题梳理
java·kubernetes
ly143567861913 小时前
93、k8s之hpa+helm
云原生·容器·kubernetes
Hai99021816 小时前
k8s用StatefulSet部署redis
redis·kubernetes
是小赵鸭.20 小时前
云计算实训49——k8s环镜搭建(续2)
linux·深度学习·docker·容器·kubernetes·云计算·学习方法
雨凝1213281 天前
K8s 之控制器的定义及详细调用案例
docker·容器·kubernetes