集群搭建
- 1.初始化安装k8s集群的实验
- 1.1修改主机名称
- 1.2关闭防火墙
- 1.3关闭SELINUX
- 1.4配置主机hosts文件,相互之间通过主机名访问
- 1.5配置主机之间无密码登录
- 1.6关闭交换分区swap,提升性能
- 1.7修改机器内核参数
- 1.9配置阿里云的repo源
- 1.10配置安装k8s组件需要的阿里云repo源
- 1.11配置时间同步
- 1.12安装基础软件包
- 2.安装containerd服务
- 2.1安装containerd
- 3.安装k8s需要的软件包
- 4.kubeadm初始化k8s网络集群
- 4.1基于kubeadm.yaml初始化k8s集群
- 5.添加第一次工作节点
- 6.安装kubernetes网络组件-calico
- 6.1calico网络插件配置文件说明
- 7.测试在k8s创建pod是否可以正常访问网络
- 8.ctr和crictl的区别
- 9.扩容k8s集群,添加第二个工作节点
- 10.扩容k8s集群,添加第二个管理节点
环境准备
角色 | IP |
---|---|
主节点:master1 | 192.168.40.180 |
主节点:master2 | 192.168.40.183 |
工作节点:node1 | 192.168.40.181 |
工作节点:node2 | 192.168.40.182 |
master2和node2用做k8s集群的扩容
安装需要
链接:https://pan.baidu.com/s/17eFlM6kJN2rdeSvhTTVRFw
提取码:nx09
–来自百度网盘超级会员V3的分享
1.初始化安装k8s集群的实验
1.1修改主机名称
master1
# 修改主机名称
hostnamectl set-hostname master1 && bash
node1
hostnamectl set-hostname node1 && bash
1.2关闭防火墙
master1
# 关闭防火墙
[root@master1 ~]# systemctl stop firewalld && systemctl disable firewalld
node1
[root@node1 ~]# systemctl stop firewalld && systemctl disable firewalld
1.3关闭SELINUX
master1
#修改配置文件
[root@master1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/co
# 重启机器生效
[root@master1 ~]# reboot
node1
[root@node1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/co
[root@node1 ~]# reboot
1.4配置主机hosts文件,相互之间通过主机名访问
修改每台机器的/etc/hosts文件,文件最后增加如下内容:
master1:
vim /etc/hosts
192.168.40.180 master1
192.168.40.181 node1
node1:
vim /etc/hosts
192.168.40.180 master1
192.168.40.181 node1
1.5配置主机之间无密码登录
master1
# 创建密钥
[root@master1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:jCUEBllzJUq672lZGR5ck5BTy9C59vXsKAaG3JgbLUM root@master1
The key's randomart image is:
+---[RSA 2048]----+
| .+*.**oo |
| .+ =o+*. |
| . ...o+o |
| . E=o . |
| . +.@S. . o |
| . % = . o |
| .o * . o |
| .o.. o . . |
| .o . . |
+----[SHA256]-----+
# 传输到noded1节点
[root@master1 ~]# ssh-copy-id node1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'node1 (192.168.40.181)' can't be established.
ECDSA key fingerprint is SHA256:M6KzBDyB8kkCkrVm3GtFytNb44nD/1WR9DT18yHEWZ4.
ECDSA key fingerprint is MD5:13:76:bd:4c:17:2d:f0:e4:43:ee:4e:1a:37:6a:49:a2.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node1's password: # 输入node1的密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'node1'"
and check to make sure that only the key(s) you wanted were added.
1.6关闭交换分区swap,提升性能
问题1:为什么要关闭swap交换分区?
Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区
的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定--ignore-preflight-errors=Swap
来解决。
master1
# 临时关闭swap分区
[root@master1 ~]# swapoff -a
# 永久关闭swap分区,fstab文件给swap这行开头加一下注释
node1
[root@noded1 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
1.7修改机器内核参数
问题1:sysctl是做什么的?
在运行时配置内核参数
-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
问题2:为什么要执行modprobe br_netfilter?
修改/etc/sysctl.d/k8s.conf文件,增加如下三行参数:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.d/k8s.conf出现报错:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
解决方法:
modprobe br_netfilter
问题3:为什么开启net.bridge.bridge-nf-call-iptables内核参数?
在centos下安装docker,执行docker info出现如下警告:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决办法:
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
问题4:为什么要开启net.ipv4.ip_forward = 1参数?
kubeadm初始化k8s如果报错:
就表示没有开启ip_forward,需要开启。
net.ipv4.ip_forward是数据包转发:
出于安全考虑,Linux系统默认是禁止数据包转发的
。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
要让Linux系统具有路由转发功能
,需要配置一个Linux的内核参数net.ipv4.ip_forward
。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
master1:
[root@master1 ~]# modprobe br_netfilter
[root@master1 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@master1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
node1:
[root@node1 ~]# modprobe br_netfilter
[root@node1 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@node1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
1.9配置阿里云的repo源
配置国内安装docker和containerd的阿里云的repo源
master1
# 安装工具
[root@master1 ~]# yum install yum-utils -y
[root@master1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
node1
[root@node1 ~]#yum install yum-utils -y
[root@node1 ~]#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.10配置安装k8s组件需要的阿里云repo源
master1
[root@master1 ~]#cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
node1
[root@node1 ~]#cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
1.11配置时间同步
master1
# 安装ntpdate命令
[root@master1 ~]# yum -y install ntpdate
# 跟网络时间做同步
[root@master1 ~]# ntpdate cn.pool.ntp.org
# 把时间同步做成计划任务
[root@master1 ~]# crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
# 重启crond服务
[root@master1 ~]# service crond restart
node1
[root@node1 ~]# yum -y install ntpdate
[root@node1 ~]# ntpdate cn.pool.ntp.org
[root@node1 ~]# crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
[root@node1 ~]# service crond restart
1.12安装基础软件包
master1:
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
node1
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack telnet ipvsadm
2.安装containerd服务
2.1安装containerd
master1
# 安装containerd
[root@master1 ~]# yum -y install containerd.io-1.6.6
# 接下来生成 containerd 的配置文件
[root@master1 ~]#mkdir -p /etc/containerd
[root@master1 ~]#containerd config default > /etc/containerd/config.toml
# 修改配置文件
打开/etc/containerd/config.toml
把SystemdCgroup = false修改成SystemdCgroup = true
把sandbox_image = "k8s.gcr.io/pause:3.6"修改成sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7"
# 配置 containerd 开机启动,并启动 containerd
[root@master1 ~]#systemctl enable containerd --now
# 修改/etc/crictl.yaml文件,配置容器运行时
[root@master1 ~]#cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 重启containerd服务
[root@xianchaomaster1 ~]#systemctl restart containerd
# 配置containerd镜像加速
配置containerd镜像加速器,k8s所有节点均按照以下配置:
编辑vim /etc/containerd/config.toml文件
找到config_path = "",修改成如下目录:
config_path = "/etc/containerd/certs.d"
保存退出
# 创建并配置存放镜像加速器的目录
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml
#写入如下内容:
[host."https://ag38j4ig.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
capabilities = ["pull"]
#重启containerd服务
重启containerd:
systemctl restart containerd
# docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像
[root@master1 ~]# yum -y install docker-ce
[root@master1 ~]# systemctl enable docker --now
#配置docker的镜像加速器
[root@master1 ~]# cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors":["https://ag38j4ig.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF
# 重启docker服务
[root@master1 ~]# systemctl restart docker
node1
[root@node1 ~]# yum -y install containerd.io-1.6.6
[root@node1 ~]#mkdir -p /etc/containerd
[root@node1 ~]#containerd config default > /etc/containerd/config.toml
打开/etc/containerd/config.toml
把SystemdCgroup = false修改成SystemdCgroup = true
把sandbox_image = "k8s.gcr.io/pause:3.6"修改成sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7"
[root@node1 ~]#systemctl enable containerd --now
[root@node1 ~]#cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 重启containerd服务
[root@node1 ~]#systemctl restart containerd
# 配置containerd镜像加速
配置containerd镜像加速器,k8s所有节点均按照以下配置:
编辑vim /etc/containerd/config.toml文件
找到config_path = "",修改成如下目录:
config_path = "/etc/containerd/certs.d"
保存退出
# 创建并配置存放镜像加速器的目录
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml
#写入如下内容:
[host."https://ag38j4ig.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
capabilities = ["pull"]
#重启containerd服务
重启containerd:
systemctl restart containerd
[root@node1 ~]# yum -y install docker-ce
[root@node1 ~]# systemctl enable docker --now
[root@node1 ~]# cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors":["https://ag38j4ig.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF
[root@node1 ~]# systemctl restart docker
3.安装k8s需要的软件包
kubeadm
: kubeadm是一个工具,用来初始化k8s集群的
kubelet
: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
kubectl
: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
master1
[root@master1 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@master1 ~]# systemctl enable kubelet
node1
[root@node1 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@node1 ~]# systemctl enable kubelet
4.kubeadm初始化k8s网络集群
master1
# 设置容器运行时
[root@master1~]# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
node1
# 设置容器运行时
[root@node1~]# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
只在master1节点运行
# 初始化k8s集群
[root@master1 ~]# kubeadm config print init-defaults > kubeadm.yaml
根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd
kubeadm.yaml配置文件如下:
apiVersion: kubeadm.k8s.io/v1beta3
。。。
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.40.180 #控制节点的ip
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock #指定containerd容器运行时
imagePullPolicy: IfNotPresent
name: master1 #控制节点主机名
taints: null
---
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.26.0 #k8s版本
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 #指定pod网段, 需要新增加这个
serviceSubnet: 10.96.0.0/12 #指定Service网段
scheduler: {}
#在文件最后,插入以下内容,(复制时,要带着---):
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
特别提醒
:–image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8s.gcr.io拉取镜像。 我们本地有导入到的离线镜像,所以会优先使用本地的镜像。
mode
: ipvs 表示kube-proxy代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables效率低,所以我们生产环境建议开启ipvs,阿里云和华为云托管的K8s,也提供ipvs模式
4.1基于kubeadm.yaml初始化k8s集群
将提前下载好的镜像上传到master1和node1上
备注:k8s_1.26.0.tar.gz这个文件如何来的?
这个文件把安装k8s需要的镜像都集成好了,这个是我第一次安装1.26.0这个版本,获取到对应的镜像,通过ctr images export 这个命令把镜像输出到k8s_1.26.0.tar.gz文件,如果大家安装其他版本,那就不需要实现解压镜像,可以默认从网络拉取镜像即可。
ctr是containerd自带的工具,有命名空间的概念,若是k8s相关的镜像,都默认在k8s.io这个命名空间,所以导入镜像时需要指定命令空间为k8s.io
#使用ctr命令指定命名空间导入镜像
[root@master1 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@node1 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
在master1节点运行
[root@master1 ~]# kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification
显示如下,说明安装成功
#配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理
[root@master1 ~]# mkdir -p $HOME/.kube
[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master1 ~]# kubectl get nodes
AME STATUS ROLES AGE VERSION
master1 NotReady control-plane 13m v1.26.0
5.添加第一次工作节点
在master1上查看加入节点的命令:
[root@master1 ~]# kubeadm token create --print-join-command
显示如下:
kubeadm join 192.168.40.180:6443 --token atdvq3.vtad9galyly4x5pv --discovery-token-ca-cert-hash sha256:dfebbd9a9373dfeb5d7a28835d839646a0a10381086f084de5693e938609b2cf
把node1加入k8s集群:
[root@node1~]# kubeadm join 192.168.40.180:6443 --token atdvq3.vtad9galyly4x5pv --discovery-token-ca-cert-hash sha256:dfebbd9a9373dfeb5d7a28835d839646a0a10381086f084de5693e938609b2cf --ignore-preflight-errors=SystemVerification
看到下面说明node1节点已经加入到集群了,充当工作节点
在master1节点上看集群的情况
6.安装kubernetes网络组件-calico
把安装calico需要的镜像calico.tar.gz传到master1和node1节点,手动解压:
[root@master1 ~]# ctr -n=k8s.io images import calico.tar.gz
[root@node1 ~]# ctr -n=k8s.io images import calico.tar.gz
上传calico.yaml到master1上,使用yaml文件安装calico 网络插件 。
[root@master1 ~]# kubectl apply -f calico.yaml
注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml 。
看到如下status都是ready,表明网络安装正常
6.1calico网络插件配置文件说明
1、Daemonset配置
……
containers:
# Runs calico-node container on each Kubernetes node. This
# container programs network policy and routes on each
# host.
- name: calico-node
image: docker.io/calico/node:v3.18.0
……
env:
# Use Kubernetes API as the backing datastore.
- name: DATASTORE_TYPE
value: “kubernetes”
# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: “k8s,bgp”
# Auto-detect the BGP IP address.
- name: IP
value: “autodetect”
#pod网段
- name: CALICO_IPV4POOL_CIDR
value: “10.244.0.0/16”
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: “Always”
IP_AUTODETECTION_METHOD:获取Node IP地址的方式,默认使用第1个网络接口的IP地址,对于安装了多块网卡的Node,可以使用正则表达式选择正确的网卡,例如"interface=eth.*"表示选择名称以eth开头的网卡的IP地址。
- name: IP_AUTODETECTION_METHOD
value: “interface=ens33”
7.测试在k8s创建pod是否可以正常访问网络
[root@master1 ~]# kubectl run busybox --image docker.io/library/busybox:1.28 --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms
#通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ # exit #退出pod
10.96.0.10 就是我们coreDNS的clusterIP,说明coreDNS配置好了。
解析内部Service的名称,是通过coreDNS去解析的。
8.ctr和crictl的区别
ctr和crictl区别
背景:在部署k8s的过程中,经常要对镜像进行操作(拉取、删除、查看等)
问题:使用过程中会发现ctr和crictl有很多相同功能,也有些不同,那区别到底在哪里?
说明:
-
ctr是containerd自带的CLI命令行工具,crictl是k8s中CRI(容器运行时接口)的客户端,k8s使用该客户端和containerd进行交互;
-
ctr和crictl命令具体区别如下,也可以–help查看。crictl缺少对具体镜像的管理能力,可能是k8s层面镜像管理可以由用户自行控制,能配置pod里面容器的统一镜像仓库,镜像的管理可以有habor等插件进行处理。
9.扩容k8s集群,添加第二个工作节点
添加node2节点
参照node1节点进行操作
10.扩容k8s集群,添加第二个管理节点
参照上述1,2,3操作
将master2加入到k8s集群
# 把master1节点的证书拷贝到master2上
# 在master2创建证书存放目录:
[root@master2 ~]# cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p ~/.kube/
[root@master1 ~]# scp /etc/kubernetes/pki/ca.crt master2:/etc/kubernetes/pki/
ca.crt 100% 1099 869.2KB/s 00:00
[root@master1 ~]# scp /etc/kubernetes/pki/ca.key master2:/etc/kubernetes/pki/
ca.key 100% 1679 1.5MB/s 00:00
[root@master1 ~]# scp /etc/kubernetes/pki/sa.key master2:/etc/kubernetes/pki/
sa.key 100% 1679 1.6MB/s 00:00
[root@master1 ~]# scp /etc/kubernetes/pki/sa.pub master2:/etc/kubernetes/pki/
sa.pub 100% 451 435.4KB/s 00:00
[root@master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt master2:/etc/kubernetes/pki/
front-proxy-ca.crt 100% 1115 790.8KB/s 00:00
[root@master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.key master2:/etc/kubernetes/pki/
front-proxy-ca.key 100% 1675 1.5MB/s 00:00
[root@master1 ~]# scp /etc/kubernetes/pki/etcd/ca.crt master2:/etc/kubernetes/pki/etcd
ca.crt 100% 1086 1.2MB/s 00:00
[root@master1 ~]# scp /etc/kubernetes/pki/etcd/ca.key master2:/etc/kubernetes/pki/etcd
ca.key 100% 1679 1.2MB/s 00:00
[root@master1 ~]#
把安装calico需要的镜像calico.tar.gz传到master2,手动解压:
[root@master2 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@master2 ~]# ctr -n=k8s.io images import calico.tar.gz
检查 kubeadm-config ConfigMap 是否正确配置了 controlPlaneEndpoint。可以使用 kubectl 命令获取 kubeadm-config ConfigMap 的信息:
[root@master1 ~]# kubectl -n kube-system edit cm kubeadm-config -o yaml
# apiVersion下面添加如下字段:
controlPlaneEndpoint: "192.168.40.180:6443"
# 重启kubelet:
[root@master1 ~]# systemctl restart kubelet
# 在master1上查看加入节点的命令:
[root@xianchaomaster1 ~]# kubeadm token create --print-join-command
显示如下:
kubeadm join 192.168.40.180:6443 --token 6fitex.qdr7fkyloe7mukrj --discovery-token-ca-cert-hash sha256:dfebbd9a9373dfeb5d7a28835d839646a0a10381086f084de5693e938609b2cf
# 加入k8s集群
[root@master2 ~]# kubeadm join 192.168.40.180:6443 --token 6fitex.qdr7fkyloe7mukrj --discovery-token-ca-cert-hash sha256:dfebbd9a9373dfeb5d7a28835d839646a0a10381086f084de5693e938609b2cf --control-plane --ignore-preflight-errors=SystemVerification
[root@master2 ~]# mkdir -p $HOME/.kube
[root@master2 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master2 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
在master2上查看集群情况
[root@master2 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 129m v1.26.0
master2 Ready control-plane 7m v1.26.0
node1 Ready <none> 114m v1.26.0