1. 程式人生 > 其它 >K8s二進位制部署單節點 master元件 node元件 ——頭懸樑

K8s二進位制部署單節點 master元件 node元件 ——頭懸樑

K8s二進位制部署單節點 master元件 node元件 ——頭懸樑

1、master元件部署

2、node 元件部署

k8s叢集搭建:

  • etcd叢集
  • flannel網路外掛
  • 搭建master元件
  • 搭建node元件

1、master元件部署:

建立工作目錄
生成證書
準備k8s軟體包
生成bootstrap token 認證檔案
啟動 apiserver
啟動controller-manager、scheduler
驗證master元件狀態

1 ##### 在 master01 節點上操作 #####
 2 //上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
 3 cd /opt/k8s/
 4 unzip master.zip
 5 apiserver.sh
 6 scheduler.sh
 7 controller-manager.sh
 8 
 9 chmod +x *.sh
10 
11 //建立kubernetes工作目錄
12 mkdir -p /opt/kubernetes/{cfg,bin,ssl}
13 
14 //建立用於生成CA證書、相關元件的證書和私鑰的目錄
15 mkdir /opt/k8s/k8s-cert
16 mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
17 cd /opt/k8s/k8s-cert/
18 ./k8s-cert.sh                #生成CA證書、相關元件的證書和私鑰
19 
20 ls *pem
21 admin-key.pem  apiserver-key.pem  ca-key.pem  kube-proxy-key.pem  
22 admin.pem      apiserver.pem      ca.pem      kube-proxy.pem      
23 //controller-manager 和 kube-scheduler 設定為只調用當前機器的 apiserver,使用 127.0.0.1:8080 通訊,因此不需要簽發證書
24 
25 //複製CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中
26 cp ca*pem apiserver*pem /opt/kubernetes/ssl/
27 
28 //上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
29 cd /opt/k8s/
30 tar zxvf kubernetes-server-linux-amd64.tar.gz
31 
32 //複製master元件的關鍵命令檔案到 kubernetes工作目錄的 bin 子目錄中
33 cd /opt/k8s/kubernetes/server/bin
34 cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
35 ln -s /opt/kubernetes/bin/* /usr/local/bin/
36 
37 //建立 bootstrap token 認證檔案,apiserver 啟動時會呼叫,然後就相當於在叢集內建立了一個這個使用者,接下來就可以用 RBAC 給他授權
38 cd /opt/k8s/
39 vim token.sh
40 #!/bin/bash
41 #獲取隨機數前16個位元組內容,以十六進位制格式輸出,並刪除其中空格
42 BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
43 #生成 token.csv 檔案,按照 Token序列號,使用者名稱,UID,使用者組 的格式生成
44 cat > /opt/kubernetes/cfg/token.csv <<EOF
45 ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
46 EOF
47 
48 chmod +x token.sh
49 ./token.sh
50 
51 cat /opt/kubernetes/cfg/token.csv
52 
53 //二進位制檔案、token、證書都準備好後,開啟 apiserver 服務
54 cd /opt/k8s/
55 56 
57 //檢查程序是否啟動成功
58 ps aux | grep kube-apiserver
59 
60 //k8s通過kube-apiserver這個程序提供服務,該程序執行在單個master節點上。預設有兩個埠6443和8080
61 //安全埠6443用於接收HTTPS請求,用於基於Token檔案或客戶端證書等認證
62 netstat -natp | grep 6443
63 
64 //本地埠8080用於接收HTTP請求,非認證或授權的HTTP請求通過該埠訪問API Server
65 netstat -natp | grep 8080
66 
67 //檢視版本資訊(必須保證apiserver啟動正常,不然無法查詢到server的版本資訊)
68 kubectl version
69 
70 
71 //啟動 scheduler 服務
72 cd /opt/k8s/
73 ./scheduler.sh 127.0.0.1
74 
75 ps aux | grep kube-scheduler
76 
77 
78 //啟動 controller-manager 服務
79 cd /opt/k8s/
80 ./controller-manager.sh 127.0.0.1
81 
82 
83 //檢視 master 節點狀態
84 kubectl get componentstatuses        #也可以 kubectl get cs
85 NAME                 STATUS    MESSAGE             ERROR
86 controller-manager   Healthy   ok                  
87 scheduler            Healthy   ok                  
88 etcd-2               Healthy   {"health":"true"}   
89 etcd-1               Healthy   {"health":"true"}   
90 etcd-0               Healthy   {"health":"true"}

2、node元件部署:

node搭建流程

  • 準備 kubelet kube-proxy 啟動,停止等操作,用於管理kubelei和kube-proxy程序
  • 在master節點上準備kubelet和kube-proxy加入k8s群集所要使用的kubeconfig檔案,並傳給node節點
  • kubeconfig檔案包含了加入k8s叢集需要的ca證書,tls證書和私鑰,bootstrap的token資訊,master的apisever IP+埠(6443)
  • node節點啟動kubelet,node節點的kublet會向master的apiserver發起CSR認證請求
  • 在Master節點上通過CSR認證,node會自動生成證書,以後的node的kubelet訪問都會通過這個證書做認證
  • node節點上載入ipvs模組,再啟動kube-proxy
1 ##### 在 master01 節點上操作 #####
  2 //把 kubelet、kube-proxy 拷貝到 node 節點
  3 cd /opt/k8s/kubernetes/server/bin
  4 scp kubelet kube-proxy [email protected]:/opt/kubernetes/bin/
  5 scp kubelet kube-proxy [email protected]:/opt/kubernetes/bin/
  6 
  7 
  8 ##### 在 node01 節點上操作 #####
  9 //上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh
 10 cd /opt/
 11 unzip node.zip
 12 
 13 
 14 ##### 在 master01 節點上操作 #####
 15 //建立用於生成kubelet的配置檔案的目錄
 16 mkdir /opt/k8s/kubeconfig
 17 
 18 //上傳 kubeconfig.sh 檔案到 /opt/k8s/kubeconfig 目錄中
 19 #kubeconfig.sh 檔案包含叢集引數(CA 證書、API Server 地址),客戶端引數(上面生成的證書和私鑰),叢集 context 上下文引數(叢集名稱、使用者名稱)。Kubenetes 元件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 檔案可以切換到不同的叢集,連線到 apiserver。
 20 cd /opt/k8s/kubeconfig
 21 chmod +x kubeconfig.sh
 22 
 23 //生成kubelet的配置檔案
 24 cd /opt/k8s/kubeconfig
 25 ./kubeconfig.sh 192.168.80.10 /opt/k8s/k8s-cert/
 26 
 27 ls
 28 bootstrap.kubeconfig  kubeconfig.sh  kube-proxy.kubeconfig
 29 
 30 //把配置檔案 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點
 31 cd /opt/k8s/kubeconfig
 32 scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]:/opt/kubernetes/cfg/
 33 scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]:/opt/kubernetes/cfg/
 34 
 35 //RBAC授權,將預設使用者 kubelet-bootstrap 與內建的 ClusterRole system:node-bootstrapper 繫結到一起,使其能夠發起 CSR 請求
 36 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
 37 
 38 ------------------------------------------------------------------------------------------
 39 kubelet 採用 TLS Bootstrapping 機制,自動完成到 kube-apiserver 的註冊,在 node 節點量較大或者後期自動擴容時非常有用。
 40 Master apiserver 啟用 TLS 認證後,node 節點 kubelet 元件想要加入叢集,必須使用CA簽發的有效證書才能與 apiserver 通訊,當 node 節點很多時,簽署證書是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機制來自動頒發客戶端證書,kubelet 會以一個低許可權使用者自動向 apiserver 申請證書,kubelet 的證書由 apiserver 動態簽署。
 41 
 42 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 認證請求。
 43 
 44 TLS bootstrapping 時的證書實際是由 kube-controller-manager 元件來簽署的,也就是說證書有效期是 kube-controller-manager 元件控制的;kube-controller-manager 元件提供了一個 --experimental-cluster-signing-duration 引數來設定簽署的證書有效時間;預設為 8760h0m0s,將其改為 87600h0m0s,即 10 年後再進行 TLS bootstrapping 簽署證書即可。
 45 
 46 也就是說 kubelet 首次訪問 API Server 時,是使用 token 做認證,通過後,Controller Manager 會為 kubelet 生成一個證書,以後的訪問都是用證書做認證了。
 47 ------------------------------------------------------------------------------------------
 48 
 49 //檢視角色:
 50 kubectl get clusterroles | grep system:node-bootstrapper
 51 
 52 //檢視已授權的角色:
 53 kubectl get clusterrolebinding
 54 
 55 
 56 ##### 在 node01 節點上操作 #####
 57 //使用kubelet.sh指令碼啟動kubelet服務
 58 cd /opt/
 59 chmod +x kubelet.sh
 60 ./kubelet.sh 192.168.80.11
 61 
 62 //檢查kubelet服務啟動
 63 ps aux | grep kubelet
 64 
 65 //此時還沒有生成證書
 66 ls /opt/kubernetes/ssl/
 67 
 68 
 69 ##### 在 master01 節點上操作 #####
 70 //檢查到 node01 節點的 kubelet 發起的 CSR 請求,Pending 表示等待叢集給該節點簽發證書
 71 kubectl get csr
 72 NAME                                                   AGE     REQUESTOR           CONDITION
 73 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA  2m      kubelet-bootstrap   Pending
 74 
 75 //通過 CSR 請求
 76 kubectl certificate approve node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 77 
 78 //再次檢視 CSR 請求狀態,Approved,Issued 表示已授權 CSR 請求並簽發證書
 79 kubectl get csr
 80 NAME                                                   AGE     REQUESTOR           CONDITION
 81 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA   4m      kubelet-bootstrap   Approved,Issued
 82 
 83 //檢視群集節點狀態,成功加入node01節點
 84 kubectl get nodes
 85 NAME            STATUS   ROLES    AGE    VERSION
 86 192.168.80.11   Ready    
 87 
 88 
 89 ##### 在 node01 節點上操作 #####
 90 //自動生成了證書和 kubelet.kubeconfig 檔案
 91 ls /opt/kubernetes/cfg/kubelet.kubeconfig
 92 ls /opt/kubernetes/ssl/
 93 
 94 //載入 ip_vs 模組
 95 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
 96 
 97 //使用proxy.sh指令碼啟動proxy服務
 98 cd /opt/
 99 chmod +x proxy.sh
100 ./proxy.sh 192.168.80.11
101 
102 systemctl status kube-proxy.service
103 
104 ---------- node02 節點部署 ----------
105 ##方法一:
106 //在 node01 節點上將 kubelet.sh、proxy.sh 檔案拷貝到 node02 節點
107 cd /opt/
108 scp kubelet.sh proxy.sh [email protected]:/opt/
109 
110 ##### 在 node02 節點上操作 #####
111 //使用kubelet.sh指令碼啟動kubelet服務
112 cd /opt/
113 chmod +x kubelet.sh
114 ./kubelet.sh 192.168.208.30
115 
116 ##### 在 master01 節點上操作 #####
117 //在 master01 節點上操作檢視 CSR 請求
118 kubectl get csr
119 NAME                                                   AGE   REQUESTOR           CONDITION
120 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y   15s   kubelet-bootstrap   Pending
121 
122 //通過 CSR 請求
123 kubectl certificate approve node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y124 
125 kubectl get csr
126 NAME                                                   AGE   REQUESTOR           CONDITION
127 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y   2m   kubelet-bootstrap    Approved,Issued
128 
129 //檢視群集中的節點狀態
130 kubectl get nodes
131 NAME            STATUS   ROLES    AGE    VERSION
132 192.168.80.11   Ready    
133 192.168.80.12   Ready    
134 
135 //載入 ipvs 模組
136 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
137 
138 //使用proxy.sh指令碼啟動proxy服務
139 cd /opt/
140 chmod +x proxy.sh
141 ./proxy.sh 192.168.80.12
142 
143 systemctl status kube-proxy.service
144 
145 ##方法二:
146 //在node01節點操作,把現成的/opt/kubernetes目錄和kubelet、kube-proxy的service服務管理檔案複製到其他node節點
147 scp -r /opt/kubernetes/ [email protected]:/opt/
148 scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service [email protected]:/usr/lib/systemd/system/
149 
150 //在node02節點上操作,進行修改
151 //首先刪除複製過來的證書,等會node02會自行申請證書
152 cd /opt/kubernetes/ssl/
153 rm -rf *
154 
155 //修改配置檔案kubelet、kubelet.config、kube-proxy的相關IP地址配置為當前節點的IP地址
156 cd /opt/kubernetes/cfg
157 vim kubelet
158 KUBELET_OPTS="--logtostderr=true \
159 --v=4 \
160 --hostname-override=192.168.80.12 \     #修改
161 ......
162 
163 vim kubelet.config
164 kind: KubeletConfiguration
165 apiVersion: kubelet.config.k8s.io/v1beta1
166 address: 192.168.80.12                    #修改
167 
168 vim kube-proxy
169 KUBE_PROXY_OPTS="--logtostderr=true \
170 --v=4 \ 
171 --hostname-override=192.168.80.12 \        #修改
172 
173 //載入 ipvs 模組
174 modprobe ip_vs
175 
176 //啟動kubelet和kube-proxy服務並設定開機自啟
177 systemctl start kubelet.service
178 systemctl enable kubelet.service
179 systemctl start kube-proxy.service
180 systemctl enable kube-proxy.service
181 
182 //到master01節點上發現未授權的node02請求,授權node02加入叢集
183 kubectl get csr
184 NAME                                                   AGE   REQUESTOR           CONDITION
185 node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks   15s   kubelet-bootstrap   Pending
186 
187 //授權許可加入群集
188 kubectl certificate approve node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks
189 
190 kubectl get csr
191 
192 kubectl get nodes

部署node2節點

#把node1節點的/opt/kubernetes 目錄複製到node2節點中(node1上操作)
scp -r /opt/kubernetes/ [email protected]:/opt

#拷貝啟動指令碼 (node1上操作)
scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service [email protected]:/usr/lib/systemd/system/

#刪除所有證書檔案
cd /opt/kubernetes/ssl/
rm -rf *

#修改kubelet配置檔案IP地址
cd ../cfg
vim kubelet
KUBELET_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.184.142 \    #修改為node2節點本地地址
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"

#修改kubelet.conf配置檔案
vim kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.184.142                #修改為本地地址
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2                        #DNS解析地址,需要記下來
clusterDomain: cluster.local.
failSwapOn: false
authentication:
  anonymous:
    enabled: true

#修改kube-proxy 配置檔案
vim kube-proxy
KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.184.142 \        #修改為本地地址
--cluster-cidr=10.0.0.0/24 \
--proxy-mode=ipvs \
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"

#啟動服務
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy

#master節點授權(master上操作)
kubectl get csr
kubectl certificate approve 節點2的名稱
kubectl get csr

#master檢視叢集狀態(master上操作)
kubectl get node

  

自古英雄多磨難