K8s 二進制部署 上篇

一 K8S按裝部署方式:

① Minikube

Minikube是一個工具,可以在本地快速運行一個單節點微型K8S,僅用于學習、預覽K8S的一些特

性使用。

部署地址:https://kubernetes.io/docs/setup/minikube

② Kubeadmin

Kubeadmin也是一個工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相對簡

單。

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

③ 二進制安裝部署

生產首選,從官方下載發行版的二進制包,手動部署每個組件和自簽TLS證書,組成K8S集群,新

手推薦。

https://github.com/kubernetes/kubernetes/releases

小結:

Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查。如果想更容易可控,推

薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利于

后期維護。

二 進制搭建 Kubernetes v1.20?

master01

kube-apiserver

kube-controller-manager

kube-scheduler etcd

192.168.11.6
node01kubelet kube-proxy docker?192.168.11.11
node02etc192.168.11.12

1 關閉防火墻 防護

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
清空默認過濾表、NAT 表和 Mangle 表中的所有規則,并刪除所有用戶自定義的鏈。iptables -F: 這個部分用于清空默認過濾表(filter table)中的所有規則。-F 選項表示清空規則。&&: 這是一個邏輯操作符,表示前一個命令成功執行后才會執行下一個命令。在這里,它將多個命令連接在一起,以確保只有在前一個命令成功執行后才會執行下一個命令。iptables -t nat -F: 這部分用于清空 NAT 表(nat table)中的所有規則。-t nat 選項表示指定操作 NAT 表,-F 選項表示清空規則。iptables -t mangle -F: 這部分用于清空 Mangle 表(mangle table)中的所有規則。-t mangle 選項表示指定操作 Mangle 表,-F 選項表示清空規則。iptables -X: 最后這部分用于刪除用戶自定義的鏈(chains)。通常,用戶可以創建自定義的鏈來管理特定類型的流量,這個命令將刪除所有這些用戶自定義的鏈。

?2 關閉swap

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 

3 根據規劃設置主機名?

hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

4 在master添加hosts

cat >> /etc/hosts << EOF
192.168.11.6 master01
192.168.11.11 node01
192.168.11.12 node02
EOF

5 調整內核參數

cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網橋模式,可將網橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關閉ipv6協議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOFsysctl --system

6 時間同步?

yum install ntpdate -yntpdate time.windows.com
用于通過 NTP 協議(Network Time Protocol)從指定的時間服務器(在這種情況下是 time.windows.com)同步系統的時間

?

注:若某一臺無法啟動 多重復幾次?

三 部署 docker引擎?

1 所有 node 節點部署docker引擎

  yum install -y yum-utils device-mapper-persistent-data lvm2yum-utils: 這是一個 YUM 的擴展工具集,提供了一些額外的功能和命令,用于包管理和系統維護。device-mapper-persistent-data: 這是一個軟件包,提供了設備映射器持久數據存儲的功能,通常用于與 LVM (Logical Volume Manager)一起使用。lvm2: 這是邏輯卷管理器(LVM)的軟件包,用于創建、管理邏輯卷、卷組和邏輯卷快照等。因此,這個命令的作用是安裝 yum-utils、device-mapper-persistent-data 和 lvm2 這三個軟件包,并且使用 -y 選項自動確認安裝過程,而不需要用戶手動確認。 

2 將阿里云鏡像站點上的 Docker CE 軟件源配置添加到系統的 YUM 軟件源列表中?

 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum-config-manager: 這是一個 YUM 工具,用于管理 YUM 軟件源的配置。--add-repo: 這是 yum-config-manager 的選項,表示要添加一個新的軟件源配置。https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo: 這是要添加的 Docker CE 軟件源的 URL,指向阿里云鏡像站點上的 Docker CE 軟件源配置文件。通過添加這個軟件源,系統就可以從該鏡像站點下載 Docker CE 軟件包。因此,這個命令的作用是將阿里云鏡像站點上的 Docker CE 軟件源配置添加到系統的 YUM 軟件源列表中,以便系統可以從該鏡像站點獲取 Docker CE 軟件包進行安裝。

3 安裝 Docker CE 相關的軟件包?

