Kubernetes搭建(高可用)

Kubernetes1.27搭建(高可用)

安装kubernetes工具(所有节点)

这里使用的是centos系统,其他redhat等相同,根据自己的实际环境来操作

根据kubernetes官网,使用官方的指定的repo源,下载kubernetes工具,这里官网指定的配置源为google的镜像源。在国内无法访问(可以通过其他方式解决例如配置代理),也可以使用阿里云的kubernetes的镜像源或者自己找到rpm包做yum源(将依赖和要安装的rpm放在同一目录下使用rpm -Uvh *.rpm 也可),下载的kubernetes组件的版本正确即可。

[root@localhost ~]# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
下载kubernetes组件,默认是最新版,所以这里需要指定版本。

[root@localhost ~]# yum install kubeadm-1.27.2 kubectl-1.27.2 kubelet-1.27.2 -y

  • #确保下载版本为最新版工具。

转发ipv4流量并让iptables看到桥接流量

所有节点都需要将sysctl所需的配置写入

[root@localhost ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
#然后使其生效
[root@localhost ~]# modprobe br_netfilter
[root@localhost ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

关闭交换分区
为确保kubernetes性能,所有节点都需要关闭交换分区,注释掉交换分区。

[root@localhost ~]# swapoff -a
[root@localhost ~]# vim /etc/fstab

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=8c9ec778-e898-4be6-bda9-1600ceee752c /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

配置时间同步关闭防火墙
再部署kubernetes集群的时候需要进行时间同步,确保各节点时间的一致性,以确保集群运行中各种时间的顺序正确。例如,在使用kubelet定期检查容器运行状态时,如果时间不一致可能会导致容器内容出现错误。

systemctl stop firewalld
setenforce 0
#上面关闭防火墙,或者开放端口,保证网络连接。
 
[root@localhost ~]# vim /etc/chrony.conf
server (ntp服务器ip) iburst
allow all
local stratum 10
#添加上面配置
[root@localhost ~]# systemctl restart chronyd
[root@localhost ~]# chronyc sources
#上面配置主节点时间同步公网,允许其他节点同步,这里要保持联网多次同步直到出现*号代表同步成功。

[root@localhost ~]# vim /etc/chrony.conf
server 192.168.40.20 iburst
[root@localhost ~]# systemctl restart chronyd
[root@localhost ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.40.20                2   6    17    23    -20us[  -24us] +/-   65ms
#上面是其他从节点配置同步主节点

开启ipvs

不开启ipvs将会使用iptables,但是效率低,所以官网推荐开启ipvs。ipvs相比iptables将会有更高的服务可靠性和性能。如果不开启无需配置此步骤。

1,支持更多的协议:kubernetes默认的负载均衡方式时iptables,虽然简单易用,但只是支持TCP/UDP协议。而IPVS不仅支持TCP/UDP,还支持SCTP,TCP+SSL等多种协议。
2,与iptables只支持轮询方式不同,IPVS提供了更多钟负载均衡算法,包括轮询,加权轮询等,使得负载均衡更加精细化和灵活。
3,提高服务性能和可靠性:使用 IPVS 能够有效地提高服务的性能和可靠性。使用 IPVS 可以在各个节点上动态地将请求转发到可用的 Pod 上,避免单节点故障影响整个服务的问题。
4,降低延迟和网络带宽:使用 IPVS 可以减少 Kubernetes 集群中的网络带宽和延迟,因为请求只需要在节点之间进行转发,而不需要跨节点的通信。

这是在centos中开启ipvs的脚本,该脚本将会在系统启动时自动加载,并使用modprobe加载ipvs的必需模块,需要在每个节点中配置。

[root@localhost ~]# yum install ipset ipvsadm -y   #用rpm包安装亦可

[root@localhost ~]# vim /etc/sysconfig/modules/ipvs.modules
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

[root@localhost ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
[root@localhost ~]# bash /etc/sysconfig/modules/ipvs.modules

自启动kubelet

[root@master ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

安装底层容器(所有节点)

根据官方的说法,现在还想使用docker作为kubernetes底层容器,需要cri-dockerd来将docker engine与kubernetes集成,下面会说明。

Docker Engine
Docker Engine 是一款用于构建和运行容器化应用程序的软件。它具有以下特点:

1,简单易用:Docker Engine 提供了一个简单的命令行接口,可以方便地创建、启动、停止和删除容器。
2,轻量级:Docker Engine 容器非常轻量级,可以在几毫秒内启动和停止。
3,可移植性:Docker Engine 容器可以在不同的平台上运行,包括物理机、虚拟机和云环境。
4,可扩展性:Docker Engine 支持通过容器编排工具(如 Kubernetes、Docker Compose 等)进行自动化容器部署、管理和扩缩容等操作。
5,安全性:Docker Engine 提供了一系列安全措施,包括容器隔离、镜像签名和加密等,以确保容器的安全性和稳定性。

Docker Engine和Docker的区别

1,Docker Engine 是 Docker 的核心组件,是用于构建和运行容器化应用程序的基础平台。而普通的 Docker(也称为 Docker 客户端)则是用于与 Docker Engine 进行交互的命令行工具。
2,Docker Engine 包含了 Docker 客户端的所有功能,并且还提供了一系列 API 接口来简化容器管理、镜像管理和网络管理等操作。因此,Docker Engine 更加强大和灵活,可以被用作构建自动化容器化部署和持续集成/持续部署(CI/CD)的基础设施。
3,Docker Engine 可以安装在不同的操作系统上,包括 Linux、Windows 和 macOS 等,而普通的 Docker 则通常只支持运行在 Linux 操作系统上。

安装Docker

在线安装请看Docker安装(在线)

方法可以参照安装Harbor仓库,此处我们采用rpm包安装方式,安装完记得启动

systemctl enable docker --now

修改cgroup方式

/etc/docker/daemon.json 默认没有此文件,需要单独创建,在/etc/docker/daemon.json添加如下内容

cat > /etc/docker/daemon.json << EOF
{
        "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# systemctl restart docker

为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。

# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

安装cri-dockerd

先前说过Docker 本身是一个容器运行时(Container Runtime),它负责管理容器的生命周期,包括创建、启动、停止和销毁等操作。然而,Docker 运行时在设计上并不符合 Kubernetes 等容器编排工具的要求,因此需要使用 CRI(Container Runtime Interface)来与容器编排工具进行交互。

根据kubernetes官网给出的方法,使用源代码仓库中说明的方式进行部署。

在官方的仓库中获取最新版本的软件包,然后继续执行以下步骤。这里使用的时cri-dockerd0.3.3的版本,记得每个节点都要配置。https://github.com/Mirantis/cri-dockerd/tags

rpm包安装即可,需要修改一下cri-docker.service文件

vim /usr/lib/systemd/system/cri-docker.service
在service文件中添加
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.k8s.io/pause:3.9
#一般指定pause设定在kubelet的配置当中,kubelet会在创建pod前拉取pause镜像,并缓存它后续使用。
#将此参数放在kubelet中更加常见,但是在某些情况下也会将参数配置在cri-dockerd中,例如当使用自定义的cri运行时。

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable cri-docker
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /etc/systemd/system/cri-docker.service
[root@master ~]# systemctl restart cri-docker

指定kubeadm默认cri

当docker和cri-docker一起安装的时候,docker默认自带containerd的cri所以会导致kubeadm识别到两个cri,每次使用kubeadm都需要指定一下cri,所以干脆修改kubeadm配置文件,使其本身就使用其中一个cri。

找到10-kubeadm.conf配置文件,然后修改配置文件。

[root@master ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_EXTRA_ARGS=--container-runtime= unix:///run/cri-dockerd.sock"
#添加上面一行内容,sock文件路径根据实际环境设置。
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart kubelet

外部Etcd集群搭建(一般在master节点)

任意节点执行(外部节点亦可)

下载cfssl并使用

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl ;\
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson ;\
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

接下来在任意节点(本次在ansible节点)执行

mkdir ssl
cd ssl
# 创建ca-config
cat > ca-config.json <<-eof

{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
eof
# 创建ca-csr
cat > ca-csr.json <<-eof
 
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
eof
生成ca证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
使用自签ca签发etcd证书

创建证书申请文件

# 注意hosts内容,etcd集群内的ip都要写上,可以预留几个,为以后扩容使用
cat > server-csr.json <<-eof
{
    "CN": "etcd",
    "hosts": [
    "192.168.40.10",
    "192.168.40.20",
    "192.168.40.30"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
eof
生成证书
$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

会生成server.pem和server-key.pem文件
[root@harbor ssl]# ll |grep server
-rw-r--r-- 1 root root 1013 629 21:31 server.csr
-rw-r--r-- 1 root root  290 629 21:30 server-csr.json
-rw------- 1 root root 1675 629 21:31 server-key.pem
-rw-r--r-- 1 root root 1338 629 21:31 server.pem



在所有etcd(master)节点上执行
mkdir -pv /opt/kubernetes/etcd/{bin,cfg,ssl,data}

然后拷贝过去
for i in `seq 1 3`;do
scp -r ../ssl/* master$i:/opt/kubernetes/etcd/ssl/
done
下载etcd二进制文件
#!/bin/bash
ETCD_VER=v3.5.9

# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}

curl -O ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
解压etcd文件
$ tar xf etcd-v3.5.9-linux-amd64.tar.gz
for i in `seq 1 3`;do
scp etcd-v3.5.9-linux-amd64/{etcd,etcdctl,etcdutl} master$i:/opt/kubernetes/etcd/bin
done
生成etcd配置文件
vim etcd_install.sh

etcd1=192.168.40.10
etcd2=192.168.40.20
etcd3=192.168.40.30

TOKEN=smartgo
ETCDHOSTS=($etcd1 $etcd2 $etcd3)
NAMES=("master1" "master2" "master3")
for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /opt/kubernetes/etcd/cfg/$NAME.conf
# [member]
ETCD_NAME=$NAME
ETCD_DATA_DIR="/opt/kubernetes/etcd/data/default.etcd"
ETCD_LISTEN_PEER_URLS="https://$HOST:2380"
ETCD_LISTEN_CLIENT_URLS="https://$HOST:2379,https://127.0.0.1:2379"
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://$HOST:2380"
ETCD_INITIAL_CLUSTER="${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="$TOKEN"
ETCD_ADVERTISE_CLIENT_URLS="https://$HOST:2379"
EOF
done

注释

ETCD_NAME:节点名称,集群中唯一
ETCD_DATA_DIR:数据目录
ETCD_LISTEN_PEER_URLS:集群通信监听地址
ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
ETCD_INITIAL_ADVERTISE_PEERURLS:集群通告地址
ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址
ETCD_INITIAL_CLUSTER:集群节点地址
ETCD_INITIALCLUSTER_TOKEN:集群Token
ETCD_INITIALCLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群

拷贝到对应服务器

for i in `seq 1 3`;do
scp /opt/kubernetes/etcd/cfg/master$i.conf master$i:/opt/kubernetes/etcd/cfg/etcd.conf
done

所有etcd(master)节点执行

注册服务
$ cat > /etc/systemd/system/etcd.service <<-eof
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/etcd/cfg/etcd.conf
ExecStart=/opt/kubernetes/etcd/bin/etcd \
--cert-file=/opt/kubernetes/etcd/ssl/server.pem \
--key-file=/opt/kubernetes/etcd/ssl/server-key.pem \
--peer-cert-file=/opt/kubernetes/etcd/ssl/server.pem \
--peer-key-file=/opt/kubernetes/etcd/ssl/server-key.pem \
--trusted-ca-file=/opt/kubernetes/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/kubernetes/etcd/ssl/ca.pem \
--logger=zap
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
eof
启动etcd

systemctl enable etcd --now

创建命令软链接
for i in `ls /opt/kubernetes/etcd/bin/`;do
ln -s /opt/kubernetes/etcd/bin/$i /usr/bin/$i
done
查看etcd状态
ETCDCTL_API=3 etcdctl --cacert=/opt/kubernetes/etcd/ssl/ca.pem --cert=/opt/kubernetes/etcd/ssl/server.pem --key=/opt/kubernetes/etcd/ssl/server-key.pem --endpoints="https://192.168.40.10:2379,https://192.168.40.20:2379,https://192.168.40.30:2379" endpoint health --write-out=table

1688117732550

etcdctl --cacert=/opt/kubernetes/etcd/ssl/ca.pem --cert=/opt/kubernetes/etcd/ssl/server.pem --key=/opt/kubernetes/etcd/ssl/server-key.pem --endpoints="https://192.168.40.10:2379,https://192.168.40.20:2379,https://192.168.40.30:2379" endpoint status --write-out=table

1688207252921

高可用(Master节点)

安装负载均衡

Kubernetes master 节点运行如下组件:

- kube-apiserver
- kube-scheduler
- kube-controller-manager

kube-scheduler 和 kube-controller-manager 可以以集群模式运行,通过 leader 选举产生一个工作进程,其它进程处于阻塞模式。kube-apiserver可以运行多个实例,但对其它组件需要提供统一的访问地址,该地址需要高可用。

本次部署使用 keepalived+haproxy 实现 kube-apiserver 的VIP 高可用和负载均衡。keepalived 提供 kube-apiserver 对外服务的 VIP高可用。haproxy 监听 VIP,后端连接所有 kube-apiserver 实例,提供健康检查和负载均衡功能。kube-apiserver的端口为6443, 为避免冲突, haproxy 监听的端口要与之不同,此实验中为6444。

keepalived 周期性检查本机的 haproxy 进程状态,如果检测到 haproxy 进程异常,则触发VIP 飘移。 所有组件都通过 VIP 监听的6444端口访问 kube-apiserver 服务。

在此我们使用睿云智合相关镜像,具体使用方法请访问: https://github.com/wise2c-devops 。当然也可以手动配置haproxy以实现apiserver负载均衡,keepalived实现haproxy高可用。

创建 haproxy和 keepalived的启动脚本

# vim haproxy.sh
#!/bin/bash
MasterIP1=192.168.40.10
MasterIP2=192.168.40.20
MasterIP3=192.168.40.30
MasterPort=6443                   # apiserver端口

docker run -d --restart=always --name haproxy-k8s -p 6444:6444 \
           -e MasterIP1=$MasterIP1 \
           -e MasterIP2=$MasterIP2 \
           -e MasterIP3=$MasterIP3 \
           -e MasterPort=$MasterPort  wise2c/haproxy-k8s

-----------------------------------------------------------------
# vim keepalived.sh
#!/bin/bash
VIRTUAL_IP=192.168.40.100         # VIP
INTERFACE=ens33                   # 网卡名称
NETMASK_BIT=24
CHECK_PORT=6444                   # Haproxy端口
RID=10
VRID=160
MCAST_GROUP=224.0.0.18
docker run -itd --restart=always --name=keepalived-k8s \
           --net=host --cap-add=NET_ADMIN \
           -e VIRTUAL_IP=$VIRTUAL_IP \
           -e INTERFACE=$INTERFACE \
           -e NETMASK_BIT=$NETMASK_BIT \
           -e CHECK_PORT=$CHECK_PORT \
           -e RID=$RID -e VRID=$VRID \
           -e MCAST_GROUP=$MCAST_GROUP  wise2c/keepalived-k8s

在所有Master节点执行脚本运行这两个容器

# sh haproxy.sh
# sh keepalived.sh

测试

1).在每台机器上查看容器(haproxy, keepalived)是否都正常运行
2).在每台机器上查看6444端口是否监听
3).在有VIP的机器关闭haproxy容器或keepalived容器看看VIP能否正常飘移

获取kubernetes镜像

根据官网的说法,使用kubeadm工具,获取部署kubernetes集群所需镜像。需要先配置自己的镜像仓库(也可以直接将镜像打包加载)!

[root@node2 images]# kubeadm config images list
W0427 10:30:29.946236   17852 images.go:80] could not find officially supported version of etcd for Kubernetes v1.27.2, falling back to the nearest etcd version (3.5.7-0)
registry.k8s.io/kube-apiserver:v1.27.2
registry.k8s.io/kube-controller-manager:v1.27.2
registry.k8s.io/kube-scheduler:v1.27.2
registry.k8s.io/kube-proxy:v1.27.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1
#然后拉取镜像,这里需要指定cri,因为docker底层有containerd,现在还安装了cri
#当有多个cri的时候kubernetes要求指定其中一个cri,没指定cri报错的时候会告知cri路径。
[root@localhost ~]# kubeadm config images pull --cri-socket= unix:///run/cri-dockerd.sock

此处我选择用一台可以连外网的机器,配置阿里加速源,并指定本地Harbor仓库(不指定端口push时会被加上docker.io/)

[root@download ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.cn-qingdao.aliyuncs.com"],
    "insecure-registries": ["http://harbor:80"]
}

[root@download ~]# docker login https://registry.cn-qingdao.aliyuncs.com

直接加载tar文件包的话也可以,还不用改标签

#!/bin/bash
for i in `ls *.tar`;do
	docker load -i $i
done

初始化yaml/yml文件(master1节点执行)

cat > init.yml << EOF
---
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: 192.168.40.10							# 本机IP
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.27.2									# kubernetes版本
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16									# pod的IP分配
  serviceSubnet: 10.96.0.0/12			
scheduler: {}
apiServerCertSANs:
- 192.168.40.100
controlPlaneEndpoint: "192.168.40.100:6444"					  # VIP和对应端口
etcd:
  external:
    caFile: /opt/kubernetes/etcd/ssl/ca.pem					# 由于配置了etcd的ssl通信,所以这里需
    certFile: /opt/kubernetes/etcd/ssl/server.pem			 # 要配置证书位置
    keyFile: /opt/kubernetes/etcd/ssl/server-key.pem
    endpoints:
       - https://192.168.40.10:2379
       - https://192.168.40.20:2379
       - https://192.168.40.30:2379
    endpoints:                                              # ETCD集群入口
      - https://192.168.40.10:2379
      - https://192.168.40.20:2379
      - https://192.168.40.30:2379
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# featureGates:											# 导致kubeproxy一直crashloopbackoff
#  SupportIPVSProxyMode: true
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging:
  flushFrequency: 0
  options:
    json:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
EOF

然后执行初始化命令

kubeadm init --config init.yml --upload-certs --v=9 | tee kubeadm-init.log
#如果出错了就重置,然后重新构建集群 :
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
#因为docker的containerd-cri会和cri-dockerd冲突,所以需要指定。
后续的join命令也要指定--cri-socket=unix:///var/run/cri-dockerd.sock

master:
kubeadm join 192.168.40.100:6444 --token abcdef.0123456789abcdef         --discovery-token-ca-cert-hash sha256:056f01ac455673d48aa7fbb6b7fb21ef92cedf083fe63d23924e3861acd367d3         --control-plane --certificate-key b6239063dd16d5fa275c351f57da81326f17e67ce7adcf0cef5b53bba0d74e4e --cri-socket=unix:///var/run/cri-dockerd.sock

node:
kubeadm join 192.168.40.100:6444 --token abcdef.0123456789abcdef         --discovery-token-ca-cert-hash sha256:056f01ac455673d48aa7fbb6b7fb21ef92cedf083fe63d23924e3861acd367d3 --cri-socket=unix:///var/run/cri-dockerd.sock

在master节点上执行以下命令以使用kubectl命令

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

其余节点也可以拷贝过去执行

拷贝k8s证书到其它主节点

for host in 20 30; do
    scp -r /etc/kubernetes/pki 192.168.40.$host:/etc/kubernetes/
done

将多余的证书删除(master2和3)

[root@master2 ~]# cd /etc/kubernetes/pki/
[root@master2 pki]# rm -rf api*
[root@master2 pki]# rm -rf front-proxy-client.*
[root@master2 pki]# ls
ca.crt  ca.key  front-proxy-ca.crt  front-proxy-ca.key  sa.key  sa.pub
kubernetes命令行补全
(前提)安装了bash-completion-extras
执行 source 命令
source /usr/share/bash-completion/bash_completion
如果想让系统中的所有用户都能拥有命令补全的功能,则执行如下命令
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
如果只需要当前用户拥有命令自动补全功能,则执行如下命令
此命令导入 bash 自动补全的命令

echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

安装网络插件(calico)

https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml

下载下来再用kubectl create -f 依次创建
kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml
custom-resources文件的网络域需要与前面初始化的pod域相同
卡在了docker pull docker.io/calico/pod2daemon-flexvol:v3.25.1(最后也是将镜像直接放到服务器中)

注意,主节点和从节点并不会共享镜像,所以加入从节点时也要将镜像复制一份过去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值