使用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出现问题的解决

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统——进程同步

文章目录 进同步和互斥1.什么是进程同步和进程互斥&#xff1f;进程同步进程互斥 2.进程互斥的软件实现方式单标志法双标志检查法双标志后检查法Peterson算法 3. 进程互斥硬件实现方法中断屏蔽方法TestAndSet指令Swap指令 4. 互斥锁5. 信号量机制整形信号量记录型信号量用信号量…

Scrapy 爬取旅游景点相关数据(五)

本期内容&#xff1a;&#xff08;1&#xff09;爬取日本其他城市数据存入数据库&#xff08;2&#xff09;爬取景点评论数据 1 爬取其他城市景点数据 只爬取一个城市的数据对于做数据可视化系统可能是不够的&#xff0c;因为数据样本量少嘛&#xff0c;本期来爬取其他城市的景…

等保测评练习卷25

等级保护初级测评师试题25 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.安全区域边界对象主要根据系统中网络访问控制设备的部署情况来确定&#xff08;&#xff09;不是网络访问控制设备而…

笔试练习day2

目录 BC64 牛牛的快递题目解析解法模拟代码方法1方法2 DP4 最小花费爬楼梯题目解析解法动态规划状态表示状态转移方程代码 数组中两个字符串的最小距离题目解析解法方法1暴力解法(会超时)方法2贪心(动态规划)代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接…

Yolov8在RK3588上进行自定义目标检测(一)

1.数据集和训练模型 项目地址&#xff1a;https://github.com/airockchip/ultralytics_yolov8.git 从github(htps:l/github.com/airockchip/ultralytics_yolov8)上获取yolov8模型。 下载项目&#xff1a; git clone https://github.com/airockchip/ultralytics_yolov8.git …

Python | Leetcode Python题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; class Solution:def removeDuplicateLetters(self, s: str) -> str:vis defaultdict(int)cnt defaultdict(int)for ch in s: cnt[ch] 1queue []for ch in s:if vis[ch] 0:while queue and queue[-1] > ch and cnt[queue[-1]]:vi…

《Advanced RAG》-03-使用 RAGAs + LlamaIndex 进行 RAG 评估

摘要 文章首先介绍了 RAG 评估的三个主要部分&#xff1a;输入查询、检索上下文和 LLM 生成的响应。 提到了 RAGAs 提出的 RAG 评估指标&#xff0c;包括 Faithfulness、Answer Relevance 和 Context Relevance&#xff0c;以及 RAGAs 网站提供的两个额外指标&#xff1a;Conte…

【面试题】分发糖果

这里写自定义目录标题 题目解题问题描述解题思路详细步骤初始化左到右扫描右到左扫描计算总糖果Python 代码示例 示例示例 1示例 2 复杂度分析 题目 仅供学习 解题 使用一种贪心算法的策略解决糖果分配问题。 问题描述 给定一个整数数组 ratings&#xff0c;表示每个孩子…

联邦学习研究综述【联邦学习】

文章目录 0 前言机器学习两大挑战&#xff1a; 1 什么是联邦学习&#xff1f;联邦学习的一次迭代过程如下&#xff1a;联邦学习技术具有以下几个特点&#xff1a; 2 联邦学习的算法原理目标函数本地目标函数联邦学习的迭代过程 3 联邦学习分类横向联邦学习纵向联邦学习联邦迁移…

功能实现——使用 RestTemplate 进行跨项目接口调用

目录 1.需求说明2.项目环境搭建3.代码实现3.1.使用 RestTemplate 进行调用3.1.1.项目 A3.1.2.项目 B 3.2.测试3.3.使用 JsonObject 来传递和接收 json 数据3.3.1.说明3.3.2.代码实现 3.4.其它说明3.4.1.restTemplate.exchange()3.4.2.restTemplate.postForObject()3.4.3.区别总…

8.4 字符串中等 443 String Compression 467 Unique Substrings in Wraparound String

443 String Compression 注意&#xff1a;这里是按照顺序压缩&#xff0c;不忽略顺序就不能用字母表计数再还原了。 如果char num 1 只需要压入char本身 num > 1 时还需要压入char的个数 按字符压入 class Solution { public:vector<char> Push(vector<char>&a…

Debug-019-git reflog的两种使用场景

前情&#xff1a;最近在开发项目中对版本管理有了新的理解&#xff0c;感觉在这方面有了新的收获。同时学习了一个新的git指令&#xff1a;git reflog 实际了解之后&#xff0c;发现这个指令不是很常用&#xff0c;但是对于特定的场景的话它还是非常比较方便 这里我列举两种我…

Nextjs——国际化那些事儿

背景&#xff1a; 某一天&#xff0c;产品经理跟我说&#xff0c;我们的产品需要搞国际化 国际化的需求说白了就是把项目中的文案翻译成不同的语言&#xff0c;用户想用啥语言来浏览网页就用啥语言&#xff0c;虽然说英语是通用语言&#xff0c;但国际化了嘛&#xff0c;产品才…

算法--初阶

1、tips 1.1、set求交集 {1,2,3} & {2,3} & {1,2} {2} 其实就是位运算&#xff0c; 只有set可以这样使用&#xff0c; list没有这种用法 {1,2,3} | {2,3, 4} | {1,2} {1, 2, 3, 4} 并集 1.2、*与** * 序列(列表、元组)解包&#xff0c;如果是字典&#xff0c;那…

第一个 Flask 项目

第一个 Flask 项目 安装环境创建项目启动程序访问项目参数说明Flask对象的初始化参数app.run()参数 应用程序配置参数使用 Flask 的 config.from_object() 方法使用 Flask 的 config.from_pyfile() 方法使用 Flask 的 config.from_envvar() 方法步骤 1: 设置环境变量步骤 2: 编…

【C++学习第19天】最小生成树(对应无向图)

一、最小生成树 二、代码 1、Prim算法 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 510, INF 0x3f3f3f3f;int n, m; int g[N][N]; int dist[N]; bool st[N];int prim() {memset(dist, 0x3f, sizeof di…

学习分享:解析电商 API 接入的技术重难点及解决方案

在当今电商业务迅速发展的时代&#xff0c;接入电商 API 已成为许多企业提升竞争力和拓展业务的重要手段。然而&#xff0c;在这个过程中&#xff0c;往往会遇到一系列的技术重难点。本文将深入解析这些问题&#xff0c;并提供相应的解决方案。 一、电商 API 接入的技术重难点 …

c++ 初始值设定项列表(initializer_list)

引例 我们在写c代码的时候&#xff0c;多多少少会遇到这样写的&#xff1a; 如果是这样写还好说&#xff1a; 第一个是因为编译器强制匹配参数。 其他都是因为在有对应构造函数的情况下支持的隐式类型转换。 而支持的构造函数是这个&#xff1a; 如果有不懂的可以开这一篇&a…

麦田物语第十八天

系列文章目录 麦田物语第十八天 文章目录 系列文章目录一、(Editor)制作 [SceneName] Attribute 特性二、场景切换淡入淡出和动态 UI 显示一、(Editor)制作 [SceneName] Attribute 特性 在本节课我们编写Unity的特性Attribute来更好的完善我们项目,具体是什么呢,就是当…

深入理解 ReLU 激活函数及其在深度学习中的应用【激活函数、Sigmoid、Tanh】

ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数 ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数是一种广泛应用于神经网络中的非线性激活函数。其公式如下&#xff1a; ReLU ( x ) max ⁡ ( 0 , x ) \text{ReLU}(x) \max(0, x) ReLU(x)max(0,x) 在…