当前位置: 首页 > news >正文

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

设置基础环境

# 分别在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设置不足
解决方式:
调整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插件一直拉取失败

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可能会有各种各样失败的原因,由于可能已经写了我们不知道什么的文件以及端口的占用,此时,我们可以通过重置的方式,重新开始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出现问题的解决

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电路原理分析
  • 科普文:微服务之Spring Cloud Alibaba消息队列组件RocketMQ工作原理
  • 树模型详解3-xgboost
  • Elasticsearch的DSL查询,分组后排序,并查询组数量
  • 学工系统学生家庭情况登记功能概述
  • NET的全称、主要功能以及在计算机网络中的作用?
  • 8.3 day bug
  • 快速方便地下载huggingface的模型库和数据集
  • MQTT(速记版)
  • Arduino PID库 (2) –微分导致的过冲
  • 基于ThinkPHP开发的校园跑腿社区小程序系统源码,包含前后端代码
  • css3的继承性
  • 十五 open CV 教程 形态学二值化和腐蚀操作
  • 结构型设计模式:桥接/组合/装饰/外观/享元
  • 【Nuxt】配置
  • 《Java编程思想》读书笔记-对象导论
  • HTML-表单
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Lucene解析 - 基本概念
  • python 学习笔记 - Queue Pipes,进程间通讯
  • python3 使用 asyncio 代替线程
  • React-Native - 收藏集 - 掘金
  • Spring Cloud中负载均衡器概览
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • uni-app项目数字滚动
  • 从重复到重用
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 你不可错过的前端面试题(一)
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 删除表内多余的重复数据
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我的业余项目总结
  • 学习HTTP相关知识笔记
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Java总结 - String - 这篇请使劲喷我
  • ​ubuntu下安装kvm虚拟机
  • ​低代码平台的核心价值与优势
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #Linux(Source Insight安装及工程建立)
  • #图像处理
  • #预处理和函数的对比以及条件编译
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Note)C++中的继承方式
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (转)Unity3DUnity3D在android下调试
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • *上位机的定义
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .DFS.
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径