使用VM安装K8S

news2024/9/22 19:44:41

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
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执行命令
# 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节点拉取镜像
# 下载镜像 总共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节点拉取镜像
# 至少需要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/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
设置 .kube/config
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo 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_CIDR
   value: "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出现问题的解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GO语言 4 收集器

劳苦功高的数组 声明数组并访问其元素 以下数组不多不少正好包含 8 个元素 var planets [8]string同一个数组中的每个元素都具有相同的类型&#xff0c;比如以上代码就是由 8 个字符串组成&#xff0c;简称字符串数组。 数组的长度可以通过内置的 len 函数确定。在声明数组…

03。仓颉程序结构

1&#xff0c;什么是 仓颉的“源代码”、“源文件”&#xff1f; ~通常以 “ .cj ” 为后缀的文本文件里面包含的仓颉代码&#xff0c;我们称为仓颉源代码、源文件。 / / test.txt --------------- test.cj 2&#xff0c;什么是 “ 作用域” &#xff1f;“嵌套作…

C/C++关键字大全

目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…

在vscode中远程连接linux进行开发

目录 引言 配置过程 1.本机安装OpenSSH 2.本机生成RSA公钥和私钥 3.将rsa公钥添加到远程linux的authorized_keys文件中 4.vscode安装Remote - SSH插件 5.在vscode中ssh连接服务器 6.在本地vscode操作远程linux文件进行开发 7.在vscode上给远程linux机器需安装插件 常…

路径规划——贪婪最佳优先搜索

路径规划——贪婪最佳优先搜索 学习A算法前先学习一下贪婪最佳优先搜索算法&#xff0c;在学习过程中在网上找了一些博客、文章还有视频来看以深入理解此算法&#xff0c;但是实际情况却是非常令人恼怒。有些文章标题是贪婪最佳优先搜索&#xff0c;内容却是其他的算法&#x…

【密码学】椭圆曲线密码体制(ECC)

椭圆曲线密码体制&#xff08;Elliptic Curve Cryptography, ECC&#xff09;是一种基于椭圆曲线数学特性的公钥密码系统。在介绍椭圆曲线之前&#xff0c;我们先来了解一下椭圆曲线的基本概念。 一、椭圆曲线是什么&#xff1f; &#xff08;1&#xff09;椭圆曲线的数学定义…

PolSARPro软件安装处理TerraSAR数据(CSDN_20240804)

1. 打开polSARPro软件&#xff0c;点击Enter 2. 点击OK 3. 点击左侧第一个图像&#xff0c;进入PolSARPro Bio。 4. 点击Enter. 5. 点击Environment&#xff0c;选择Single Data Set 6. 选择工作路径 7. 点击No 8. Import -> Spaceborne Sensors ->TerraSAR-X->Quad-P…

C++的vector类

目录 简介 特点 接口 构造函数 迭代器函数 Capacity系列 element access系列 modifiers系列 定义在全局的重载函数 find 总结 简介 vector 是 C 标准模板库&#xff08;Standard Template Library&#xff0c;简称 STL&#xff09;中的一个模板类&#xff0c;用于表…

【iOS】——GCD总结

同步和异步的区别 同步执行等待操作完成&#xff0c;而异步执行允许程序在操作完成前继续运行&#xff0c;提高了效率和响应性。这里的关键就是上一个操作需不需要等待当前操作的执行&#xff0c;如果需要就是同步&#xff0c;如果不需要就是异步。 异步有开启新线程的能力但…

如何构建AI产品:OpenAI与前Shopify产品负责人Miqdad Jaffer的经验分享

一、引言 构建AI产品是一项复杂且充满挑战的任务&#xff0c;尤其是当涉及到面向消费者的解决方案时。在最近的一期播客节目中&#xff0c;OpenAI 和前Shopify产品负责人 Miqdad Jaffer 分享了他在构建AI产品的经验和策略。下面我们将探讨构建AI产品的最佳实践&#xff0c;以及…

行为型设计模式1:状态/策略/命令

行为型设计模式&#xff1a;状态/策略/命令 (qq.com)

【秋招笔试】24-08-03-米哈游-秋招提前批笔试题

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍰 米哈游提前批笔试也是来了,本次题目…

初谈表的约束

文章目录 概念空属性默认值空属性和默认值对比列描述zerofill主键 概念 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有一个字段是emai…

Open3D 计算点云的归一化协方差矩阵

目录 一、概述 1.1原理 1.2实现步骤 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博…

文章相关接口

1.新增文章分类 文章分类的表结构和实体类 实体类 接口文档 实现 新创建CategoryController,CategoryService,(CategoryServiceImpl),CategoryMapper 在CategoryController中添加方法 使用注解PostMapping,没有映射路径&#xff0c;我们在CategoryController的类上添加一个映…

Java 并发编程:Java 中的乐观锁与 CAS

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 025 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【DOCKER】显示带UI的软件

1. Linux 1.1 宿主机开放X server权限 xhost 1.2 启动容器 docker run -it --rm --privilegedtrue --useru20 --workdir/home/u20 \ -e DISPLAYhost.docker.internal:0 u20:dev1.3 测试 # 安装测试软件 sudo apt-get -y install x11-apps# 显示测试程序 xclock2. Windows …

websocket的学习

第一步&#xff1a;配置Spring <dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> …

RabbitMQ知识总结(基本原理+高级特性)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 基本原理 消息的可靠性投递 RabbitMQ 消息的投递路径为&#xff…

Idea包含UI内容的插件开发

Idea包含UI内容的插件开发 前言插件效果项目结构配置功能的实现找一个股票接口完成最终的页面配置Plugin.xml源码地址 前言 在这一篇文章中将会做一个包含UI内容的能看股票的插件。 插件效果 首先是在设置中配置股票的编号&#xff0c;如sh000001,sh600519。 接着在侧边栏中…