目錄
一? ? 實驗環境
二? ?操作系統初始化配置(所有機器)
1,關閉防火墻
2,關閉selinux
3,關閉swap
4,?根據規劃設置主機名
5,?做域名映射
6,調整內核參數
7,?時間同步
三? ?部署 docker引擎(node?節點)
四? ??部署 etcd 集群
1,?etcd?介紹
1.1?etcd?是什么
1.2?etcd?特點
1.3???etcd?端口
2,??準備簽發證書環境
3,?下載CFSSL三個工具
4,??生成Etcd證書
5,下載?etcd?的安裝包,啟動etcd
6,?把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
7,?在 node01 節點上操作(etcd02 )
8,?在 node02?節點上操作(etcd03?)
9 ,查看etcd主從?狀態
9.1?檢查etcd群集狀態
9.2?更詳細檢查etcd群集狀態
9.3??查看etcd集群成員列表
五? ??部署 Master 組件
1,上傳5個需要的腳本
2,創建kubernetes工作目錄
3,生成CA證書、相關組件的證書和私鑰
4,?將 master組件的關鍵命令文件到 kubernetes工作目錄的 bin?
5,? 創建token?認證文件
6,?查看準備環境
7,?開啟 apiserver 服務
8,?啟動 scheduler 服務
9,?啟動 controller-manager 服務
10,??生成kubectl連接集群的kubeconfig文件
11,通過kubectl工具查看當前集群組件狀態
六? ? ?部署 Worker Node 組件(在所有 node 節點上操作)
1,創建kubernetes工作目錄,上傳兩個腳本
2,把 kubelet、kube-proxy 拷貝到 node 節點
3,?生成node?節點的配置文件
3.1?具體步驟
3.2?具體解釋
4,?準備環境
4,? ?啟動? kubelet.sh?腳本? ?啟動kublet?組件
5,?在 master01 節點上操作,通過 CSR 請求
6,?node節點? ?啟動?proxy?組件
七? ???部署 CNI 網絡組件? 之部署 flannel
1,環境準備
2,準備flannel?鏡像
3,?準備?cni?的可執行應用
4,利用腳本部署 CNI 網絡
5,?查看node?節點狀態
6,?將node02?也加入網絡
八? ? 部署 CNI 網絡組件? 之部署??Calico
1,上傳 calico.yaml 文件到 /opt/k8s 目錄中,部署 CNI 網絡
2,執行yaml?文件
?3,?查看node?節點狀態
?九? ?二進制安裝步驟總結
1, 環境部署
2,node 節點 部署 docker引擎
3,部署 etcd 集群
3.1 ssl 子目錄準備
3.2 bin 子目錄準備
3.3 腳本啟動一臺etcd01
3.4 做其他的etcd
4,部署 Master 組件
4.1 ssl 子目錄準備
4.2 bin 子目錄準備
4.3 cfg 目錄準備
4.4 啟動 apiserver 服務
4.5 啟動 scheduler 服務
4.6 啟動 controller-manager 服務
4.7 啟動 kubectl 工具
5, 部署 Worker Node 集群
5.1 bin 子目錄 準備
5.2 cfg 子目錄準備
5.3 master 機器做RBAC授權
5.4 啟動 kubelet 服務
5.5 master通過 CSR 請求
5.6 啟動 proxy 服務
6, 部署 flannel
6.1 node機器
6.2 master 機器
7,部署 Calico
6.1 node 機器
6.2 master 機器
一? ? 實驗環境
k8s集群master01:192.168.217.66? ? kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群master02:192.168.217.77
k8s集群node01:192.168.217.88? ? kubelet kube-proxy docker?
k8s集群node02:192.168.217.99
etcd集群節點1:192.168.217.66? ? etcd
etcd集群節點2:192.168.217.88? ? etcdetcd集群節點3:192.168.217.99? ? etcd
負載均衡nginx+keepalive01(master):192.168.217.22
負載均衡nginx+keepalive02(backup):192.168.217.44
VIP 192.168.10.100
?
二? ?操作系統初始化配置(所有機器)
1,關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X#
iptables -F:這一部分命令是用來清空filter表中的所有規則鏈(包括INPUT、OUTPUT、FORWARD)。這意味著所有進入、離開或通過系統的數據包都將按照默認策略處理,通常是接受(ACCEPT)或拒絕(DROP)。iptables -t nat -F:這里,-t nat指定了操作表為nat表,-F則表示清空。它會清空nat表內的規則,包括PREROUTING、POSTROUTING和OUTPUT鏈。這些規則通常用于網絡地址轉換(NAT),比如端口轉發或者IP偽裝。iptables -t mangle -F:這部分命令清空了mangle表中的規則。mangle表用于修改數據包的服務類型、TTL(生存時間)值或標記等,通常涉及到更高級的路由和QoS(服務質量)控制。iptables -X:此命令用于刪除用戶自定義的(非內置的)鏈。這不會影響INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING這樣的內置鏈,而是會刪除你自己創建的任何額外鏈。綜上所述,執行這個命令后,你的iptables規則將會被完全重置,所有的自定義規則都會被清除,系統將恢復到iptables的初始默認狀態。在執行此操作前,請確保你了解這將對你的系統網絡安全設置產生的影響,并已經做好了相應的備份或有恢復策略。
2,關閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
3,關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# -r 是開啟擴展正則 將.*swap.* 換成#$
4,?根據規劃設置主機名
hostnamectl set-hostname master01
hostnamectl set-hostname master02
hostnamectl set-hostname node01
hostnamectl set-hostname node02
5,?做域名映射
cat >> /etc/hosts << EOF
192.168.217.66 master01
192.168.217.77 master02
192.168.217.88 node01
192.168.217.99 node02
EOF
6,調整內核參數
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
##
sysctl --system 命令用于從系統配置文件(通常是 /etc/sysctl.conf 以及 /etc/sysctl.d/ 目錄下的其他配置文件)中讀取并應用內核參數設置。當執行這個命令時,系統會遍歷這些配置文件,將其中定義的內核參數值應用到當前運行的內核中,從而實現對系統行為的調整,例如開啟或關閉IP轉發、調整網絡緩沖區大小、改變文件系統的行為等,而無需重啟系統。
7,?時間同步
yum install ntpdate -y
ntpdate time.windows.com
三? ?部署 docker引擎(node?節點)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.iosystemctl start docker.service
systemctl enable docker.service
四? ??部署 etcd 集群
CFSSL?是為etcd?的準備的? ?
CFSSL?生成的?密鑰文件? 會拖到?etcd?的ssl?目錄中
1,?etcd?介紹
1.1?etcd?是什么
etcd是CoreOS團隊于2013年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。etcd內部采用raft協議作為一致性算法,etcd是go語言編寫的。
1.2?etcd?特點
etcd 作為服務發現系統,有以下的特點:
簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
安全:支持SSL證書驗證
快速:單實例支持每秒2k+讀操作
可靠:采用raft算法,實現分布式系統數據的可用性和一致性
?
1.3???etcd?端口
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,?下載CFSSL三個工具
下載
#準備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
移到指定目錄? ?加權限
cfssl:證書簽發的工具命令
cfssljson:將 cfssl 生成的證書(json格式)變為文件承載式證書
cfssl-certinfo:驗證證書的信息
cfssl-certinfo -cert <證書名稱> #查看證書的信息
4,??生成Etcd證書
準備k8s?目錄
上傳 etcd-cert.sh (生成CFSSL?證書的腳本)和 etcd.sh (啟動?etcd?的腳本)到 /opt/k8s/ 目錄中
并加?執行權限
創建用于生成CA證書、etcd 服務器證書以及私鑰的目錄? ?將腳本移過去
編寫腳本? 注意更改證書 生命周期? ?以及etcf?服務器的ip?地址
運行腳本?生成CA證書、etcd 服務器證書以及私鑰
ca-config.json
:CA(Certificate Authority,證書頒發機構)的配置文件,定義了如何生成CA證書的規則,比如默認有效期、密鑰使用算法等。
ca-csr.json
:CA證書簽名請求文件(Certificate Signing Request),包含了請求CA簽發證書所需的信息。
ca.pem
:CA的公鑰證書文件,用于驗證由該CA簽發的所有證書的真實性。
server.csr
:服務器證書的簽名請求文件,用于請求簽發特定服務器的TLS證書。
server-key.pem
:服務器私鑰文件,與server.pem
一起用于服務器的TLS加密通信。
server-csr.json
:另一個服務器證書簽名請求文件,可能用于不同目的或備份。
server.pem
:服務器的公鑰證書文件,包含了服務器的公鑰以及由CA簽名的證書信息。
etcd-cert.sh
:一個腳本文件,可能是用來自動化執行上述TLS證書生成過程的Shell腳本。
5,下載?etcd?的安裝包,啟動etcd
下載?etcd?的安裝包?到/opt/k8s
https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
解壓安裝包并查看? ?
etcd就是etcd 服務的啟動命令,后面可跟各種啟動參數
etcdctl主要為etcd 服務提供了命令行操作
創建用于存放 etcd 配置文件,命令文件,證書的目錄
把?原來?壓縮包解壓出來的??etcd??etcdctl?移動到 bin
將把4個.pem?結尾的? ?證書 放ssl
寫etcd?啟動腳本 (根據腳本示例? ?用位置變量?跟三個etcd?的ip來啟動)腳本
確保所有的啟動etcd?的準備環境(cfg?配置文件目前是空的? 在啟動etcd?腳本后會自動生成)
啟動etcd?啟動腳本
cd /opt/k8s/./etcd.sh etcd01 192.168.217.66 etcd02=https://192.168.217.88:2380,etcd03=https://192.168.217.99:2380#
進入卡住狀態等待其他節點加入,這里需要三臺etcd服務同時啟動,如果只啟動其中一臺后,服務會卡在那里,直到集群中所有etcd節點都已啟動,可忽略這個情況
可另外打開一個窗口查看etcd進程是否正常ps -ef | grep etcd
注意?他可能會報超時的錯誤? ?查看端口都正常運行
6,?把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
拷貝etcd 目錄?下的所有文件(證書? 配置文件?二進制文件)
拷貝服務管理文件
scp /usr/lib/systemd/system/etcd.service root@192.168.217.99:/usr/lib/systemd/system/scp /usr/lib/systemd/system/etcd.service root@192.168.217.88:/usr/lib/systemd/system/
7,?在 node01 節點上操作(etcd02 )
vim /opt/etcd/cfg/etcd? ?寫etcd02?的配置文件
啟動etcd服務
8,?在 node02?節點上操作(etcd03?)
vim /opt/etcd/cfg/etcd?
9 ,查看etcd主從?狀態
啟動順序:?應先啟動etcd01? ?再啟動etcd02 03
9.1?檢查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.217.66:2379,https://192.168.217.88:2379,https://192.168.217.99:2379" endpoint health --write-out=table##########------------------------------------------------------------------------------------------
--cert-file:識別HTTPS端使用SSL證書文件
--key-file:使用此SSL密鑰文件標識HTTPS客戶端
--ca-file:使用此CA證書驗證啟用https的服務器的證書
--endpoints:集群中以逗號分隔的機器地址列表
cluster-health:檢查etcd集群的運行狀況
9.2?更詳細檢查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.217.66:2379,https://192.168.217.88:2379,https://192.168.217.99:2379" endpoint status --write-out=table######
------------------------------------------------------------------------------------------
--cert-file:識別HTTPS端使用SSL證書文件
--key-file:使用此SSL密鑰文件標識HTTPS客戶端
--ca-file:使用此CA證書驗證啟用https的服務器的證書
--endpoints:集群中以逗號分隔的機器地址列表
cluster-health:檢查etcd集群的運行狀況
ENDPOINT: 表示etcd集群中每個成員的訪問地址和端口。
ID: 是每個etcd節點在集群中的唯一標識符,通常是一個隨機生成的字符串。
VERSION: 顯示etcd服務器的版本號。
DB SIZE: 數據庫的大小,這里以“20 kB”為例,表示當前etcd節點存儲的數據量大小。
IS LEADER: 指示該節點是否為集群中的領導者(Leader)。在Raft共識算法中,集群中只有一個Leader負責處理所有寫操作和協調集群狀態。結果顯示為
true
或false
。IS LEARNER: 表示該節點是否為學習者(Learner)節點,學習者節點接收復制的日志條目但不參與選舉。結果顯示為
true
或false
。RAFT TERM: Raft協議中的任期號(Term),用于選舉領導和日志復制的邏輯時鐘。每當選舉出新的領導者時,任期號就會遞增。
RAFT INDEX: 當前Raft日志條目的索引,表示了Raft日志的最新位置。
RAFT APPLIED INDEX: 已經被應用到狀態機的日志條目索引,這個值應該總是小于等于
RAFT INDEX
,表示哪些日志已經被實際執行。ERRORS: 如果在檢查該節點狀態時遇到任何錯誤,這一列將顯示具體的錯誤信息。如果沒有錯誤,則為空。
9.3??查看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.217.66:2379,https://192.168.217.88:2379,https://192.168.217.99:2379" --write-out=table member list
五? ??部署 Master 組件
大體邏輯是??創建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}? 將需要的文件都拖入然后?分別執行4個腳本?開啟? ?
apiserver 服務(? ? 需要二進制文件、token、證書)
scheduler 服務
controller-manager 服務kubectl工具
1,上傳5個需要的腳本
上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中
解壓 master.zip 壓縮包??unzip master.zip
得到4個?啟動腳本? ? 以及生成證書的腳本(api?server?需要)
2,創建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
3,生成CA證書、相關組件的證書和私鑰
創建用于生成CA證書、相關組件的證書和私鑰的目錄
運行腳本? ? 生成CA證書、相關組件的證書和私鑰
修改? 這個生成證書的?腳本
啟動腳本? ?生成證書??./k8s-cert.sh?
復制CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
4,?將 master組件的關鍵命令文件到 kubernetes工作目錄的 bin?
#上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
#下載地址:
ttps://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.md
#注:打開鏈接你會發現里面有很多包,下載一個server包就夠了,包含了Master和Worker Node二進制文件。
?解壓kubernetes-server?包
查看解壓后的?文件
復制master組件的關鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
并?做軟連接
5,? 創建token?認證文件
創建 bootstrap toke長度n 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創建了一個這個用戶,接下來就可以用 RBAC 給他授權
cd /opt/k8s/? ??vim token.sh
#獲取隨機數前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"
EOF
腳本執行完畢后,會在
/opt/kubernetes/cfg/token.csv
路徑下生成一個包含新Bootstrap Token的CSV文件。當 Kubernetes API Server 啟動時,如果配置為讀取此文件或目錄下的token文件,它會自動識別并注冊這些Token,使得集群內可以使用這個Token進行認證。之后,通過RBAC(Role-Based Access Control)系統,可以進一步為這個Token關聯的用戶或用戶組分配具體的訪問權限。
給腳本加權限? ?并執行? 這就是token
6,?查看準備環境
4個啟動?腳本
7,?開啟 apiserver 服務
二進制文件、token、證書都準備好后,開啟 apiserver 服務
./apiserver.sh 192.168.217.66 https://192.168.217.66:2379,https://192.168.217.88:2379,https://192.168.217.99:2379
檢查進程是否啟動成功
ps aux | grep kube-apiservernetstat -natp | grep 6443 #安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證
8,?啟動 scheduler 服務
vim scheduler.sh
啟動腳本
查看是否啟動成功
9,?啟動 controller-manager 服務
vim controller-manager.sh?
啟動腳本
查看是否啟動成功
10,??生成kubectl連接集群的kubeconfig文件
vim admin.sh
啟動腳本
11,通過kubectl工具查看當前集群組件狀態
kubectl get cs
查看版本信息
kubectl version
六? ? ?部署 Worker Node 組件(在所有 node 節點上操作)
大體的思路就是?bin,cfg,ssl,logs?這四個文件夾內放入指定
通過這兩個腳本啟動組件 ?kubelet.sh、proxy.sh
?
1,創建kubernetes工作目錄,上傳兩個腳本
解壓壓縮包?查看壓縮包? 獲得兩個啟動腳本,并加權限
2,把 kubelet、kube-proxy 拷貝到 node 節點
在 master01 節點上操作
3,?生成node?節點的配置文件
3.1?具體步驟
在 master01 節點上操作
上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中
?#上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群參數(CA 證書、API Server 地址),客戶端參數(上面生成的證書和私鑰),集群 context 上下文參數(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
執行腳本
把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點
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
3.2?具體解釋
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 生成一個證書,以后的訪問都是用證書做認證了。
?
4,?準備環境
準備兩個啟動腳本
準備?對應目錄的文件
4,? ?啟動? kubelet.sh?腳本? ?啟動kublet?組件
在 node01 節點上操作
?查看kubelet.sh?腳本
啟動kubelet?組件
5,?在 master01 節點上操作,通過 CSR 請求
在?master01 節點上操作
檢查到 node01 節點的 kubelet 發起的 CSR 請求,Pending 表示等待集群給該節點簽發證書
通過 CSR 請求
kubectl certificate approve # 后面跟node請求的那個很長的編號
再次查看??Approved,Issued 表示已授權 CSR 請求并簽發證書
6,?node節點? ?啟動?proxy?組件
在?master01 節點上操作
查看節點,由于網絡插件還沒有部署,節點會沒有準備就緒 NotReady
在 node01 節點上操作
加載 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--------------------------------------------------------
#
對于在 /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs 路徑下,通過列出文件并使用 grep 命令篩選出以點號之前的部分(即模塊名稱)的每一個條目,執行以下操作:打印(echo)出當前處理的模塊名稱。
使用 /sbin/modinfo 命令查詢該模塊的文件名(-F filename),此步驟用來檢查模塊信息是否存在且是否可以被正確識別。2>&1 是將錯誤輸出重定向到標準輸出,以便于忽略可能的錯誤信息不影響后續命令執行。
如果上一步驟成功(意味著模塊信息存在且可識別),則使用 /sbin/modprobe 命令加載該內核模塊。
簡而言之,這個腳本會遍歷指定目錄下的 IPVS 相關內核模塊,檢查每個模塊的有效性,然后嘗試加載這些有效的內核模塊。
啟動proxy服務
node2?重復以上操作
七? ???部署 CNI 網絡組件? 之部署 flannel
1,環境準備
在?master01 節點上操作
兩個node? 都通過已授權 CSR 請求并簽發證書
2,準備flannel?鏡像
在?node01 節點上操作
準備flannel?鏡像的壓縮包
導入鏡像
3,?準備?cni?的可執行應用
在?node01 節點上操作
創建指定目錄? ? 將cni?壓縮包解壓到??
看一下? 全是綠色可執行文件
4,利用腳本部署 CNI 網絡
在?master01 節點上操作
上傳 kube-flannel.yml 文件到 /opt/k8s 目錄中,部署 CNI 網絡
?
執行部署的?yaml?文件
kubectl apply -f kube-flannel.yml
5,?查看node?節點狀態
在?master01 節點上操作
kubectl get pods -n kube-system##########################
這個命令是用于在 Kubernetes 集群中查詢指定命名空間 (kube-system) 內的所有 Pod 的狀態
查看node?狀態
6,?將node02?也加入網絡
因為?k8s?自動修復的功能? ?所以只需要在node02? 上拖入flannel?鏡像,和cni?應用
node2? 即會自動加入網絡
在?node02 節點上操作
在?master01 節點上操作
八? ? 部署 CNI 網絡組件? 之部署??Calico
備注:?此項操作與部署flannel?二選一?
這邊不需要拖cni包,ymal 文件全給你配置好了,他會從鏡像倉庫上拉取,自動解壓到/opt/cni/bin ? 變成一堆綠色的可執行文件 這邊注意網絡環境是否通暢,如有必要改一下dns
在?master01 節點上操作
1,上傳 calico.yaml 文件到 /opt/k8s 目錄中,部署 CNI 網絡
#修改里面定義 Pod 的網絡(CALICO_IPV4POOL_CIDR),需與前面 kube-controller-manager 配置文件指定的 cluster-cidr 網段一樣
#Calico 默認使用的網段為 192.168.0.0/16
2,執行yaml?文件
kubectl apply -f calico.yaml
?3,?查看node?節點狀態
此時有個為notready? 因為88機器未做好cni組件
?將?node02?里? cni文件夾下的一堆可執行文件? ?拖到node01
注意!此處這些綠色可執行文件和flannel?模式下的? 文件是不一樣的
再次查看? 網絡已通
以上。一個簡單架構的未禁止安裝k8s?就做好了
由于篇幅有限,下一章將詳細介紹部署master02?以及?nginx負載均衡
?九? ?二進制安裝步驟總結
1, 環境部署
關閉防火墻 關閉selinux 關閉swap 根據規劃設置主機名
做域名映射 調整內核參數 時間同步
2,node 節點 部署 docker引擎
3,部署 etcd 集群
大體步驟是 etcd 目錄下(cfg bin ssl 三個子目錄)
3.1 ssl 子目錄準備
下載CFSSL 工具
用etcd-cert.sh腳本 生成CA證書、etcd 服務器證書以及私鑰
4個.pem 結尾的 文件 放ssl
3.2 bin 子目錄準備
下載 etcd 的安裝包(etcd-v3.4.9-linux-amd64.tar.gz) 解壓
將可執行文件 etcd etcdctl 移動到 bin
3.3 腳本啟動一臺etcd01
etcd.sh
3.4 做其他的etcd
拷貝 etcd 目錄下(cfg bin ssl 三個子目錄)
拷貝服務管理文件
改其他etcd機器的 etcd 目錄下cfg子目錄的配置文件
4,部署 Master 組件
大體步驟是 kubernetes目錄 下 bin,cfg,ssl,logs 四個子目錄
4.1 ssl 子目錄準備
下載CFSSL 工具
用k8s-cert.sh 腳本 生成CA證書、apiserver相關證書和私鑰
4個.pem 結尾的 文件 放ssl
4.2 bin 子目錄準備
下載master的安裝包( kubernetes-server-linux-amd64.tar.gz) 解壓
將可執行文件 (kube-apiserver kubectl kube-controller-manager kube-scheduler)移動到 bin
4.3 cfg 目錄準備
用token.sh 腳本 在/opt/kubernetes/cfg/token.csv 生成token 令牌
4.4 啟動 apiserver 服務
用 apiserver.sh 腳本
4.5 啟動 scheduler 服務
用scheduler.sh 腳本 (需要在腳本指定api server 的ip)
4.6 啟動 controller-manager 服務
用controller-manager.sh 腳本 (需要在腳本指定api server 的ip)
4.7 啟動 kubectl 工具
用 admin.sh 腳本 (需要在腳本指定api server 的ip)
5, 部署 Worker Node 集群
大體步驟是 kubernetes目錄 下 bin,cfg,ssl,logs 四個子目錄
5.1 bin 子目錄 準備
將master的安裝包( kubernetes-server-linux-amd64.tar.gz) 解壓后的 可執行文件 kubelet kube-proxy 放入
5.2 cfg 子目錄準備
在master機器 用kubeconfig.sh 腳本 生成生成kubelet初次加入集群需要的bootstrap.kubeconfig、kube-proxy.kubeconfig
把bootstrap.kubeconfig、kube-proxy.kubeconfig 放入
5.3 master 機器做RBAC授權
RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書
5.4 啟動 kubelet 服務
kubelet.sh 腳本
5.5 master通過 CSR 請求
因為啟動了 kubelet 服務 所以會有來自node的請求
檢查CSR 請求 (kubectl get csr)
并通過 CSR 請求 (kubectl certificate approve 請求編號)
5.6 啟動 proxy 服務
加載 ip_vs 模塊
proxy.sh 腳本 啟動
6, 部署 flannel
6.1 node機器
載入 flannel 鏡像
將cni 包加壓到 /opt/cni/bin
6.2 master 機器
執行部署的 yaml 文件 kubectl apply -f kube-flannel.yml
7,部署 Calico
6.2 master 機器
(改ip)執行部署的 yaml 文件 kubectl apply -f calico.yaml