yum install -y docker-ce docker-ce-cli containerd.io
docker-ce: 這是 Docker CE(Docker Community Edition)的主要軟件包,包含了 Docker 引擎等核心組件。docker-ce-cli: 這是 Docker CE 的命令行界面工具軟件包,用于與 Docker 引擎進行交互和管理。containerd.io: 這是容器運行時(container runtime)軟件包,用于管理容器的生命周期,包括創建、運行和銷毀容器等操作。系統將會安裝 Docker CE 相關的軟件包,包括 Docker 引擎、命令行界面工具和容器運行時,使得系統可以開始使用 Docker 來構建、部署和管理容器化應用程序。systemctl start docker.service
systemctl enable docker.service 

四 部署 etcd 集群

etcd是CoreOS團隊于2013年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。etcd內部采用raft協議作為一致性算法,etcd是go語言編寫的。

1 etcd 作為服務發現系統,有以下的特點:

簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單

安全:支持SSL證書驗證

快速:單實例支持每秒2k+讀操作

可靠:采用raft算法,實現分布式系統數據的可用性和一致性?

etcd 目前默認使用2379端口提供HTTP API服務, 2380端口和peer通信(這兩個端口已經被

IANA(互聯網數字分配機構)官方預留給etcd)。 即etcd默認使用2379端口對外為客戶端提供通訊,

使用端口2380來進行服務器間內部通訊。

etcd 在生產環境中一般推薦集群方式部署。由于etcd 的leader選舉機制,要求至少為3臺或以上的

奇數臺。

?2 準備簽發證書環境

CFSSL 是 CloudFlare 公司開源的一款 PKI/TLS 工具。 CFSSL 包含一個命令行工具和一個用于簽名、驗證和捆綁 TLS 證書的 HTTP API 服務。使用Go語言編寫。
CFSSL 使用配置文件生成證書,因此自簽之前,需要生成它識別的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。CFSSL 用來為 etcd 提供 TLS 證書,它支持簽三種類型的證書:
1、client 證書,服務端連接客戶端時攜帶的證書,用于客戶端驗證服務端身份,如 kube-apiserver 訪問 etcd;
2、server 證書,客戶端連接服務端時攜帶的證書,用于服務端驗證客戶端身份,如 etcd 對外提供服務;
3、peer 證書,相互之間連接時使用的證書,如 etcd 節點之間進行驗證和通信。
這里全部都使用同一套證書認證。

3 在 master01 節點上操作

1) 準備cfssl證書生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
2) 添加權限?
chmod +x /usr/local/bin/cfssl*
--------------------------------------------------------
cfssl:證書簽發的工具命令
cfssljson:將 cfssl 生成的證書(json格式)變為文件承載式證書
cfssl-certinfo:驗證證書的信息
cfssl-certinfo -cert <證書名稱>			#查看證書的信息
---------------------------------------------------------

?

4 生成etcd證書?

mkdir /opt/k8s
cd /opt/k8s/上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
chmod +x etcd-cert.sh etcd.sh

vim etcd-cert.sh? ? ? 借用腳本切記IP地址?

創建用于生成CA證書、etcd 服務器證書以及私鑰的目錄?

mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh			#生成CA證書、etcd 服務器證書以及私鑰ls
ca-config.json  ca-csr.json  ca.pem        server.csr       server-key.pem
ca.csr          ca-key.pem   etcd-cert.sh  server-csr.json  server.pem

?5 上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動etcd服務

https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gzcd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
ls etcd-v3.4.9-linux-amd64
Documentation  etcd  etcdctl  README-etcdctl.md  README.md  READMEv2-etcdctl.md
------------------------------------------------------------------------------------------
etcd就是etcd 服務的啟動命令,后面可跟各種啟動參數
etcdctl主要為etcd 服務提供了命令行操作
------------------------------------------------------------------------------------------

6 創建用于存放 etcd 配置文件,命令文件,證書的目錄?

