搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南

一. K8S 简介

K8S 是谷歌开源的一个容器编排解决方案,随着如今云原生技术越来越火热,掌握K8S核心技能,对于研发人员来说,也变得愈发重要。

本篇主要分享Centos7生产环境可用的K8S集群的搭建。

二. K8S 学习的几大拦路虎

k8S 学习起来有几大拦路虎:

2.1 K8S 安装对硬件要求比较高

硬件方面的解决方案一般有五个:

  1. 公司提供服务器资源,供你尝试。
  2. 公司直接购买K8S云服务
  3. 自己直接购买K8S云服务
  4. 自己去云服务厂商那里租一个月的两台高性能的服务器即可
  5. 自己买一台高性能的电脑,比如 博主买的64G,1TB 配置的RMBP, 可以轻松搭建各种集群环境。

2.2. K8S 对使用者来说要求掌握的知识点也比较多

涉及到Linux操作系统和命令,以及网络层相关的概念和知识。

2.3 K8S 的网络限制

K8S 是国外开源的,有些安装包对于国内来说可能无法下载,因此一般来说,会采取国内镜像站或购买香港区的云服务器来解决。

点击查看阿里云K8S最新镜像配置

2.4 K8S 学习资料

三. Centos7 安装K8S指南

接下里我们讲解如何在Centos7 服务器上安装K8S集群。

3.1 K8S安装硬件要求

3.1.1 操作系统硬件资源

  • 一台兼容的 Linux 主机: 这里我们选用企业最稳定的Centos 系统,当然如果你乐意也可以选择Ubuntu。

Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。

  • 每台机器至少 2个CPU
  • 每台机器至少 2G 内存
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
  • 开启机器上的某些端口。
  • 禁用交换分区。
    • 为了保证 kubelet 正常工作,你 必须 禁用交换分区。

这里我们采用最小化原则,实际生产环境最好大于这个配置。

指标指标值
CPU2核
内存2048M

3.1.2 操作系统基础配置

配置项配置值
Date & TimeAsia/Shanghai timezone
KeyBOARDEnglish(US)
SOFTWARE SELECTIONMinimal Install
INSTALLATION DESTINATIONAUtomatic partitiong selected
NetWORK & HOST NAMEWired(ens33) connected

3.1.3 设置账号密码

账号密码备注
root自己设置超级管理员密码
xingyun自己设置普通用户密码,示例:我这里采用xingyun作为普通用户账号,密码就不告诉你们了

3.2 基础软件包安装

由于我们选择是Minimal Install 的操作系统,因此一些基础软件安装包需要我们自己安装,这样的目的是为了学习。

3.2.1 安装net-tools网络软件包

执行如下命令,安装Linux下的网络软件包

yum install -y net-tools

安装之后我们才可以使用ifconfig命令获取我们的系统IP

获取当前操作系统IP

ifconfig

执行成功如下所示:
在这里插入图片描述

3.2.2 安装nmap-ncat软件包

默认Centos7没有安装nmap-ncat,因此可能我们无法执行nc命令,因此首先需要安装nmap-ncat网络工具包:

yum install -y nc

为什么安装nmap-ncat?

  • 比如安装了nc才可以执行如下命令来检查当前机器是否开通了6443端口
nc 127.0.0.1 6443

3.2.3 安装yum-utils 工具库

  • 安装yum-utils 工具库
sudo yum install -y yum-utils

3.2.4 安装wget工具包

为了下载文件方便,我们下载一个工具包

sudo yum install -y wget

3.3 K8S 安装所需系统设置

3.3.1 禁用交换分区

彻底禁用交换分区(需要重启系统)

  • 编辑fstab 文件
vi /etc/fstab
  • 注释掉swap那一行,然后重启服务器。
#
# /etc/fstab
# Created by anaconda on Wed Jun 30 07:32:55 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=b6233615-66c1-413c-a199-b486265ee5df /boot                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
swapoff -a 
  • 重启服务器
reboot
  • 验证交换分区是否关闭
free -h

如果返回如下内容说明禁用成功
在这里插入图片描述

3.3.2 配置防火墙网络策略

  • k8s-master 节点端口策略需满足如下网络策略:
协议方向端口范围目的使用者
TCP入站6443Kubernetes API server所有
TCP入站2379-2380etcd server client APIkube-apiserver, etcd
TCP入站10250Kubelet API自身, 控制面
TCP入站10259kube-scheduler自身
TCP入站10257kube-controller-manager自身
  • work-node节点端口策略需满足如下网络策略:
协议方向端口范围目的使用者
TCP入站10250Kubelet API自身, 控制面
TCP入站30000-32767NodePort Services†所有

配置方式有两种:

  • 一种是使用Centos7 基于iptables封装的firewalld 防火墙
  • 另外一种是直接使用经典基础的iptables 防火墙
3.3.2.1 方法一:使用firewalld防火墙配置端口策略

一般如果用的阿里云云服务器,firewalld 防火墙默认是关闭的,启用的是iptables 防火墙可不处理。

如果不是阿里云的Centos7 服务器,可通过如下方式精确配置端口策略

Master 节点机器配置如下策略:

#!/bin/bash
firewall-cmd --permanent --add-port=6443/tcp --zone=public
firewall-cmd --permanent --add-port=2379/tcp --zone=public
firewall-cmd --permanent --add-port=2380/tcp --zone=public
firewall-cmd --permanent --add-port=10250/tcp --zone=public
firewall-cmd --permanent --add-port=10259/tcp --zone=public
firewall-cmd --permanent --add-port=10257/tcp --zone=public
firewall-cmd --reload

Node 节点机器配置如下端口策略:

#!/bin/bash
firewall-cmd --permanent --add-port=10250/tcp --zone=public
firewall-cmd --permanent --add-port=30000-32767/tcp --zone=public
firewall-cmd --reload
  • 如果需要暴力停止防火墙运行,可执行如下命令:
systemctl stop firewalld

如果需要禁用firewalld防火墙,可输入如下命令:

systemctl disable firewalld

执行成功如下所示:
在这里插入图片描述

  • 也有的服务器防火墙关闭是如下方法:
systemctl stop firewalld.service
3.3.2.2 方法二:精确开通iptables网络额端口策略(推荐)

如果使用的是阿里云Centos7服务器,则默认使用的是经典的iptables 配置端口策略

Master 节点机器配置如下策略:

iptables -I INPUT -p tcp --dport 6443 -j ACCEPT
iptables -I INPUT -p tcp --dport 2379 -j ACCEPT
iptables -I INPUT -p tcp --dport 2380 -j ACCEPT
iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
iptables -I INPUT -p tcp --dport 10259 -j ACCEPT
iptables -I INPUT -p tcp --dport 10257 -j ACCEPT
  • 我们还需要保存这些iptables策略配置否则每次重启这些端口策略就丢失了。

依次执行如下命令:

systemctl stop firewalld
systemctl mask firewalld
yum install -y iptables-services
systemctl enable iptables
service iptables save
  • mast命令是屏蔽的意思,目的是为了防止执行特定功能的相似服务类型之间发生冲突,使用了掩码。
  • 比如防火墙,CentOS 7同时具备iptables和firewalld服务;但是,建议一次只使用一个。
  • 因此,两个防火墙服务之一被屏蔽以防止两个服务之间发生冲突

Node 节点机器配置如下端口策略:

work-node节点需配置iptables开放端口,依次输入命令如下:

iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
iptables -I INPUT -p tcp --dport 30000:32767 -j ACCEPT

我们还需要保存这些iptables策略配置否则每次重启这些端口策略就丢失了。

依次执行如下命令:

systemctl stop firewalld
systemctl mask firewalld
yum install -y iptables-services
systemctl enable iptables
service iptables save
  • mast命令是屏蔽的意思,目的是为了防止执行特定功能的相似服务类型之间发生冲突,使用了掩码。
  • 比如防火墙,CentOS 7同时具备iptables和firewalld服务;但是,建议一次只使用一个。
  • 因此,两个防火墙服务之一被屏蔽以防止两个服务之间发生冲突

查看当前系统运行tcp/ip 协议端口:

netstat -ntpl

3.3.3 允许 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

在这里插入图片描述
设置允许ip转发

echo 1 > /proc/sys/net/ipv4/ip_forward

否则会报错如下:

[root@my-k8s-node-03 ~]# kubeadm join 192.168.159.224:6443 --token abcdef.0123456789abcdef \
>         --discovery-token-ca-cert-hash sha256:d7bf989b933034cc3be0878d79584217b8b1f9ec5df7584f6acd9d6379e415fb 
[preflight] Running pre-flight checks
        [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 23.0.1. Latest validated version: 20.10
        [WARNING Hostname]: hostname "my-k8s-node-03" could not be reached
        [WARNING Hostname]: hostname "my-k8s-node-03": lookup my-k8s-node-03 on 192.168.159.2:53: no such host
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

3.3.4 在主机上禁用SELINUX,让容器可以读取主机文件系统

setenforce 0

3.3.5 拍摄系统快照(非必需)

如果使用的虚拟机搭建K8S集群,最好操作完上面内容后就拍摄下快照,一旦我们下面的设置有问题可以直接回滚到之前状态。
在这里插入图片描述

3.3.6 克隆四台机器

完成上面步骤后基于上面的操作系统克隆复制四台机器,其中包括一台master 和三台node 节点机器

主机名IP
my-k8s-master-01192.168.159.224
my-k8s-node-01192.168.159.188
my-k8s-node-02192.168.159.192
my-k8s-node-03192.168.159.197

3.3.7 修改主机名

由于节点之间不可以有重复的主机名,因此我们需要修改主机名称,购买的云主机不需要,因为自动编号好了,肯定不会重复。

3.3.7.1 查看当前主机名
hostnamectl

执行成功如下所示:在这里插入图片描述

Centos7的主机名保存在/etc/hostname文件里,所以我们也可以通过查看文件命令查看主机名称:

cat /etc/hostname

在这里插入图片描述

3.3.7.2 修改主机名
  • my-k8s-master更新主机名:
sudo hostnamectl set-hostname my-k8s-master-01
  • 验证修改后的主机名
# 验证修改后的主机名
hostnamectl

在这里插入图片描述

  • my-k8s-node-01更新主机名:
#设置主机名
sudo hostnamectl set-hostname my-k8s-node-01
  • my-k8s-node-02更新主机名:
#设置主机名
sudo hostnamectl set-hostname my-k8s-node-02
  • my-k8s-node-03更新主机名:
#设置主机名
sudo hostnamectl set-hostname my-k8s-node-03
  • 断开session, 重新登录生效,不需要重启。

3.3.8 修改Hosts 域名解析

由于主机名变化了,所以还需要更新 etc/hosts 文件,否则无法将主机名解析为 127.0.0.01

  • 点击查看当前的hosts 文件
cat /etc/hosts

可以看到修改之前内容如下:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

编辑hosts 文件,输入如下命令:

vi /etc/hosts

修改之后内容如下:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.159.224 my-k8s-master-01
192.168.159.224 cluster.local
192.168.159.188 my-k8s-node-01
192.168.159.192 my-k8s-node-02
192.168.159.197 my-k8s-node-03

Tips:

  • 这里的域名解析需要修改成自己服务器的内网IP
  • 每一个节点的/etc/hosts都需要配置这个hosts
  • 理论上为了彼此可以正常解析,这里直接配置了hosts中,如果你有DNS解析服务器则不需要这么配置。

3.3.9 修改DHCP 为静态IP

如果使用虚拟机,则需要将默认的DHCP 自动分配IP 修改为手动配置静态IP。

Mac OSX下使用VMware Fusion 配置静态IP 图文教程指南

3.4 K8S 安装步骤

每台服务器上需要安装如下组件:

安装组件名称功能说明
kubeadm用来初始化集群的指令
kubelet在集群中的每个节点上用来启动 Pod 和容器等。
kubectl用来与集群通信的命令行工具。

接下来我们开始在Centos7 上安装K8S.

3.4.1 安装Docker

  • 添加Docker 下载镜像库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 激活使用稳定版本Docker
sudo yum-config-manager --enable docker-ce-nightly
  • 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io

更多详情 Centos7 安装Docker教程见:如何在Centos7上安装或卸载Docker?

3.4.2 添加docker到开机启动项并启动服务

systemctl enable docker && systemctl start docker

3.4.3 添加K8S国内仓库镜像

由于国内网络原因,因此我们需要安装镜像方可下载。

点击查看阿里云K8S 最新镜像配置

将配置文件写入到/etc/yum.repos.d/kubernetes.repo

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

3.4.4 配置Docker镜像加速器

在国内访问 Docker 官方的镜像,一直以来速度都慢如蜗牛,为了快速访问 Docker 官方镜像都会配置三方加速器:

镜像地址
https://aglljvvp.mirror.aliyuncs.com博主自己的阿里云Docker镜像加速器
https://kfwkfulq.mirror.aliyuncs.com某路人甲
https://2lqq34jg.mirror.aliyuncs.com某路人乙
https://pee6w651.mirror.aliyuncs.com某路人丙
https://hub-mirror.c.163.com网易Docker镜像加速器
https://docker.mirrors.ustc.edu.cn中国科技大学Docker镜像加速器
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors":[
"https://aglljvvp.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF

注意,这里其实配置一个就行,为了避免当阿里云镜像加速器出现问题时有备用的自动切换,因此配置了多个。

  • 验证当前docker配置驱动类型
docker info | grep Cgroup

执行成功如下所示:
在这里插入图片描述
重启docker

systemctl daemon-reload
systemctl restart docker
  • 验证当前docker配置驱动类型
docker info | grep Cgroup

在这里插入图片描述

3.4.5 my-k8s-master-01节点安装K8S 三件套(kubelet,kubeadm,kubectl)

当前稳定版本一种有如下四个:
在这里插入图片描述

软件包说明
kubeadm用来初始化集群的指令
kubelet在集群中的每个节点上用来启动 Pod 和容器等
kubectl用来与集群通信的命令行工具
yum install -y --nogpgcheck kubelet-1.23.10 kubeadm-1.23.10 kubectl-1.23.10

ps:

  • 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况,因此请使用–nogpgcheck命令忽略检索gpg.
  • 如果直接执行 yum install -y --nogpgcheck kubele kubeadm kubectl 将会始终安装最新版本
  • 但是自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除,即默认不支持Docker,具体影响请阅读 Dockershim 移除的常见问题了解更多详情。

这里要重点强调下 从v1.24.0版本开始,K8S移除了Docker的支持。

  • 为什么从v1.24.0版本开始,K8S移除了Docker的支持呢?
    • Kubernetes 的早期版本仅适用于特定的容器运行时:Docker Engine。
    • 后来,Kubernetes 增加了对使用其他容器运行时的支持。
    • 创建 CRI 标准是为了实现编排器(如 Kubernetes)和许多不同的容器运行时之间交互操作。
    • Docker Engine 没有实现(CRI)接口,因此 Kubernetes 项目创建了特殊代码来帮助过渡, 并使 dockershim 代码成为 Kubernetes 的一部分。 dockershim 代码一直是一个临时解决方案(因此得名:shim)。
    • 你可以阅读 Kubernetes 移除 Dockershim 增强方案 以了解相关的社区讨论和计划。 事实上,维护 dockershim 已经成为 Kubernetes 维护者的沉重负担。
    • 此外,在较新的 CRI 运行时中实现了与 dockershim 不兼容的功能,例如 cgroups v2 和用户命名空间。
    • 从Kubernetes 中移除 dockershim 允许在这些领域进行进一步的开发。
  • Docker 依赖详解
    • 容器运行时是一个软件, 用来运行组成 Kubernetes Pod 的容器。 Kubernetes 负责编排和调度 Pod;在每一个节点上,kubelet 使用抽象的容器运行时接口,所以你可以任意选用兼容的容器运行时。
    • 在早期版本中,Kubernetes 提供的兼容性支持一个容器运行时:Docker。 在 Kubernetes
      后来的发展历史中,集群运营人员希望采用别的容器运行时。 于是 CRI 被设计出来满足这类灵活性需求 - 而 kubelet 亦开始支持CRI。
    • 然而,因为 Docker 在 CRI 规范创建之前就已经存在,Kubernetes 就创建了一个适配器组件 dockershim。
      dockershim 适配器允许 kubelet 与 Docker 交互,就好像 Docker 是一个 CRI 兼容的运行时一样。
      在这里插入图片描述
  • 我现有的容器镜像是否仍然有效?
    • 是的,从 docker build 生成的镜像将适用于所有 CRI 实现, 现有的所有镜像仍将完全相同。
  • 在 Kubernetes 1.23 版本中还可以使用 Docker Engine 吗?
    • 可以使用,在 1.20 版本中唯一的改动是,如果使用 Docker Engine, 在 kubelet 启动时会打印一个警告日志。 你将在 1.23 版本及以前版本看到此警告,dockershim 已在 Kubernetes 1.24 版本中移除 。
    • 如果你运行的是 Kubernetes v1.24 或更高版本,请参阅 我仍然可以使用 Docker Engine 作为我的容器运行时吗? (如果你使用任何支持 dockershim 的版本,可以随时切换离开;从版本 v1.24 开始,因为 Kubernetes 不再包含
      dockershim,你必须切换)。
  • 我仍然可以使用 Docker Engine 作为我的容器运行时吗?
    • 首先,如果你在自己的电脑上使用 Docker 用来做开发或测试容器:它将与之前没有任何变化。 无论你为 Kubernetes 集群使用什么容器运行时,你都可以在本地使用 Docker。容器使这种交互成为可能。

    • Mirantis 和 Docker 已承诺 为 Docker Engine 维护一个替代适配器, 并在 dockershim 从 Kubernetes 移除后维护该适配器。 替代适配器名为 cri-dockerd

    • 你可以安装 cri-dockerd 并使用它将 kubelet 连接到 Docker Engine。 阅读将 Docker Engine 节点从 dockershim 迁移到 cri-dockerd 以了解更多信息。

  • 我应该用哪个 CRI 实现?
    • 是一个复杂的问题,依赖于许多因素。 如果你正在使用 Docker Engine,迁移到 containerd 应该是一个相对容易地转换,并将获得更好的性能和更少的开销。 然而,我们鼓励你探索 CNCF landscape 提供的所有选项,做出更适合你的选择。
  • 现在是否有在生产系统中使用其他运行时的例子?
    • Kubernetes 所有项目在所有版本中出产的工件(Kubernetes 二进制文件)都经过了验证。
    • 此外,kind 项目使用 containerd 已经有一段时间了,并且提高了其用例的稳定性。 Kind 和 containerd 每天都会被多次使用来验证对 Kubernetes 代码库的任何更改。
      其他相关项目也遵循同样的模式,从而展示了其他容器运行时的稳定性和可用性。
    • 例如,OpenShift 4.x 从 2019 年 6 月以来,就一直在生产环境中使用 CRI-O 运行时。
    • 至于其他示例和参考资料,你可以查看 containerd 和 CRI-O 的使用者列表, 这两个容器运行时是云原生基金会(CNCF)下的项目。

后续解决方案

如果使用K8S 大于等于v1.24.0 版本的解决方案:

  • 方案一:回退到 K8S v1.23.0版本
  • 方案二: 使用K8S V1.24.0 + ,那么配置使用cri-dockerd 适配Docker
  • 方案三: 使用K8S V1.24.0 + ,那么打包的镜像不受影响,取消使用Dcoker,使用kind 替换解决方案

3.4.6 my-k8s-master-01添加kubelet到开机启动项并启动服务

systemctl enable kubelet && systemctl start kubelet

3.4.7 my-k8s-master-01检查kubectl安装版本

kubectl version

执行后提示内容如下:

Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.10", GitCommit:"7e54d50d3012cf3389e43b096ba35300f36e0817", GitTreeState:"clean", BuildDate:"2022-08-17T18:32:54Z", GoVersion:"go1.17.13", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

3.4.8 my-k8s-master-01获取集群初始化默认配置文件

kubeadm config print init-defaults > init-default.yaml

复制一份

cp init-default.yaml config.yaml

3.4.9 my-k8s-master-01拉取下载K8S依赖的镜像

当前稳定版本一种有如下四个:
在这里插入图片描述

由于集群初始化需要拉取下载依赖的镜像,为了加快初始化速度,建议先单独拉取镜像再执行初始化集群命令。
所有 Kubernetes 容器镜像都部署到 k8s.gcr.io 容器仓库。

官方关于 Kubernetes依赖镜像说明

  • k8s依赖镜像 v1.24.0
容器镜像支持架构
k8s.gcr.io/kube-apiserver:v1.24.0amd64, arm, arm64, ppc64le, s390x
k8s.gcr.io/kube-controller-manager:v1.24.0amd64, arm, arm64, ppc64le, s390x
k8s.gcr.io/kube-proxy:v1.24.0amd64, arm, arm64, ppc64le, s390x
k8s.gcr.io/kube-scheduler:v1.24.0amd64, arm, arm64, ppc64le, s390x
k8s.gcr.io/conformance:v1.24.0amd64, arm, arm64, ppc64le, s390x
  • k8s依赖镜像 v1.25.0
容器镜像支持架构
registry.k8s.io/kube-apiserver:v1.25.0amd64, arm, arm64, ppc64le, s390x
registry.k8s.io/kube-controller-manager:v1.25.0amd64, arm, arm64, ppc64le, s390x
registry.k8s.io/kube-proxy:v1.25.0amd64, arm, arm64, ppc64le, s390x
registry.k8s.io/kube-scheduler:v1.25.0amd64, arm, arm64, ppc64le, s390x
registry.k8s.io/conformance:v1.25.0amd64, arm, arm64, ppc64le, s390x

一般没有梯子是无法直接访问的,报错信息如下:

[init] Using Kubernetes version: v1.23.2
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.23.2: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
        [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager:v1.23.2: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
        [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-scheduler:v1.23.2: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": dial tcp 142.250.157.82:443: i/o timeout
, error: exit status 1
        [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-proxy:v1.23.2: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
        [ERROR ImagePull]: failed to pull image k8s.gcr.io/pause:3.6: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
        [ERROR ImagePull]: failed to pull image k8s.gcr.io/etcd:3.5.1-0: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": dial tcp 142.250.157.82:443: i/o timeout
, error: exit status 1
        [ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns/coredns:v1.8.6: output: Error response from daemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

可通过如下三种方式解决,推荐下载方式一

3.4.9.1 下载方式一:修改k8s集群初始化配置文件直接下载阿里云镜像(国内推荐这种)

修改config.yaml 文件

vi config.yaml

修改后config.yaml 内容如下:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 0.0.0.0
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: my-k8s-master-01-node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
  • token: abcdef.0123456789abcdef这里生产环境一定要修改下,这个token是其他节点加入master节点所需要的token凭据
    值得注意的是:token字段的值 必须符合这个正则表达式:\\A([a-z0-9]{6})\\.([a-z0-9]{16})\\z
  • advertiseAddress 配置成0.0.0.0 表示当前服务器地址即可,如果有多个网卡可配置具体的IP地址。
  • imageRepository 由于国内网络限制无法直接通过k8s.gcr.io下载k8s相关镜像,因此必须使用国内的镜像副本registry.cn-hangzhou.aliyuncs.com/google_containers
  • name 默认node ,建议改成my-k8s-master-01-node , 因为这个name值就是后面我们获取到的节点名称

在这里插入图片描述

kubeadm config images pull --config=config.yaml
  • 如果报错如下,说明token设置不符合正则表达式
W0224 23:32:51.955697    3535 strict.go:55] error unmarshaling
configuration schema.GroupVersionKind{Group:"kubeadm.k8s.io",
Version:"v1beta3", Kind:"InitConfiguration"}: error unmarshaling JSON:
while decoding JSON: the bootstrap token
"abcdef.0123456789abcdef.my.k8s.master.01.prod" was not of the form
"\\A([a-z0-9]{6})\\.([a-z0-9]{16})\\z" the bootstrap token
"abcdef.0123456789abcdef.my.k8s.master.01.prod" was not of the form
"\\A([a-z0-9]{6})\\.([a-z0-9]{16})\\z"
  • 如果报错Kubeadm unknown service runtime.v1alpha2.RuntimeService,那么执行如下命令后再重新执行初始化配置命令即可
rm /etc/containerd/config.toml
systemctl restart containerd

执行成功后提示信息如下:

[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6

值得注意的是:

  • 一般情况,这时候你执行命令查看镜像列表,可以看到镜像全部下载好了,
  • 如果下载失败,可能需要手动下载,新建一个批处理文件pull-k8s-v-1.23.0.sh
#!/bin/bash
# download images from aliyun
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6

执行下载脚本

sh pull-k8s-v-1.23.0.sh

验证是否下载成功输入命令

docker images

如果下载成功会输出如下信息:
在这里插入图片描述

3.4.9.2 K8S下载方式二:偷梁换柱法(不推荐)

一种最好的方式是用上面的修改配置文件方式,当然还有一种偷梁换柱方式,可通过执行如下*.sh 脚本完成。
这种方式不推荐,建议用第一种方法即可。

install-k8s-v1.24.0-image.sh批处理脚本如下:

#!/bin/bash
# download images from aliyun
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.0
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/conformance:v1.24.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-conformance
# rename images from aliyun
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.0 k8s.gcr.io/kube-apiserver:v1.24.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.0 k8s.gcr.io/kube-controller-manager:v1.24.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.0 k8s.gcr.io/kube-proxy:v1.24.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.0 k8s.gcr.io/kube-scheduler:v1.24.0
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/conformance:v1.24.0 k8s.gcr.io/conformance:v1.24.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-conformance k8s.gcr.io/conformance:v1.24.0
# delete images from aliyun
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.0
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/conformance:v1.24.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-conformance

install-k8s-v1.25.0-image.sh批处理脚本如下:

#!/bin/bash
# download images from aliyun
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.25.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.25.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.25.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.25.0
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/conformance:v1.25.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-conformance
# rename images from aliyun
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.25.0 k8s.gcr.io/kube-apiserver:v1.25.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.25.0 k8s.gcr.io/kube-controller-manager:v1.25.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.25.0 k8s.gcr.io/kube-proxy:v1.25.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.25.0 k8s.gcr.io/kube-scheduler:v1.25.0
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/conformance:v1.24.0 k8s.gcr.io/conformance:v1.25.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-conformance k8s.gcr.io/conformance:v1.25.0
# delete images from aliyun
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.25.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.25.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.25.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.25.0
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/conformance:v1.25.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-conformance
3.4.9.3 K8S下载方式二:离线二进制下载法(不推荐)

点击下载K8S依赖的镜像二进制文件

这种方式不推荐,需要确保所有机器的型号和二进制文件匹配才行,因此建议使用docker镜像方式。

3.4.10 my-k8s-master-01初始化集群

kubeadm init --config=config.yaml --v=6

执行后会将当前目录下的config.yaml 文件写入到 /var/lib/kubelet/config.yaml 目录下。
执行时间可能需要几分钟,请耐心等待。

如果执行成功会显示Your Kubernetes control-plane has initialized successfully! ,详细内容如下:

在这里插入图片描述
这里切记记下加入节点的命令,我们后面会用到。

kubeadm join 192.168.159.224:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:d7bf989b933034cc3be0878d79584217b8b1f9ec5df7584f6acd9d6379e415fb 
  • 如果报错信息如下:
occurred: [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]:
/etc/kubernetes/manifests/kube-apiserver.yaml already exists 
[ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists 
 [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists 
 [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists 
[ERROR Port-10250]: Port 10250 is in use [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
  To see the stack trace of this error  execute with --v=5 or higher

那么说明是安装失败,端口占用引起,执行如下命令即可修复

kubeadm reset

如果出现如下问题,可能是你安装的K8S版本1.24.0+ ,因为1.24.0 和1.24.0+ 版本默认不支持docker 运行时。

"/etc/kubernetes/manifests" [wait-control-plane] Waiting for the
kubelet to boot up the control plane as static Pods from directory
"/etc/kubernetes/manifests". This can take up to 4m0s [kubelet-check]
Initial timeout of 40s passed.

Unfortunately, an error has occurred:
        timed out waiting for the condition

This error is likely caused by:
        - The kubelet is not running
        - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

If you are on a systemd-powered system, you can try to troubleshoot
the error with the following commands:
        - 'systemctl status kubelet'
        - 'journalctl -xeu kubelet'

Additionally, a control plane component may have crashed or exited
when started by the container runtime. To troubleshoot, list all
containers using your preferred container runtimes CLI. Here is one
example how you may list all running Kubernetes containers by using
crictl:
        - 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock ps -a | grep kube | grep -v
pause'
        Once you have found the failing container, you can inspect its logs with:
        - 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock logs CONTAINERID' error
execution phase wait-control-plane: couldn't initialize a Kubernetes
cluster To see the stack trace of this error execute with --v=5 or
higher

如果出现编译异常,请执行如下

  • 安装编译器
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

检查kubelet启动状态:

systemctl status kubelet -l

如果出现其他问题,需要排查异常原因,可以通过如下命令查看kubelet日志

journalctl -f -u kubelet
journalctl -xeu kubelet

3.4.11 my-k8s-master-01创建一个K8S专用用户

要启动使用我们的集群,我们需要执行如下命令创建一个规则用户。

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

3.4.12 my-k8s-master-01配置环境变量

需要以root用户执行如下命令,为环境变量配置如下内容:

  • 配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

这样K8S以后会读取这个配置去管理节点的加入

  • 刷新环境变量
source /etc/profile

3.4.13 my-k8s-master-01配置k8s 集群凭证配置文件环境变量

接下来需要给K8S集群配置一个网络插件,由于文件存在github,可能出现超时,我已经帮大家下载下来了。

进入/opt目录下并创建一个叫做k8s-master-config的文件夹

cd /opt
mkdir k8s-master-config

然后新建一个配置文件

vi kube-flannel.yml

编辑内容如下:

---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - "networking.k8s.io"
  resources:
  - clustercidrs
  verbs:
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: docker.io/flannel/flannel-cni-plugin:v1.1.2
       #image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.2
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: docker.io/flannel/flannel:v0.21.2
       #image: docker.io/rancher/mirrored-flannelcni-flannel:v0.21.2
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: docker.io/flannel/flannel:v0.21.2
       #image: docker.io/rancher/mirrored-flannelcni-flannel:v0.21.2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
kubectl apply -f kube-flannel.yml

执行成功如下所示:
在这里插入图片描述

3.4.14 my-k8s-master-01验证k8s安装

验证安装,查看所有的节点输入如下命令:

kubectl get nodes

在这里插入图片描述

查看所有的pod

kubectl get pods --all-namespaces

在这里插入图片描述

检查pod错误原因

kubectl --namespace=kube-system describe pod <pod_name>

3.4.15 my-k8s-node-01,my-k8s-node-02,my-k8s-node-03工作节点安装

在my-k8s-node-01,my-k8s-node-02,my-k8s-node-03 机器上分别安装如下安装包:

yum install -y --nogpgcheck kubelet-1.23.10 kubeadm-1.23.10 kubectl-1.23.10

由于是工作节点,因此不需要安装kubeadm集群管理工具。

添加到开机启动项并启动服务:

systemctl enable kubelet && systemctl start kubelet

编辑hosts配置输入如下命令:

vi /etc/hosts

修改后内容如下:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.159.224 my-k8s-master-01
192.168.159.224 cluster.local
192.168.159.188 my-k8s-node-01
192.168.159.192 my-k8s-node-02
192.168.159.197 my-k8s-node-03

192.168.159.224 kube-apiserver
  • kube-apiserver 配置成my-k8s-master-01 的IP
  • 因为工作节点需要向my-k8s-master-01节点发送API请求。

如果配置比较少可以直接使用第一种命令行方式加入,如果自定义配置比较多可以通过第二种读取配置文件方式加入。

3.4.15.1 第一种方式:通过命令行方式将work-node加入k8s集群

还记得前面我让大家记住的命令么?

对就是这个,用它可以把该工作节点添加到master节点上。

kubeadm join 192.168.159.224:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:d7bf989b933034cc3be0878d79584217b8b1f9ec5df7584f6acd9d6379e415fb 

执行成功如下:
kubeadm join 192.168.159.224:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:d7bf989b933034cc3be0878d79584217b8b1f9ec5df7584f6acd9d6379e415fb

3.4.15.2 第二种方式:通过读取yaml配置文件加入k8s集群

创建join-config.yaml 配置文件

vi join-config.yaml

分别在my-k8s-node-01,my-k8s-node-02,my-k8s-node-03机器上执行如下命令:
my-k8s-node-01 机器配置如下:

apiVersion: kubeadm.k8s.io/v1beta3
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: kube-apiserver:6443
    token: abcdef.0123456789abcdef
    unsafeSkipCAVerification: true
  timeout: 5m0s
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: my-k8s-node-01
  taints: null

my-k8s-node-02 机器配置如下:

apiVersion: kubeadm.k8s.io/v1beta3
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: kube-apiserver:6443
    token: abcdef.0123456789abcdef
    unsafeSkipCAVerification: true
  timeout: 5m0s
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: my-k8s-node-02
  taints: null

my-k8s-node-03 机器配置如下:

apiVersion: kubeadm.k8s.io/v1beta3
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: kube-apiserver:6443
    token: abcdef.0123456789abcdef
    unsafeSkipCAVerification: true
  timeout: 5m0s
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: my-k8s-node-03
  taints: null

将当前配置加入到K8S集群

kubeadm join --config=join-config.yaml 

执行成功如下所示:
在这里插入图片描述

  • 在work-node 节点机器上执行获取初始化node节点配置模板:
kubeadm config print join-defaults

3.4.16 my-k8s-master-01验证添加的node节点

在master节点上,执行如下命令:

kubectl get nodes

在这里插入图片描述

四. 参考文献

本篇完~

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