基于containerd二进制部署k8s-v1.23.3

Posted chen2ha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于containerd二进制部署k8s-v1.23.3相关的知识,希望对你有一定的参考价值。

 

文章目录

 

前言

为什么用 containerd ?

因为 k8s 早在2021年就说要取消 docker-shim ,相关的资料可以查看下面的链接

弃用 Dockershim 的常见问题

迟早都要接受的,不如早点接受

k8s 组件

Kubernetes 组件

  • master 节点
组件名称组件作用
etcd 兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
kube-apiserver 提供了资源操作的唯一入口,各组件协调者,并提供认证、授权、访问控制、API注册和发现等机制;
以 HTTP API 提供接口服务,所有对象资源的增删改查和监听操作都交给 apiserver 处理后再提交给 etcd 存储。
kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
处理集群中常规后台任务,一个资源对应一个控制器,而 controllermanager 就是负责管理这些控制器的。
kube-scheduler 负责资源的调度,按照预定的调度策略将 pod 调度到相应的机器上。
  • work 节点
组件名称组件作用
kubelet kubelet 是 master 在 work 节点上的 agent,管理本机运行容器的生命周期,比如创建容器、pod 挂载数据卷、下载 secret 、获取容器和节点状态等工作。
kubelet 将每个 pod 转换成一组容器。负责维护容器的生命周期,同时也负责 volume(CVI)和网络(CNI)的管理
kube-proxy 负责为 service 提供 cluster 内部的服务发现和负载均衡;
在 work 节点上实现 pod 网络代理,维护网络规则和四层负载均衡工作。
container runtime 负责镜像管理以及Pod和容器的真正运行(CRI)
目前用的比较多的有 docker 、 containerd
cluster networking 集群网络系统
目前用的比较多的有 flannel 、calico
coredns 负责为整个集群提供DNS服务
ingress controller 为服务提供外网入口
metrics-server 提供资源监控
dashboard 提供 GUI 界面

环境准备

IP角色内核版本
192.168.91.19 master/work centos7.6/3.10.0-957.el7.x86_64
192.168.91.20 work centos7.6/3.10.0-957.el7.x86_64
serviceversion
etcd v3.5.1
kubernetes v1.23.3
cfssl v1.6.1
containerd v1.5.9
pause v3.6
flannel v0.15.1
coredns v1.8.6
metrics-server v0.5.2
dashboard v2.4.0

cfssl github

etcd github

k8s github

containerd github

runc github

本次部署用到的安装包和镜像都上传到csdn了

master节点的配置不能小于2c2gwork节点可以给1c1g

节点之间需要完成免密操作,这里就不体现操作步骤了

因为懒…所以就弄了一个master节点

以下的操作,只需要选一台可以和其他节点免密的 master 节点就好

网络条件好的情况下,镜像可以让他自己拉取,如果镜像经常拉取失败,可以从本地上传镜像包然后导入到 containerd,文章后面的镜像导入一类的操作不是必须要操作的

创建目录

根据自身实际情况创建指定路径,此路径用来存放k8s二进制文件以及用到的镜像文件

mkdir -p /approot1/k8s/bin,images,pkg,tmp/ssl,service

关闭防火墙

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "systemctl disable firewalld"; \\
ssh $i "systemctl stop firewalld"; \\
done

关闭selinux

临时关闭

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "setenforce 0"; \\
done

永久关闭

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "sed -i \'/SELINUX/s/enforcing/disabled/g\' /etc/selinux/config"; \\
done

关闭swap

临时关闭

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "swapoff -a"; \\
done

永久关闭

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "sed -i \'/ swap / s/^\\(.*\\)$/#\\1/g\' /etc/fstab"; \\
done

开启内核模块

临时开启

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "modprobe ip_vs"; \\
ssh $i "modprobe ip_vs_rr"; \\
ssh $i "modprobe ip_vs_wrr"; \\
ssh $i "modprobe ip_vs_sh"; \\
ssh $i "modprobe nf_conntrack"; \\
ssh $i "modprobe nf_conntrack_ipv4"; \\
ssh $i "modprobe br_netfilter"; \\
ssh $i "modprobe overlay"; \\
done