mkdir -p /opt/etcd/{cfg,bin,ssl}cd /opt/k8s/etcd-v3.4.9-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/cd /opt/k8s/
./etcd.sh etcd01 192.168.11.6 etcd02=https://192.168.11.11:2380,etcd03=https://192.168.11.12:2380#進入卡住狀態等待其他節點加入,這里需要三臺etcd服務同時啟動,如果只啟動其中一臺后,服務會卡在那里,直到集群中所有etcd節點都已啟動,可忽略這個情況#可另外打開一個窗口查看etcd進程是否正常
ps -ef | grep etcd

再打開另一個端口 進行驗證?

7?把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點

scp -r /opt/etcd/ root@192.168.11.12:/opt/
scp -r /opt/etcd/ root@192.168.11.11:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.11.11:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.11.12:/usr/lib/systemd/system/

?

8 在 node01 節點上操作

vim /opt/etcd/cfg/etcd#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.11.11:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.11.11:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.11.11:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.11.11:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.11.6:2380,etcd02=https://192.168.11.11:2380,etcd03=https://192.168.11.12:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

此時由于快照? 虛擬機

master01:192.168.11.5

node01:192.168.11.7

node02:192.168.11.14

在 node02 節點上操作
vim /opt/etcd/cfg/etcd
[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.11.7:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.11.7:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.11.7:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.11.7:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.11.5:2380,etcd02=https://192.168.11.7:2380,etcd03=https://192.168.11.14:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

?再次查看master01節點的etcd服務的狀態

9 查看etcd集群成員列表?

ETCDCTL_API=3   /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.11.5:2379,https://192.168.11.7:2379,https://192.168.11.14:2379" endpoint health --write-out=table

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.11.5:2379,https://192.168.11.7:2379,https://192.168.11.14:2379" endpoint status --write-out=table

?10 查看etcd集群成員列表


ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.11.4:2379,https://192.168.11.7:2379,https://192.168.11.14:2379" --write-out=table member list

五 master組件簽發證書?

在 master01 節點上操作

1 上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
cd /opt/k8s/unzip master.zipchmod +x *.sh

#!/bin/bash
mkdir /root/.kube
KUBE_CONFIG="/root/.kube/config"
KUBE_APISERVER="https://192.168.11.5:6443"cd /opt/k8s/k8s-cert/kubectl config set-cluster kubernetes \--certificate-authority=/opt/kubernetes/ssl/ca.pem \--embed-certs=true \--server=${KUBE_APISERVER} \--kubeconfig=${KUBE_CONFIG}
kubectl config set-credentials cluster-admin \--client-certificate=./admin.pem \--client-key=./admin-key.pem \--embed-certs=true \--kubeconfig=${KUBE_CONFIG}
kubectl config set-context default \--cluster=kubernetes \--user=cluster-admin \
--kubeconfig=${KUBE_CONFIG}
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}

?[root@master01 k8s]# vim admin.sh

[root@master01 k8s]# vim apiserver.sh??

