kubernetes集群搭建(1.26版本)


环境准备

角色IP
主节点:master1192.168.40.180
主节点:master2192.168.40.183
工作节点:node1192.168.40.181
工作节点:node2192.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有很多相同功能,也有些不同,那区别到底在哪里?

说明:

  1. ctr是containerd自带的CLI命令行工具,crictl是k8s中CRI(容器运行时接口)的客户端,k8s使用该客户端和containerd进行交互;

  2. 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
  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值