永久开启

vim /approot1/k8s/tmp/service/k8s-modules.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
nf_conntrack_ipv4
br_netfilter
overlay

分发到所有节点

for i in 192.168.91.19 192.168.91.20;do \\
scp /approot1/k8s/tmp/service/k8s-modules.conf $i:/etc/modules-load.d/; \\
done

启用systemd自动加载模块服务

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "systemctl enable systemd-modules-load"; \\
ssh $i "systemctl restart systemd-modules-load"; \\
ssh $i "systemctl is-active systemd-modules-load"; \\
done

返回active表示 自动加载模块服务 启动成功

配置系统参数

以下的参数适用于3.x和4.x系列的内核

vim /approot1/k8s/tmp/service/kubernetes.conf

建议编辑之前,在 vim 里面先执行 :set paste ,避免复制进去的内容和文档的不一致,比如多了注释,或者语法对齐异常

# 开启数据包转发功能(实现vxlan)
net.ipv4.ip_forward=1
# iptables对bridge的数据进行处理
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-arptables=1
# 关闭tcp_tw_recycle,否则和NAT冲突,会导致服务不通
net.ipv4.tcp_tw_recycle=0
# 不允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_reuse=0
# socket监听(listen)的backlog上限
net.core.somaxconn=32768
# 最大跟踪连接数,默认 nf_conntrack_buckets * 4
net.netfilter.nf_conntrack_max=1000000
# 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.swappiness=0
# 计算当前的内存映射文件数。
vm.max_map_count=655360
# 内核可分配的最大文件数
fs.file-max=6553600
# 持久连接
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=10

分发到所有节点

for i in 192.168.91.19 192.168.91.20;do \\
scp /approot1/k8s/tmp/service/kubernetes.conf $i:/etc/sysctl.d/; \\
done

加载系统参数

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "sysctl -p /etc/sysctl.d/kubernetes.conf"; \\
done

清空iptables规则

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat"; \\
ssh $i "iptables -P FORWARD ACCEPT"; \\
done

配置 PATH 变量

for i in 192.168.91.19 192.168.91.20;do \\
ssh $i "echo \'PATH=$PATH:/approot1/k8s/bin\' >> $HOME/.bashrc"; \\
done
source $HOME/.bashrc

下载二进制文件

其中一台节点操作即可

github下载会比较慢,可以从本地上传到 /approot1/k8s/pkg/ 目录下

wget -O /approot1/k8s/pkg/kubernetes.tar.gz \\
https://dl.k8s.io/v1.23.3/kubernetes-server-linux-amd64.tar.gz

wget -O /approot1/k8s/pkg/etcd.tar.gz \\
https://github.com/etcd-io/etcd/releases/download/v3.5.1/etcd-v3.5.1-linux-amd64.tar.gz

解压并删除不必要的文件

cd /approot1/k8s/pkg/
for i in $(ls *.tar.gz);do tar xvf $i && rm -f $i;done
mv kubernetes/server/bin/ kubernetes/
rm -rf kubernetes/addons,kubernetes-src.tar.gz,LICENSES,server
rm -f kubernetes/bin/*_tag kubernetes/bin/*.tar
rm -rf etcd-v3.5.1-linux-amd64/Documentation etcd-v3.5.1-linux-amd64/*.md

部署 master 节点

创建 ca 根证书

wget -O /approot1/k8s/bin/cfssl https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
wget -O /approot1/k8s/bin/cfssljson https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
chmod +x /approot1/k8s/bin/*
vim /approot1/k8s/tmp/ssl/ca-config.json

  "signing": 
    "default": 
      "expiry": "87600h"
    ,
    "profiles": 
      "kubernetes": 
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "876000h"
      
    
  

vim /approot1/k8s/tmp/ssl/ca-csr.json

  "CN": "kubernetes",
  "key": 
    "algo": "rsa",
    "size": 2048
  ,
  "names": [
    
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    
  ],
  "ca": 
    "expiry": "876000h"
 

cd /approot1/k8s/tmp/ssl/
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

部署 etcd 组件

创建 etcd 证书

vim /approot1/k8s/tmp/ssl/etcd-csr.json

这里的192.168.91.19需要改成自己的ip,不要一股脑的复制黏贴

注意json的格式


  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "192.168.91.19"
  ],
  "key": 
    "algo": "rsa",
    "size": 2048
  ,
  "names": [
    
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    
  ]

cd /approot1/k8s/tmp/ssl/
cfssl gencert -ca=ca.pem \\
-ca-key=ca-key.pem \\
-config=ca-config.json \\
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd

配置 etcd 为 systemctl 管理

vim /approot1/k8s/tmp/service/kube-etcd.service.192.168.91.19

这里的192.168.91.19需要改成自己的ip,不要一股脑的复制黏贴

etcd 参数

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Type=notify
WorkingDirectory=/approot1/k8s/data/etcd
ExecStart=/approot1/k8s/bin/etcd \\
  --name=etcd-192.168.91.19 \\
  --cert-file=/etc/kubernetes/ssl/etcd.pem \\
  --key-file=/etc/kubernetes/ssl/etcd-key.pem \\
  --peer-cert-file=/etc/kubernetes/ssl/etcd.pem \\
  --peer-key-file=/etc/kubernetes/ssl/etcd-key.pem \\
  --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --initial-advertise-peer-urls=https://192.168.91.19:2380 \\
  --listen-peer-urls=https://192.168.91.19:2380 \\
  --listen-client-urls=https://192.168.91.19:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls=https://192.168.91.19:2379 \\
  --initial-cluster-token=etcd-cluster-0 \\
  --initial-cluster=etcd-192.168.91.19=https://192.168.91.19:2380 \\
  --initial-cluster-state=new \\
  --data-dir=/approot1/k8s/data/etcd \\
  --wal-dir= \\
  --snapshot-count=50000 \\
  --auto-compaction-retention=1 \\
  --auto-compaction-mode=periodic \\
  --max-request-bytes=10485760 \\
  --quota-backend-bytes=8589934592
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

分发证书以及创建相关路径

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

对应的目录也要确保和自己规划的一致,如果和我的有不同,注意修改,否则服务会启动失败

for i in 192.168.91.19;do \\
ssh $i "mkdir -p /etc/kubernetes/ssl"; \\
ssh $i "mkdir -m 700 -p /approot1/k8s/data/etcd"; \\
ssh $i "mkdir -p /approot1/k8s/bin"; \\
scp /approot1/k8s/tmp/ssl/ca*.pem,etcd*.pem $i:/etc/kubernetes/ssl/; \\
scp /approot1/k8s/tmp/service/kube-etcd.service.$i $i:/etc/systemd/system/kube-etcd.service; \\
scp /approot1/k8s/pkg/etcd-v3.5.1-linux-amd64/etcd* $i:/approot1/k8s/bin/; \\
done

启动 etcd 服务

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

for i in 192.168.91.19;do \\
ssh $i "systemctl daemon-reload"; \\
ssh $i "systemctl enable kube-etcd"; \\
ssh $i "systemctl restart kube-etcd --no-block"; \\
ssh $i "systemctl is-active kube-etcd"; \\
done

返回 activating 表示 etcd 还在启动中,可以稍等一会,然后再执行 for i in 192.168.91.19;do ssh $i "systemctl is-active kube-etcd";done

返回active表示 etcd 启动成功,如果是多节点 etcd ,其中一个没有返回active属于正常的,可以使用下面的方式来验证集群

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

for i in 192.168.91.19;do \\
ssh $i "ETCDCTL_API=3 /approot1/k8s/bin/etcdctl \\
        --endpoints=https://$i:2379 \\
        --cacert=/etc/kubernetes/ssl/ca.pem \\
        --cert=/etc/kubernetes/ssl/etcd.pem \\
        --key=/etc/kubernetes/ssl/etcd-key.pem \\
        endpoint health"; \\
done

https://192.168.91.19:2379 is healthy: successfully committed proposal: took = 7.135668ms

返回以上信息,并显示 successfully 表示节点是健康的

部署 apiserver 组件

创建 apiserver 证书

vim /approot1/k8s/tmp/ssl/kubernetes-csr.json

这里的192.168.91.19需要改成自己的ip,不要一股脑的复制黏贴

注意json的格式

10.88.0.1 是 k8s 的服务 ip,千万不要和现有的网络一致,避免出现冲突


  "CN": "kubernetes",
  "hosts": [
    "127.0.0.1",
    "192.168.91.19",
    "10.88.0.1",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local"
  ],
  "key": 
    "algo": "rsa",
    "size": 2048
  ,
  "names": [
    
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    
  ]

cd /approot1/k8s/tmp/ssl/
cfssl gencert -ca=ca.pem \\
-ca-key=ca-key.pem \\
-config=ca-config.json \\
-profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

创建 metrics-server 证书

vim /approot1/k8s/tmp/ssl/metrics-server-csr.json

  "CN": "aggregator",
  "hosts": [
  ],
  "key": 
    "algo": "rsa",
    "size": 2048
  ,
  "names": [
    
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    
  ]

cd /approot1/k8s/tmp/ssl/
cfssl gencert -ca=ca.pem \\
-ca-key=ca-key.pem \\
-config=ca-config.json \\
-profile=kubernetes metrics-server-csr.json | cfssljson -bare metrics-server

配置 apiserver 为 systemctl 管理

vim /approot1/k8s/tmp/service/kube-apiserver.service.192.168.91.19

这里的192.168.91.19需要改成自己的ip,不要一股脑的复制黏贴

--service-cluster-ip-range 参数的 ip 网段要和 kubernetes-csr.json 里面的 10.88.0.1 是一个网段的

--etcd-servers 如果 etcd 是多节点的,这里要写上所有的 etcd 节点

apiserver 参数

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
ExecStart=/approot1/k8s/bin/kube-apiserver \\
  --allow-privileged=true \\
  --anonymous-auth=false \\
  --api-audiences=api,istio-ca \\
  --authorization-mode=Node,RBAC \\
  --bind-address=192.168.91.19 \\
  --client-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --endpoint-reconciler-type=lease \\
  --etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  --etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \\
  --etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \\
  --etcd-servers=https://192.168.91.19:2379 \\
  --kubelet-certificate-authority=/etc/kubernetes/ssl/ca.pem \\
  --kubelet-client-certificate=/etc/kubernetes/ssl/kubernetes.pem \\
  --kubelet-client-key=/etc/kubernetes/ssl/kubernetes-key.pem \\
  --secure-port=6443 \\
  --service-account-issuer=https://kubernetes.default.svc \\
  --service-account-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \\
  --service-account-key-file=/etc/kubernetes/ssl/ca.pem \\
  --service-cluster-ip-range=10.88.0.0/16 \\
  --service-node-port-range=30000-32767 \\
  --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \\
  --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \\
  --requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --requestheader-allowed-names= \\
  --requestheader-extra-headers-prefix=X-Remote-Extra- \\
  --requestheader-group-headers=X-Remote-Group \\
  --requestheader-username-headers=X-Remote-User \\
  --proxy-client-cert-file=/etc/kubernetes/ssl/metrics-server.pem \\
  --proxy-client-key-file=/etc/kubernetes/ssl/metrics-server-key.pem \\
  --enable-aggregator-routing=true \\
  --v=2
Restart=always
RestartSec=5
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

分发证书以及创建相关路径

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

对应的目录也要确保和自己规划的一致,如果和我的有不同,注意修改,否则服务会启动失败

for i in 192.168.91.19;do \\
ssh $i "mkdir -p /etc/kubernetes/ssl"; \\
ssh $i "mkdir -p /approot1/k8s/bin"; \\
scp /approot1/k8s/tmp/ssl/ca*.pem,kubernetes*.pem,metrics-server*.pem $i:/etc/kubernetes/ssl/; \\
scp /approot1/k8s/tmp/service/kube-apiserver.service.$i $i:/etc/systemd/system/kube-apiserver.service; \\
scp /approot1/k8s/pkg/kubernetes/bin/kube-apiserver $i:/approot1/k8s/bin/; \\
done

启动 apiserver 服务

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

for i in 192.168.91.19;do \\
ssh $i "systemctl daemon-reload"; \\
ssh $i "systemctl enable kube-apiserver"; \\
ssh $i "systemctl restart kube-apiserver --no-block"; \\
ssh $i "systemctl is-active kube-apiserver"; \\
done

返回 activating 表示 apiserver 还在启动中,可以稍等一会,然后再执行 for i in 192.168.91.19;do ssh $i "systemctl is-active kube-apiserver";done

返回active表示 apiserver 启动成功

curl -k --cacert /etc/kubernetes/ssl/ca.pem \\
--cert /etc/kubernetes/ssl/kubernetes.pem \\
--key /etc/kubernetes/ssl/kubernetes-key.pem \\
https://192.168.91.19:6443/api

正常返回如下信息,说明 apiserver 服务运行正常


  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "192.168.91.19:6443"
    
  ]

查看 k8s 的所有 kind (对象类别)

curl -s -k --cacert /etc/kubernetes/ssl/ca.pem \\
--cert /etc/kubernetes/ssl/kubernetes.pem \\
--key /etc/kubernetes/ssl/kubernetes-key.pem \\
https://192.168.91.19:6443/api/v1/ | grep kind | sort -u
  "kind": "APIResourceList",
      "kind": "Binding",
      "kind": "ComponentStatus",
      "kind": "ConfigMap",
      "kind": "Endpoints",
      "kind": "Event",
      "kind": "Eviction",
      "kind": "LimitRange",
      "kind": "Namespace",
      "kind": "Node",
      "kind": "NodeProxyOptions",
      "kind": "PersistentVolume",
      "kind": "PersistentVolumeClaim",
      "kind": "Pod",
      "kind": "PodAttachOptions",
      "kind": "PodExecOptions",
      "kind": "PodPortForwardOptions",
      "kind": "PodProxyOptions",
      "kind": "PodTemplate",
      "kind": "ReplicationController",
      "kind": "ResourceQuota",
      "kind": "Scale",
      "kind": "Secret",
      "kind": "Service",
      "kind": "ServiceAccount",
      "kind": "ServiceProxyOptions",
      "kind": "TokenRequest",

配置 kubectl 管理

创建 admin 证书
vim /approot1/k8s/tmp/ssl/admin-csr.json

  "CN": "admin",
  "hosts": [
  ],
  "key": 
    "algo": "rsa",
    "size": 2048
  ,
  "names": [
    
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "system:masters",
      "OU": "System"
    
  ]

cd /approot1/k8s/tmp/ssl/
cfssl gencert -ca=ca.pem \\
-ca-key=ca-key.pem \\
-config=ca-config.json \\
-profile=kubernetes admin-csr.json | cfssljson -bare admin
创建 kubeconfig 证书

设置集群参数

--server 为 apiserver 的访问地址,修改成自己的 ip 地址和 service 文件里面指定的 --secure-port 参数的端口,切记,一定要带上https:// 协议,否则生成的证书,kubectl 命令访问不到 apiserver

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-cluster kubernetes \\
--certificate-authority=ca.pem \\
--embed-certs=true \\
--server=https://192.168.91.19:6443 \\
--kubeconfig=kubectl.kubeconfig

设置客户端认证参数

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-credentials admin \\
--client-certificate=admin.pem \\
--client-key=admin-key.pem \\
--embed-certs=true \\
--kubeconfig=kubectl.kubeconfig

设置上下文参数

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-context kubernetes \\
--cluster=kubernetes \\
--user=admin \\
--kubeconfig=kubectl.kubeconfig

设置默认上下文

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
分发 kubeconfig 证书到所有 master 节点

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

for i in 192.168.91.19;do \\
ssh $i "mkdir -p /etc/kubernetes/ssl"; \\
ssh $i "mkdir -p /approot1/k8s/bin"; \\
ssh $i "mkdir -p $HOME/.kube"; \\
scp /approot1/k8s/pkg/kubernetes/bin/kubectl $i:/approot1/k8s/bin/; \\
ssh $i "echo \'source <(kubectl completion bash)\' >> $HOME/.bashrc"
scp /approot1/k8s/tmp/ssl/kubectl.kubeconfig $i:$HOME/.kube/config; \\
done

部署 controller-manager 组件

创建 controller-manager 证书

vim /approot1/k8s/tmp/ssl/kube-controller-manager-csr.json

这里的192.168.91.19需要改成自己的ip,不要一股脑的复制黏贴

注意json的格式


    "CN": "system:kube-controller-manager",
    "key": 
        "algo": "rsa",
        "size": 2048
    ,
    "hosts": [
      "127.0.0.1",
      "192.168.91.19"
    ],
    "names": [
      
        "C": "CN",
        "ST": "ShangHai",
        "L": "ShangHai",
        "O": "system:kube-controller-manager",
        "OU": "System"
      
    ]

cd /approot1/k8s/tmp/ssl/
cfssl gencert -ca=ca.pem \\
-ca-key=ca-key.pem \\
-config=ca-config.json \\
-profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager

创建 kubeconfig 证书

设置集群参数

--server 为 apiserver 的访问地址,修改成自己的 ip 地址和 service 文件里面指定的 --secure-port 参数的端口,切记,一定要带上https:// 协议,否则生成的证书,kubectl 命令访问不到 apiserver

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-cluster kubernetes \\
--certificate-authority=ca.pem \\
--embed-certs=true \\
--server=https://192.168.91.19:6443 \\
--kubeconfig=kube-controller-manager.kubeconfig

设置客户端认证参数

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-credentials system:kube-controller-manager \\
--client-certificate=kube-controller-manager.pem \\
--client-key=kube-controller-manager-key.pem \\
--embed-certs=true \\
--kubeconfig=kube-controller-manager.kubeconfig

设置上下文参数

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-context system:kube-controller-manager \\
--cluster=kubernetes \\
--user=system:kube-controller-manager \\
--kubeconfig=kube-controller-manager.kubeconfig

设置默认上下文

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config \\
use-context system:kube-controller-manager \\
--kubeconfig=kube-controller-manager.kubeconfig

配置 controller-manager 为 systemctl 管理

vim /approot1/k8s/tmp/service/kube-controller-manager.service

这里的192.168.91.19需要改成自己的ip,不要一股脑的复制黏贴

--service-cluster-ip-range 参数的 ip 网段要和 kubernetes-csr.json 里面的 10.88.0.1 是一个网段的

--cluster-cidr 为 pod 运行的网段,要和 --service-cluster-ip-range 参数的网段以及现有的网络不一致,避免出现冲突

controller-manager 参数

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
ExecStart=/approot1/k8s/bin/kube-controller-manager \\
  --bind-address=0.0.0.0 \\
  --allocate-node-cidrs=true \\
  --cluster-cidr=172.20.0.0/16 \\
  --cluster-name=kubernetes \\
  --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \\
  --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \\
  --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\
  --leader-elect=true \\
  --node-cidr-mask-size=24 \\
  --root-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \\
  --service-cluster-ip-range=10.88.0.0/16 \\
  --use-service-account-credentials=true \\
  --v=2
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

分发证书以及创建相关路径

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

对应的目录也要确保和自己规划的一致,如果和我的有不同,注意修改,否则服务会启动失败

for i in 192.168.91.19;do \\
ssh $i "mkdir -p /etc/kubernetes/ssl"; \\
ssh $i "mkdir -p /approot1/k8s/bin"; \\
scp /approot1/k8s/tmp/ssl/kube-controller-manager.kubeconfig $i:/etc/kubernetes/; \\
scp /approot1/k8s/tmp/ssl/ca*.pem $i:/etc/kubernetes/ssl/; \\
scp /approot1/k8s/tmp/service/kube-controller-manager.service $i:/etc/systemd/system/; \\
scp /approot1/k8s/pkg/kubernetes/bin/kube-controller-manager $i:/approot1/k8s/bin/; \\
done

启动 controller-manager 服务

如果是多节点,只需要在192.168.91.19后面加上对应的ip即可,以空格为分隔,注意将192.168.91.19修改为自己的ip,切莫一股脑复制

for i in 192.168.91.19;do \\
ssh $i "systemctl daemon-reload"; \\
ssh $i "systemctl enable kube-controller-manager"; \\
ssh $i "systemctl restart kube-controller-manager --no-block"; \\
ssh $i "systemctl is-active kube-controller-manager"; \\
done

返回 activating 表示 controller-manager 还在启动中,可以稍等一会,然后再执行 for i in 192.168.91.19;do ssh $i "systemctl is-active kube-controller-manager";done

返回active表示 controller-manager 启动成功

部署 scheduler 组件

创建 scheduler 证书

vim /approot1/k8s/tmp/ssl/kube-scheduler-csr.json

这里的192.168.91.19需要改成自己的ip,不要一股脑的复制黏贴

注意json的格式


    "CN": "system:kube-scheduler",
    "key": 
        "algo": "rsa",
        "size": 2048
    ,
    "hosts": [
      "127.0.0.1",
      "192.168.91.19"
    ],
    "names": [
      
        "C": "CN",
        "ST": "ShangHai",
        "L": "ShangHai",
        "O": "system:kube-scheduler",
        "OU": "System"
      
    ]

cd /approot1/k8s/tmp/ssl/
cfssl gencert -ca=ca.pem \\
-ca-key=ca-key.pem \\
-config=ca-config.json \\
-profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler

创建 kubeconfig 证书

设置集群参数

--server 为 apiserver 的访问地址,修改成自己的 ip 地址和 service 文件里面指定的 --secure-port 参数的端口,切记,一定要带上https:// 协议,否则生成的证书,kubectl 命令访问不到 apiserver

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-cluster kubernetes \\
--certificate-authority=ca.pem \\
--embed-certs=true \\
--server=https://192.168.91.19:6443 \\
--kubeconfig=kube-scheduler.kubeconfig

设置客户端认证参数

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-credentials system:kube-scheduler \\
--client-certificate=kube-scheduler.pem \\
--client-key=kube-scheduler-key.pem \\
--embed-certs=true \\
--kubeconfig=kube-scheduler.kubeconfig

设置上下文参数

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config set-context system:kube-scheduler \\
--cluster=kubernetes \\
--user=system:kube-scheduler \\
--kubeconfig=kube-scheduler.kubeconfig

设置默认上下文

cd /approot1/k8s/tmp/ssl/
/approot1/k8s/pkg/kubernetes/bin/kubectl config \\
use-context system:kube-scheduler \\
--kubeconfig=kube-scheduler.kubeconfig

配置 scheduler 为 systemctl 管理

vim /approot1/k8s/tmp/service/kube-scheduler.service

scheduler 参数

[Unit]
D

以上是关于基于containerd二进制部署k8s-v1.23.3的主要内容,如果未能解决你的问题,请参考以下文章

kubeadm部署k8s-v1.23

《Kurnetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

基于containerd搭建的K8S集群calico与coredns组件一直处于pending状态

Centos7 部署 Containerd

Containerd容器运行时:yum安装与二进制安装,哪个更适合你?

[Harbor] Kubernetes对接Harbor私有镜像仓库 (运行时: containerd)