#!/bin/bash
#example: apiserver.sh 192.168.80.10 https://192.168.80.10:2379,https://192.168.80.11:2379,https://192.168.80.12:2379
#創建 kube-apiserver 啟動參數配置文件
MASTER_ADDRESS=$1
ETCD_SERVERS=$2cat >/opt/kubernetes/cfg/kube-apiserver <<EOF
KUBE_APISERVER_OPTS="--logtostderr=false  \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--etcd-servers=${ETCD_SERVERS} \\
--bind-address=${MASTER_ADDRESS} \\
--secure-port=6443 \\
--advertise-address=${MASTER_ADDRESS} \\
--allow-privileged=true \\
--service-cluster-ip-range=10.0.0.0/24 \\
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
--authorization-mode=RBAC,Node \\
--enable-bootstrap-token-auth=true \\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\
--service-node-port-range=30000-50000 \\
--kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\
--kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\
--tls-cert-file=/opt/kubernetes/ssl/apiserver.pem  \\
--tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--service-account-issuer=api \\
--service-account-signing-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\
--etcd-certfile=/opt/etcd/ssl/server.pem \\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
--proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--requestheader-allowed-names=kubernetes \\
--requestheader-extra-headers-prefix=X-Remote-Extra- \\
--requestheader-group-headers=X-Remote-Group \\
--requestheader-username-headers=X-Remote-User \\
--enable-aggregator-routing=true \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
EOF#--logtostderr=true:啟用日志。輸出日志到標準錯誤控制臺,不輸出到文件
#--v=4:日志等級。指定輸出日志的級別,v=4為調試級別詳細輸出
#--etcd-servers:etcd集群地址。指定etcd服務器列表(格式://ip:port),逗號分隔
#--bind-address:監聽地址。指定 HTTPS 安全接口的監聽地址,默認值0.0.0.0
#--secure-port:https安全端口。指定 HTTPS 安全接口的監聽端口,默認值6443
#--advertise-address:集群通告地址。通過該 ip 地址向集群其他節點公布 api server 的信息,必須能夠被其他節點訪問
#--allow-privileged=true:啟用授權。允許擁有系統特權的容器運行,默認值false
#--service-cluster-ip-range:Service虛擬IP地址段。指定 Service Cluster IP 地址段
#--enable-admission-plugins:準入控制模塊。kuberneres集群的準入控制機制,各控制模塊以插件的形式依次生效,集群時必須包含ServiceAccount,運行在認證(Authentication)、授權(Authorization)之后,Admission Control是權限認證鏈上的最后一環, 對請求API資源對象進行修改和校驗
#--authorization-mode:認證授權,啟用RBAC授權和節點自管理。在安全端口使用RBAC,Node授權模式,未通過授權的請求拒絕,默認值AlwaysAllow。RBAC是用戶通過角色與權限進行關聯的模式;Node模式(節點授權)是一種特殊用途的授權模式,專門授權由kubelet發出的API請求,在進行認證時,先通過用戶名、用戶分組驗證是否是集群中的Node節點,只有是Node節點的請求才能使用Node模式授權
#--enable-bootstrap-token-auth:啟用TLS bootstrap機制。在apiserver上啟用Bootstrap Token 認證
#--token-auth-file=/opt/kubernetes/cfg/token.csv:指定bootstrap token認證文件路徑
#--service-node-port-range:指定 Service  NodePort 的端口范圍,默認值30000-32767
#–-kubelet-client-xxx:apiserver訪問kubelet客戶端證書
#--tls-xxx-file:apiserver https證書
#1.20版本必須加的參數:–-service-account-issuer,–-service-account-signing-key-file
#--etcd-xxxfile:連接Etcd集群證書
#–-audit-log-xxx:審計日志
#啟動聚合層相關配置:–requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing#創建 kube-apiserver.service 服務管理文件
cat >/usr/lib/systemd/system/kube-apiserver.service <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver

[root@master01 k8s]# vim controller-manager.sh??

?[root@master01 k8s]# vim scheduler.sh?

[root@master01 k8s]# vim k8s-cert.sh??

2 創建kubernetes工作目錄?
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

3 創建用于生成CA證書、相關組件的證書和私鑰的目錄?
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
./k8s-cert.sh				#生成CA證書、相關組件的證書和私鑰ls *pem
admin-key.pem  apiserver-key.pem  ca-key.pem  kube-proxy-key.pem  
admin.pem      apiserver.pem      ca.pem      kube-proxy.pem

?4 復制CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
5 解壓 kubernetes 壓縮包?
上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
#下載地址:https://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.md
#注:打開鏈接你會發現里面有很多包,下載一個server包就夠了,包含了Master和Worker Node二進制文件。

6 復制master組件的關鍵命令文件到 kubernetes工作目錄的 bin 子目錄中?
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/

7 創建 bootstrap token 認證文件,apiserver 啟動時會調用?
創建 bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創建了一個這個用戶,接下來就可以用 RBAC 給他授權
cd /opt/k8s/
vim token.sh
#!/bin/bash
#獲取隨機數前16個字節內容,以十六進制格式輸出,并刪除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') 
#生成 token.csv 文件,按照 Token序列號,用戶名,UID,用戶組 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOFchmod +x token.sh
./token.shcat /opt/kubernetes/cfg/token.csv

8 二進制文件、token、證書都準備好后,開啟 apiserver 服務?
二進制文件、token、證書都準備好后,開啟 apiserver 服務
cd /opt/k8s/
./apiserver.sh 192.168.11.6 https://192.168.11.6:2379,https://192.168.11.7:2379,https://192.168.11.14:2379

