K8S详细安装教程以及错误解决方案(包括前置环境,使用部署工具kubeadm来引导集群)

news2024/9/24 8:34:26

准备工作(来自官方文档)

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux
    发行版以及一些不提供包管理器的发行版提供通用的指令。
  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。 CPU 2 核心及以上。
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
  • 开启机器上的某些端口。请参见这里了解更多详细信息。
  • 禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区。

	# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
	sudo setenforce 0
	sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
	#关闭swap
	swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

可以选择一次性运行命令(不需要执行上面的命令):
sudo setenforce 0 && sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config && swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

转发 IPv4 并让 iptables 看到桥接流量(官网链接)

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay && sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

启用必要端口

启用这些必要的端口后才能使 Kubernetes 的各组件相互通信。 可以使用 netcat 之类的工具来检查端口是否启用,例如:

nc 127.0.0.1 6443

你使用的 Pod 网络插件 (详见后续章节) 也可能需要开启某些特定端口。 由于各个 Pod 网络插件的功能都有所不同,请参阅他们各自文档中对端口的要求。

安装容器运行时

为了在 Pod 中运行容器,Kubernetes 使用 容器运行时(Container Runtime)。
默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
如果你不指定运行时,kubeadm 会自动尝试通过扫描已知的端点列表来检测已安装的容器运行时。
如果检测到有多个或者没有容器运行时,kubeadm 将抛出一个错误并要求你指定一个想要使用的运行时。

以docker为例

docker运行环境的安装
1、方式一

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
systemctl start docker.service
systemctl enable docker.service
docker -v

2、方式二

① 移除以前docker相关包

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

② 配置yum源

sudo yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

③ 安装docker

yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6

④ 启动并设置开机自启

systemctl enable docker --now

