基于containerd二进制部署k8s-v1.23.3
Posted chen2ha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于containerd二进制部署k8s-v1.23.3相关的知识,希望对你有一定的参考价值。
文章目录
前言
为什么用 containerd ?
因为 k8s 早在2021年就说要取消 docker-shim ,相关的资料可以查看下面的链接
迟早都要接受的,不如早点接受
k8s 组件
- 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 |
service | version |
---|---|
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 |
master
节点的配置不能小于2c2g
,work
节点可以给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,不要一股脑的复制黏贴
[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 节点
[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
参数的网段以及现有的网络不一致,避免出现冲突
[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
[Unit]
D以上是关于基于containerd二进制部署k8s-v1.23.3的主要内容,如果未能解决你的问题,请参考以下文章
《Kurnetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》
基于containerd搭建的K8S集群calico与coredns组件一直处于pending状态