9 檢查進程是否啟動成功?
ps aux | grep kube-apiservernetstat -natp | grep 6443   #安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證

?

10 執行另外三個腳本
啟動 scheduler 服務
cd /opt/k8s/
./scheduler.sh
ps aux | grep kube-scheduler#啟動 controller-manager 服務
./controller-manager.sh
ps aux | grep kube-controller-manager#生成kubectl連接集群的kubeconfig文件
./admin.sh

11 通過kubectl工具查看當前集群組件狀態?

kubectl get cs

六? 部署 Worker Node 組件

1)在所有 node 節點上操作

1 創建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
2 上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh?
cd /opt/
unzip node.zip
chmod +x kubelet.sh proxy.sh

3 在 master01 節點上操作?
#把 kubelet、kube-proxy 拷貝到 node 節點
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.10.18:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.10.19:/opt/kubernetes/bin/

4 上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件?
上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群參數(CA 證書、API Server 地址),客戶端參數(上面生成的證書和私鑰),集群 context 上下文參數(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
mkdir /opt/k8s/kubeconfigcd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.11.5 /opt/k8s/k8s-cert/

5 把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點?
把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.11.7:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.11.14:/opt/kubernetes/cfg/

4 RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書?
RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap若執行失敗,可先給kubectl綁定默認cluster-admin管理員集群角色,授權集群操作權限
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

kubelet 采用 TLS Bootstrapping 機制,自動完成到 kube-apiserver 的注冊,在 node 節點量較大或者后期自動擴容時非常有用。
Master apiserver 啟用 TLS 認證后,node 節點 kubelet 組件想要加入集群,必須使用CA簽發的有效證書才能與 apiserver 通信,當 node 節點很多時,簽署證書是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機制來自動頒發客戶端證書,kubelet 會以一個低權限用戶自動向 apiserver 申請證書,kubelet 的證書由 apiserver 動態簽署。kubelet 首次啟動通過加載 bootstrap.kubeconfig 中的用戶 Token 和 apiserver CA 證書發起首次 CSR 請求,這個 Token 被預先內置在 apiserver 節點的 token.csv 中,其身份為 kubelet-bootstrap 用戶和 system:kubelet-bootstrap 用戶組;想要首次 CSR 請求能成功(即不會被 apiserver 401 拒絕),則需要先創建一個 ClusterRoleBinding,將 kubelet-bootstrap 用戶和 system:node-bootstrapper 內置 ClusterRole 綁定(通過 kubectl get clusterroles 可查詢),使其能夠發起 CSR 認證請求。TLS bootstrapping 時的證書實際是由 kube-controller-manager 組件來簽署的,也就是說證書有效期是 kube-controller-manager 組件控制的;kube-controller-manager 組件提供了一個 --experimental-cluster-signing-duration 參數來設置簽署的證書有效時間;默認為 8760h0m0s,將其改為 87600h0m0s,即 10 年后再進行 TLS bootstrapping 簽署證書即可。也就是說 kubelet 首次訪問 API Server 時,是使用 token 做認證,通過后,Controller Manager 會為 kubelet 生成一個證書,以后的訪問都是用證書做認證了。

2) 在 node01 節點上操作

1 啟動 kubelet 服務
在 node01 節點上操作
#啟動 kubelet 服務
cd /opt/
./kubelet.sh 192.168.11.7
ps aux | grep kubelet

2 在 master01 節點上操作,通過 CSR 請求?
在 master01 節點上操作,通過 CSR 請求
#檢查到 node01 節點的 kubelet 發起的 CSR 請求,Pending 表示等待集群給該節點簽發證書
kubectl get csr
NAME                                                   AGE  SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE   12s  kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending通過 CSR 請求
kubectl certificate approve node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE

3 Approved,Issued 表示已授權 CSR 請求并簽發證書?
Approved,Issued 表示已授權 CSR 請求并簽發證書
kubectl get csr
NAME                                                   AGE  SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE   2m5s kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued

