Kubernetes CKA課程筆記 41

建立User憑證,使一般User得以請求API Server — 建立User憑證

ZONGRU Li
7 min readNov 7, 2021

前面39篇提過Kubernetes雖不管理UserGroups

但是可以依賴外部來源來定義UserGroups

其中一個是憑證(Certificates)機制

甚至Kubernetes自己也可以是CA(Certificate Authority)簽署

所以本篇大綱如下,將會製作出Client端憑證User — hog使用

1.透過openssl工具製作出Client憑證私key(屬於hog憑證私key),並以此key建憑證請求檔(csr)

2.將上述憑證請求檔(csr),裡面其實挾帶著未簽署的公鑰,並以此建立出K8s元件CertificateSigningRequest

3.以Admin身分批准(Approve)該CertificateSigningRequest

4.完成上述第三步同時將得到簽署後的公鑰憑證檔(crt),User — hog將可透過指定的ca.crt(描述K8s為簽署者),第一步的憑證私鑰,最後簽署得到的公鑰憑證檔(crt),有這三樣hog即可與K8s Cluster溝通了

1.透過openssl工具製作出Client憑證私key(屬於hog憑證私key),並以此key建憑證請求檔(csr)

首先因為需要使用到openssl工具,所以先確認master機台上有這個工具

可以執行版本確認指令查看是否存在:

openssl verssion

看起來是AWS機台有裝這個工具,接著要用工具建Client憑證private key執行:

openssl genrsa -out {名稱}.key {size,通常是用2048}

這邊私鑰名稱給:dev-hog

dev-hog.key(憑證私鑰)內容如下:

接著有了Client憑證私鑰,再來要用這個私鑰建立憑證請求檔(csr),執行:

openssl req -new -key {私鑰} -subj “{給予主題名,通常格式為/CN={名稱}}” -out {名稱}.csr

(其中subj CN名稱是K8s辨識使用的名稱,這邊就用Client的名稱)

dev-hog.csr(憑證請求檔)內容如下:

至此就完成第一步了

2.將上述憑證請求檔(csr),裡面其實挾帶著未簽署的公鑰,並以此建立出K8s元件CertificateSigningRequest

接著要製作K8s元件 — CertificateSigningRequest 找到K8s官網:

link

直接在master機上面建立該Configuration File檔:

進去後貼上官網範例:

然後改改名稱:

接著還要回填request內容,其內容需要有base64加密,官網也有告知方式:

所以開另一個putty去拿,執行:

cat {憑證請求檔}|base64|tr -d "\n"

接著再改改裡面的有效期限:

多兩個0

儲存!

接著用常常使用的指令來實際建立K8s元件:

理由是我們參考的官方文件是1.22版的K8s,但是我們的K8s Cluster是1.21版:

link

這個屬性是1.22才實裝的,所以我們還不能用!所以:

接著再次建立元件:

成功!

並透過指令確認其狀態,執行:

kubectl get csr

如上圖,dev-hog的K8s"憑證簽署請求(CertificateSigningRequest)"元件

狀態是Pending,i.e.等待被簽署!

建立”憑證簽署請求(CertificateSigningRequest)”元件請求者是

kubernetes-admin(也是前面執行kubectl apply -f指令建立的身分)

至於為什麼會帶"kubernetes-admin"身分,在最早執行kubectl指令有談到

在位於目錄:~/.kube內有一個config是建立給admin使用

裡面描述了"執行者"是誰,並要跟"哪一個cluster"溝通的相關設定

用以指令查看大略的該檔案內容,執行(後面A2表示顯示兩行):

cat ~/.kube/config |grep kubernetes-admin -A2

並且其實”kubernetes-admin”身分

也可以簽署並Approve這個憑證簽署請求(CertificateSigningRequest)

3.以Admin身分批准(Approve)該CertificateSigningRequest

所以接著要繼續用”kubernetes-admin”身分來Approve

用指令查看該怎麼執行:

kubectl certificate --help

所以實際要approve的指令如下:

kubectl certificate approve {CertificateSigingRequest名稱}

此時這個CertificateSigingRequest元件就被kubernetes-admin簽署成功了!

4.完成上述第三步同時將得到簽署後的公鑰憑證檔(crt),User — hog將可透過指定的ca.crt(描述K8s為簽署者),第一步的憑證私鑰,最後簽署得到的公鑰憑證檔(crt),有這三樣hog即可與K8s Cluster溝通了

所以現在要將簽署後的公鑰憑證檔(crt)拿給hog

其內容就在CertificateSigningRequest元件內,所以執行指令查看:

kubectl get csr {名稱} -o yaml

很長!

將上述由K8s status產出的"已簽署"的憑證內容作base64解密,執行:

echo '{上面那一大段貼過來}' |base64 --decode

看起來解出來沒問題,所以在將上述指令加上導入文字檔dev-hog.crt內:

echo '{上面那一大段貼過來}' |base64 --decode > dev-hog.crt

至此即完成!!

現在我有:

  1. hog的Client端憑證私鑰:dev-hog.key
  2. hog的Clinet端憑證請求檔:dev-hog.csr
  3. hog的Client端憑證(簽署後)公鑰檔:dev-hog.crt

有了以上三個檔案就可以跟簽署的K8s Cluster溝通了!!!

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet