搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南
Centos7 安装 K8S 图文实战教程
搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南
- 一. K8S 简介
- 二. K8S 学习的几大拦路虎
- 三. Centos7 安装K8S指南
- 3.1 K8S安装硬件要求
- 3.2 基础软件包安装
- 3.3 K8S 安装所需系统设置
- 3.4 K8S 安装步骤
- 3.4.1 安装Docker
- 3.4.2 添加docker到开机启动项并启动服务
- 3.4.3 添加K8S国内仓库镜像
- 3.4.4 配置Docker镜像加速器
- 3.4.5 my-k8s-master-01节点安装K8S 三件套(kubelet,kubeadm,kubectl)
- 3.4.6 my-k8s-master-01添加kubelet到开机启动项并启动服务
- 3.4.7 my-k8s-master-01检查kubectl安装版本
- 3.4.8 my-k8s-master-01获取集群初始化默认配置文件
- 3.4.9 my-k8s-master-01拉取下载K8S依赖的镜像
- 3.4.10 my-k8s-master-01初始化集群
- 3.4.11 my-k8s-master-01创建一个K8S专用用户
- 3.4.12 my-k8s-master-01配置环境变量
- 3.4.13 my-k8s-master-01配置k8s 集群凭证配置文件环境变量
- 3.4.14 my-k8s-master-01验证k8s安装
- 3.4.15 my-k8s-node-01,my-k8s-node-02,my-k8s-node-03工作节点安装
- 3.4.16 my-k8s-master-01验证添加的node节点
- 四. 参考文献
一. K8S 简介
K8S 是谷歌开源的一个容器编排解决方案,随着如今云原生技术越来越火热,掌握K8S核心技能,对于研发人员来说,也变得愈发重要。
本篇主要分享Centos7生产环境可用的K8S集群的搭建。
二. K8S 学习的几大拦路虎
k8S 学习起来有几大拦路虎:
2.1 K8S 安装对硬件要求比较高
硬件方面的解决方案一般有五个:
- 公司提供服务器资源,供你尝试。
- 公司直接购买K8S云服务
- 自己直接购买K8S云服务
- 自己去云服务厂商那里租一个月的两台高性能的服务器即可
- 自己买一台高性能的电脑,比如 博主买的64G,1TB 配置的RMBP, 可以轻松搭建各种集群环境。
2.2. K8S 对使用者来说要求掌握的知识点也比较多
涉及到Linux操作系统和命令,以及网络层相关的概念和知识。
2.3 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 正常工作,你 必须 禁用交换分区。
这里我们采用最小化原则,实际生产环境最好大于这个配置。
指标 | 指标值 |
---|---|
CPU | 2核 |
内存 | 2048M |
3.1.2 操作系统基础配置
配置项 | 配置值 |
---|---|
Date & Time | Asia/Shanghai timezone |
KeyBOARD | English(US) |
SOFTWARE SELECTION | Minimal Install |
INSTALLATION DESTINATION | AUtomatic partitiong selected |
NetWORK & HOST NAME | Wired(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
- 参考资料:https://www.howtoing.com/disable-swap-partition-in-centos-ubuntu
- 如果当前服务器由于业务等原因暂时无法重启可临时关闭交换分区
- 立即禁用所有交换(不需要重启系统)
swapoff -a
- 重启服务器
reboot
- 验证交换分区是否关闭
free -h
如果返回如下内容说明禁用成功
3.3.2 配置防火墙网络策略
- k8s-master 节点端口策略需满足如下网络策略:
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 6443 | Kubernetes API server | 所有 |
TCP | 入站 | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP | 入站 | 10250 | Kubelet API | 自身, 控制面 |
TCP | 入站 | 10259 | kube-scheduler | 自身 |
TCP | 入站 | 10257 | kube-controller-manager | 自身 |
- work-node节点端口策略需满足如下网络策略:
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | Kubelet API | 自身, 控制面 |
TCP | 入站 | 30000-32767 | NodePort 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-01 | 192.168.159.224 |
my-k8s-node-01 | 192.168.159.188 |
my-k8s-node-02 | 192.168.159.192 |
my-k8s-node-03 | 192.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国内仓库镜像
由于国内网络原因,因此我们需要安装镜像方可下载。
将配置文件写入到/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)下的项目。
- 官方解释原文:更新:移除 Dockershim 的常见问题
后续解决方案
如果使用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 容器仓库。
- k8s依赖镜像 v1.24.0
- k8s依赖镜像 v1.25.0
一般没有梯子是无法直接访问的,报错信息如下:
[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下载方式二:离线二进制下载法(不推荐)
这种方式不推荐,需要确保所有机器的型号和二进制文件匹配才行,因此建议使用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
- 可能由于网络原因会出现超时,因此建议先将文件下载下来再执行。
- https://kubernetes.io/docs/concepts/cluster-administration/addons/
执行成功如下所示:
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
执行成功如下:
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
四. 参考文献
- https://www.runoob.com/docker/docker-mirror-acceleration.html
- https://blog.csdn.net/CEVERY/article/details/108753379
- https://kubernetes.io/zh/docs/reference/config-api/kubeadm-config.v1beta3/
- https://www.cnblogs.com/Leo_wl/p/15775077.html
- https://www.cnblogs.com/kevingrace/p/12778066.html
本篇完~
更多推荐
所有评论(0)