配置加速("registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]为阿里云申请的镜像加速,如有需要可自行前往申请),申请方式见链接

这里一定要配置,不然后续kubelet会启动失败,报错如下
在这里插入图片描述

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3i54s1l9.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

基础环境

#各个机器设置自己的域名
hostnamectl set-hostname xxxx

安装 kubeadm、kubelet 和 kubectl

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.23.6 kubeadm-1.23.6 kubectl-1.23.6 --disableexcludes=kubernetes && sudo systemctl enable --now kubelet

#kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

下面标注##包围的范围内master才需要执行,子节点不需要执行

#####################################################################################################
###############################################主节点执行#############################################
#####################################################################################################

使用 kubeadm 创建集群

准备所需的容器镜像(跳过该步骤)

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

初始化主节点

#所有机器(master+其他worker节点)添加master域名映射,192.168.2.100需要修改为自己的master节点ip
echo "10.8.0.8  cluster-endpoint" >> /etc/hosts

#主节点初始化(master) 10.8.0.8为主节点ip,cluster-endpoint为上一步配置的主节点映射域名,registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images为个人镜像仓库地址
kubeadm init \
--apiserver-advertise-address=10.8.0.8 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.224.0.0/16 \
--pod-network-cidr=192.225.0.0/16

#主节点初始化配置中,所有网络范围不重叠,pod-network-cidr若更改,注意后续有一项配置也需要更改

初始化成功后见下图(复制kubeadm join相关语句,后续加入节点时会使用)
在这里插入图片描述

要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果你是 root 用户,则运行:

export KUBECONFIG=/etc/kubernetes/admin.conf

安装网络组件

版本对应关系可访问链接https://docs.tigera.io/archive/v3.21/getting-started/kubernetes/requirements(中间的v3.21版本变化即可访问不同版本的对应关系)
在这里插入图片描述
在这里插入图片描述

前面初始化主节点时提到的配置变化,这里需要注意,将下载的文件做一定的更改,与前面配置的ip相同,如果前面的ip(192.168.0.0)未更改则无需更改

wget https://docs.projectcalico.org/v3.24/manifests/calico.yaml --no-check-certificate

在这里插入图片描述

# 执行下面的命令将docker.io/c变更为c
sed -i 's/docker.io\/c/c/g' calico.yaml &&  kubectl apply -f calico.yaml

在这里插入图片描述

#####################################################################################################
###############################################主节点执行结束##########################################
#####################################################################################################

加入node节点

kubeadm join cluster-endpoint:6443 --token vv1m8c.55hlkvzvutu0qk84 \
        --discovery-token-ca-cert-hash sha256:821f36f85d519bfffd6e45f6805588bc99d20805c4ebf9b10333a1c33749bb8c

如果没有令牌,可以通过在主master节点上运行以下命令来获取令牌:

kubeadm token list

默认情况下,令牌会在 24 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:kubeadm token create --print-join-command
加入成功后使用kubectl get nodes查看节点信息
在这里插入图片描述

错误解决:

如果使用VPN搭建私有网络时,服务器做master节点,注册时将会报错,显示calico超时的错误,如下

2023-09-07 12:12:18.566 [FATAL][1] cni-installer/<nil> <nil>: Unable to create token for CNI kubeconfig error=Post "https://10.96.0.1:443/api/v1/namespaces/kube-system/serviceaccounts/calico-node/token": dial tcp 10.96.0.1:443: i/o timeout

在这里插入图片描述

此时需要在master节点中的calico配置文件中对应的位置加入下面的语句,然后重新安装calico插件,其中tun0代表的是自己的VPN网卡名称

            - name: IP_AUTODETECTION_METHOD
              value: "interface=tun0"

在这里插入图片描述

如果上面的方式不行,请设置自定义的ip,也许是ip有冲突,就算是看不见冲突,也尝试改变一下,代替默认的ip,同时记得更改calico.yaml中的设置
在这里插入图片描述
当你怎么弄都不行的时候,请尝试所有机器执行以下命令

# 重置kubeadmin(所有)
kubeadmin reset
# 重置iptables(master)
iptables -F
# 删除旧的calico网络配置文件(所有)
 rm -rf /etc/cni/net.d
 # 删除旧的环境变量(master)
rm -rf  $HOME/.kube/config
# 还不行就执行下面的语句(所有),ip对应各个机器的ip地址
echo "10.8.0.8  k8s-master" >> /etc/hosts
echo "10.8.0.4  k8s-node1" >> /etc/hosts
echo "10.8.0.9  k8s-node2" >> /etc/hosts

仍然不行请就自己的问题百度找寻解决方案(该文章为个人搭建学习使用),综合了多方视频教程融合起来整理的方案,若仍未能解决你的问题或满足你的需求,望谅解!

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

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

相关文章

kubeadm 安装k8s

目录 安装k8s 环境准备 所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff08;必须关闭swap分区&#xff09; //修改主机名 //所有节点修改hosts文件 //调整内核参数 所有节点安装docker 所有节点安装kubeadm&#xff0c;kube…

在线考试组卷Word文档导出|废纸篓|支持搜索组员查看练习情况|官网上线

土著刷题微信小程序v1.16&#xff0c;主要是对系统功能的优化&#xff0c;同时迭代开发了反馈热度比较高的【在线考试组卷word文档导出】和废纸篓功能。 下面将逐条介绍一下这一版的新功能和优化点。 在线考试组卷Word文档导出 【组卷Word导出】这个功能对于线下组织考试是个刚…

自动化运维工具Ansible教程(二)【进阶篇】

文章目录 前言Ansible 入门到精通自动化运维工具Ansible教程(一)【入门篇】自动化运维工具Ansible教程(二)【进阶篇】精通篇 进阶篇1. Ansible 的高级主题&#xff08;例如&#xff1a;角色、动态清单、变量管理等&#xff09;**1. 角色&#xff08;Roles&#xff09;**&#x…

linux-进程-execl族函数

exec函数的作用&#xff1a; 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 简单来说就是&…

看完这篇 教你玩转渗透测试靶机Vulnhub——Momentum:1

Vulnhub靶机Momentum:1渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;漏洞发现&#xff1a;③&#xff1a;漏洞利用&#xff1a;④&#…

《Effective STL》读书笔记(二):vector和string

vector 和 string 优先于动态分配数组 当使用new动态分配内存时&#xff0c;我们需要关注以下内容 必须保证动态分配的内存会被delete&#xff0c;否则会造成资源泄露必须确保使用了正确的delete形式。如果分配了单个对象&#xff0c;则必须使用delete&#xff1b;如果分配了…

选择最适合您的Bug管理软件:市场比较与推荐

“Bug管理软件哪家好&#xff1f;市场上有许多优秀的Bug管理系统品牌如&#xff1a;Zoho Projects、JIRA、Redmine、Bugzilla、MantisBT。” 一款高效的Bug管理系统可以帮助团队更有效地发现、记录和解决软件中的问题&#xff0c;从而提高产品质量和用户满意度。本文将为您介绍…

JavaScript基础07——变量拓展-数组

哈喽&#xff0c;大家好&#xff0c;我是雷工! 每天打卡学习一点点&#xff0c;今天继续学习JavaScript基础知识&#xff0c;以下是学习笔记。 一、数组的基本介绍 数组 &#xff08;Array&#xff09;——一种将一组数据存储在单个变量名下的优雅方式。 数组的作用和变量一样…

【电源专题】典型设备的接地设计

在文章:【电源专题】接地的类型 中我们讲到不同的历史时期接地概念是不同的,有为了安全的电气接地和物理接地,也有为了提供参考电位的接地。 那么在设备接地的设计中,我们会怎么进行操作呢? 在文章【电源专题】接地的类型讲到一个混合接地的例子,我们可以把大功率的地接…

DF竞赛平台化身隐私计算大赛“超强助攻”,助力打造专业人才试炼场!

在技术可用性提升、应用需求增强以及政策大力支持的共同作用下&#xff0c;作为保障数据要素安全可信流通的有效技术手段&#xff0c;隐私计算技术火热发展&#xff0c;应用开始逐渐落地。在此背景下&#xff0c;中国信息通信研究院和中国通信学会联合行业多方力量&#xff0c;…

【MySQL】MySQL的安装,登录,配置和相关命令

文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1&#xff1a;获取临时root密码方法2&#xff1a;没有密码方法3&#xff1a;配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器&#xff1b;Linux&#xff1a;Centos7…

【excel密码】excel文件加密方法总结:

想要给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff0c;只有输入了正确的密码才能打开并且编辑文件&#xff0c;如果密码错误…

[A题]2023 年全国大学生数学建模比赛思路、代码更新中.....

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java高并发系列: 使用wait - notify实现高效异步方法

1. 背景 在项目开发中, 通常会有异步执行操作, 例如: 提交一个异步清空一系列数据库中ID ${_id} 的记录, 这个时候通常的做法是主线程将任务添加到一个异步队列中, 后台维护一个线程不断地循环扫描这个队列, 如果有需要执行的任务, 则执行相应的逻辑. 如下图所示: 2. 一个简…

Discourse 附件无法显示的跟进

今天登录表以后&#xff0c;发现数据又被清理了部分。 然后我们又重新使用 SQL 导入了数据。 这个让我们感觉 Discourse 的系统中应该设置了自动清理程序&#xff0c;在这个自动清理程序中会对认为没有使用的附件或者图片进行清理。 因为我们更换了存储空间&#xff0c;所以这…

在Linux中使用shell指令完成文件打包、压缩、解压缩

一、写一个1.sh脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件dir在dir下创建dir1和dir2把当前目录下的所有文件拷贝到dir1中&#xff0c;把当前目录下的所有脚本文件拷贝到dir2中把dir2打包并压缩为dir2.tar.xz再把dir2.tar.xz移动到dir1中解压dir1中的压缩包…

triton 客戶端用https协议访问服务

背景 平时调用模型服务&#xff0c;都是用httpIP的链接调用。但由于笔者环境的特殊性&#xff0c;访问模型必须经过一个https的公网URL&#xff0c;所以&#xff0c;如何用triton client访问https链接成为了一个问题 参考 TensorRT&Triton学习笔记(一)&#xff1a;trito…

win7安装python3.8.10遇到的问题及解决办法和相关资源

在我的另一篇文章中&#xff0c;已经测试了win7安装不了python3.10.8 https://blog.csdn.net/kxltsuperr/article/details/132666737 那么&#xff0c;经过搜索&#xff0c;说win7最高可以安装python3.8.10&#xff0c;于是进行安装&#xff0c;结果报错&#xff0c;如下图&a…

【实战】React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(总结展望篇)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

结构型模式-过滤器模式

允许开发人员使用不同的标准来过滤一组对象&#xff0c;通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式&#xff0c;它结合多个标准来获得单一标准。 AllArgsConstructor Data public class Person {private String name;private String gender;p…