?4 查看節點,由于網絡插件還沒有部署,節點會沒有準備就緒 NotReady
kubectl get node
NAME            STATUS     ROLES    AGE    VERSION
192.168.10.18   NotReady   <none>   108s   v1.20.11

3)在 node01 節點上操作?

加載 ip_vs 模塊
啟動proxy服務
#加載 ip_vs 模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done#啟動proxy服務
cd /opt/
./proxy.sh 192.168.11.7
ps aux | grep kube-proxy

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12705.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue網頁端控制臺展示獨有標記

效果展示 實現步驟 1. 新建js文件 定義一個類 用于提供控制臺打印日志顯示樣式的方法 src\libs\util.log.js class Logger {// 定義靜態方法static typeColor(type "default") {let color "";switch (type) {case "default":color "#3…

后臺菜單數據遞歸展示

后臺菜單數據遞歸展示 效果示例圖aslide.vueaslideItem.vuemenu 效果示例圖 aslide.vue <script setup>import {ref} from vue;const props defineProps({isCollapse: {type: Boolean,default: false}});import AslideItem from "./aslideItem.vue"const def…

MIRO時,修改頁簽“采購訂單參考”的數量時,金額不自動計算

MIRO 發票校驗時&#xff0c;進入到如下界面&#xff0c;系統參考采購訂單自動帶出已經收貨的金額和數量。 此時如果想要修改數量時&#xff0c;有些用戶賬號下&#xff0c;金額不自動計算&#xff0c;但是有些用戶賬號下&#xff0c;數量更改時&#xff0c;系統自動計算和建議…

“普惠門診保”24年升級回歸! 您醫保的有效商業補充!

2024年5月15日&#xff0c; “普惠門診保如意版”正式官宣發布&#xff01; 2023年&#xff0c;中國人民財產保險股份有限公司湖南省分公司積極創新的惠民型商業補充醫療保險&#xff0c;推出湖南省內首款互聯網門診醫療保險“普惠門診保” 2024年&#xff0c;在去年保障內容…

窮人翻身的秘訣!2024年普通人如何創業賺錢?窮人如何逆襲翻身?普通人創業新風口?

窮人的思維有一個致命的缺陷&#xff0c;就是追求確定性&#xff0c;進而失去了可能性。而賺錢的真相實際上非常殘酷。世界上能夠賺錢的事情必定是不確定的&#xff0c;能夠賺取巨額財富的事情更是極度不確定的。只有面對不確定性&#xff0c;才能讓你把競爭對手攔在門外&#…

如何在 Linux 上檢查 CPU 和硬盤溫度

為了更好地監測您的Linux系統的硬件健康狀況&#xff0c;如CPU與硬盤溫度、風扇轉速等關鍵指標&#xff0c;采用lm_sensors與hddtemp這兩款強大工具是明智之選。以下是關于這些工具的詳盡指南&#xff0c;包括它們的功能介紹、安裝步驟以及如何配置lm_sensors&#xff0c;旨在為…

ASCLL碼表以及字符的相加減

ASCLL碼表完整版及解釋_acssll碼-CSDN博客 #include <getopt.h> #include <stdio.h> #include <stdlib.h>#define MAX_PATH 256 char filename[MAX_PATH 5];int isdigit(int c) {if (c > 0 && c < 9)return 1;return 0; }int main(int argc…

【TypeScript】對象類型的定義

簡言 在 JavaScript 中&#xff0c;我們分組和傳遞數據的基本方式是通過對象。在 TypeScript 中&#xff0c;我們通過對象類型來表示這些對象。 對象類型 在 JavaScript 中&#xff0c;我們分組和傳遞數據的基本方式是通過對象。在 TypeScript 中&#xff0c;我們通過對象類…

Blender雕刻建模_筆刷紋理和頂點繪制

筆刷紋理 主要用于皮膚&#xff0c;紋理的雕刻。 可以修改映射方式來實現不同繪制效果。 用一張紋理來定義筆刷各個點的強度。其中白色為1&#xff0c;黑色為0。 設置筆刷紋理步驟&#xff1a; -新建一套筆刷 -強度&#xff0c;設為0.15&#xff08;可以根據需求修改&#x…

Visual Studio中的內存檢測工具:程序員的必備神器

在軟件開發的廣闊海洋中&#xff0c;Visual Studio&#xff08;VS&#xff09;如同一位全能的船長&#xff0c;不僅提供了豐富的代碼編輯和調試功能&#xff0c;還內置了多種實用的開發工具&#xff0c;其中內存檢測工具更是程序員定位和解決內存泄漏問題的得力助手。本文將詳細…

ACWing471. 棋盤-DFS剪枝

題目 思路 本思路參考博客AcWing 471. 棋盤 - AcWing 約束方程&#xff1a; 代碼 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N], n, m, dist[N][N]; int dx[4] {-1…

接口自動化-requests庫

requests庫是用來發送請求的庫&#xff0c;本篇用來講解requests庫的基本使用。 1.安裝requests庫 pip install requests 2.requests庫底層方法的調用邏輯 &#xff08;1&#xff09;get / post / put / delete 四種方法底層調用 request方法 注意&#xff1a;data和json都…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 駕校管理系統 設計與實現

一.項目介紹 系統角色&#xff1a;管理員、駕校教練、學員 管理員&#xff1a; 個人中心&#xff1a;修改密碼以及個人信息修改 學員管理&#xff1a;維護學員信息&#xff0c;維護學員成績信息 駕校教練管理&#xff1a;駕校教練信息的維護 駕校車輛管理&…

在Python中,f代表著格式化字符串

在Python中&#xff0c;f代表著格式化字符串&#xff08;Formatted String&#xff09;。格式化字符串是一種方便的字符串表示形式&#xff0c;它允許您在字符串中包含變量值&#xff0c;并在運行時將其替換為實際值。使用格式化字符串&#xff0c;您可以更輕松地構建復雜的字符…

java排課算法簡單demo

簡化的場景設定 有限的教室數量。每個教師可以教授多個課程。每個課程在一個特定的時間段內只能安排一次。考慮教室容量和課程需求。 Java代碼實現 首先&#xff0c;我們定義幾個基本的類&#xff1a;Course、Teacher、Room 和 TimeSlot。 import java.util.ArrayList; imp…

【R語言】ggplot中點的樣式shape參數匯總

ggplot中點的樣式展示&#xff1a; library(ggplot2)# 創建數據框 a<- data.frame(x 0:25, y 0:25) # 創建散點圖 ggplot(a, aes(x x, y y, shape as.factor(y))) geom_point(size 4) scale_shape_manual(values 0:25) labs(shape "形狀") theme(legend.…

產品經理如何進行項目管理?

產品經理如何進行項目管理&#xff1f; 項目管理和產品管理在本質上還是有一定差別的。產品更關注的是產品、功能、方向和反饋&#xff0c;而項目則更關注進度、質量和測試等。如果團隊沒有項目經理&#xff0c;那么產品經理就需要兼顧對開發人員、項目進度等進行管理。 此時…

K8S搭建

文章目錄 K8S搭建配置要求 安裝 Kuboard-Spray加載離線資源包規劃并安裝集群訪問集群重啟Kubernetes集群Worker節點不能啟動許多Pod一直Crash或不能正常訪問 containerd配置網絡代理 常用的 kubectl 命令&#xff1a; K8S搭建 安裝高可用的Kubernetes集群 配置要求 對于 Kub…

【Linux】高效文本處理命令

目錄 一.sort命令&#xff08;排序&#xff09; 1.語法格式 2.常用選項 3.相關示例 3.1. 3.2. 二.unip命令&#xff08;去重&#xff09; 1.語法格式 2.常用選項 3.相關示例 3.1. 3.2. 三.tr命令&#xff08;替換&#xff09; 1.語法格式 2.常用選項 3.相關示例…

TiDB學習2:TiDB Sever

目錄 1. TiDB Server架構 2. sql語句的解析和編譯 2.1 Parse ?編輯 2.2 compile 3. 行轉化為KV對(聚簇表) ?編輯4. SQL 讀寫相關模塊 4.1 DistSQL(復雜查詢) 4.2 KV(簡單查詢) 5. 在線DDL相關模塊 6. GC機制與相關模塊 7. TiDB Server的緩存 8. 熱點小表緩存 9. …