日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[kubernetes] 证书详细总结

發布時間:2023/12/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [kubernetes] 证书详细总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

一 證書簡介

二 證書類型分類

三? 證書說明

四 TLS?bootstrapping?簡化kubelet證書制作

五 證書制作步驟

1? 創建CA證書

2 創建K8S證書

2.1. 創建kubernetes證書

2.2 創建kube-controller-manager證書

2.3 創建kube-scheduler證書?

3 創建ADMIN證書

4 創建ETCD證書

6 查看證書信息:?


?

一 證書簡介

服務端保留公鑰和私鑰,客戶端使用root CA認證服務端的公鑰

一共有多少證書:

Etcd:

1、Etcd對外提供服務,要有一套etcd?server證書

2、Etcd各節點之間進行通信,要有一套etcd?peer證書

3、Kube-APIserver訪問Etcd,要有一套etcd?client證書

kubernetes

4、Kube-apiserver對外提供服務,要有一套kube-apiserver?server證書

5、kube-scheduler、kube-controller-manager、kube-proxy、kubelet和其他可能用到的組件,需要訪問kube-APIserver,要有一套kube-apiserver?client證書

6、kube-controller-manager要生成服務的service?account,要有一對用來簽署service?account的證書(CA證書)

7、kubelet對外提供服務,要有一套kubelet?server證書

8、kube-apiserver需要訪問kubelet,要有一套kubelet?client證書

?

加起來共8套,但是這里的“套”的含義我們需要理解。

同一個套內的證書必須是用同一個CA簽署的,簽署不同套里的證書的CA可以相同,也可以不同。例如,所有etcd server證書需要是同一個CA簽署的,所有的etcd peer證書也需要是同一個CA簽署的,而一個etcd server證書和一個etcd peer證書,完全可以是兩個CA機構簽署的,彼此沒有任何關系。這算兩套證書。

為什么同一個“套”內的證書必須是同一個CA簽署的

原因在驗證這些證書的一端。因為在要驗證這些證書的一端,通常只能指定一個Root CA。這樣一來,被驗證的證書自然都需要是被這同一個Root CA對應的私鑰簽署,不然不能通過認證。

實際上,使用一套證書(都使用一套CA來簽署)一樣可以搭建出K8S,一樣可以上生產,但是理清這些證書的關系,在遇到因為證書錯誤,請求被拒絕的現象的時候,不至于無從下手,而且如果沒有搞清證書之間的關系,在維護或者解決問題的時候,貿然更換了證書,弄不好會把整個系統搞癱。

kubelet證書為何不同

這樣做是一個為了審計,另一個為了安全。 每個kubelet既是服務端(kube-apiserver需要訪問kubelet),也是客戶端(kubelet需要訪問kube-apiserver),所以要有服務端和客戶端兩組證書。

服務端證書需要與服務器地址綁定,每個kubelet的地址都不相同,即使綁定域名也是綁定不同的域名,故服務端地址不同

客戶端證書也不應相同,每個kubelet的認證證書與所在機器的IP綁定后,可以防止一個kubelet的認證證書泄露以后,使從另外的機器上偽造的請求通過驗證。

安全方面,如果每個node上保留了用于簽署證書的bootstrap token,那么bootstrap token泄漏以后,是不是可以隨意簽署證書了?安全隱患非常大。所以,kubelet啟動成功以后,本地的bootstrap token需要被刪除。

?

二 證書類型分類

kubernetes的證書類型主要分為3類:

  • serving CA: 用于簽署serving證書,該證書用于加密https通信。用于簽署kubernetes API serving證書的CA也可以用于簽署API server插件的serving證書,可能會用到不同的CA
  • client CA: 用于簽署客戶端證書,同時也被API server插件用來對客戶端發來的證書進行認證。用于簽署kubernetes API serving證書的client CA也可以用于簽署API server插件的serving證書,可能會用到不同的CA
  • RequestHeader client CA: 該CA用于簽署API server代理客戶端證書,擁有代理證書的客戶端可以有效地偽裝成任何身份。當運行在aggregator之后時,該CA必須與前述aggregator代理客戶端證書的CA一致

三? 證書說明

serving 證書:
--tls-cert-file和--tls-private-key-file,API server用這兩個選項來認證連接到自己的TLS。這兩個證書也是CA(可以是自簽CA)簽署的。由于客戶端節點可能會拒絕自簽CA,因此需要將該CA分發給客戶端節點,并在客戶端指定該CA。如下kubelet的kubeconfig中的certificate-authority就指定了用于認證tls證書的CA。--tls-cert-file中需要有server字段的名稱。API server和kubelet(當需要認證到kubelet的請求時)都有這兩個選項,工作原理一樣。

current-context: my-context
apiVersion: v1
clusters:
- cluster:
certificate-authority: /path/to/my/ca.crt # CERTIFICATE AUTHORITY THAT ISSUED YOUR TLS CERT
server: https://horse.org:4443 # this name needs to be on the certificate in --tls-cert-file
name: my-cluster
kind: Config
users:
- name: green-user
user:
client-certificate: path/to/my/client/cert
client-key: path/to/my/client/key

?

client 證書

--client-ca-file:任何帶有 client-ca-file 簽名的客戶端證書的請求,都將通過客戶端證書中 Common Name 對應的標識進行身份認證,證書中的 Common Name 會作為用戶名,Organization作為組來使用。默認情況下,API Server使用該選項會自動創建一個名為extension-apiserver-authentication,位于kube-system命名空間的ConfigMap ,該ConfigMap 中包含了--client-ca-file指定的CA。
API server的--kubelet-certificate-authority、--kubelet-client-certificate、--kubelet-client-key 和kubelet的--client-ca-file為一組選項,用于對kubelet進行認證(kubelet 組件在工作時,采用主動的查詢機制,即定期請求 apiserver 獲取自己所應當處理的任務)



RequestHeader client CA 證書
主要涉及3個選項--requestheader-client-ca-file、--proxy-client-cert-file、--proxy-client-key-file。代理(如aggregator)使用--proxy-client-cert-file、--proxy-client-key-file來請求API Server,API Server使用--requestheader-client-ca-file指定的證書來認證代理的證書。這三個選項都設置在API server的flag中,即aggregator一方面作為API server認證來自client的證書,一方面作為client,使用自身的代理證書向API server請求認證。
當kubernetes對應的客戶端證書中的usernames和group與自己需求不符合時(無法認證或權限不足等),可以使用認證代理(代理使用另一套證書請求API server)

可以看到serving證書是通過TLS來進行認證,client證書通過用戶名(Common Name)和組(Organization)進行認證;RequestHeader client證書認證方式與client證書認證方式類似

?

證書的驗證:

顯示插件API server支持的證書:openssl s_client -connect <service-cluster-ip>:443更多

驗證證書是否由CA簽署:openssl verify -CAfile?ca.crt???the-certificate.crt

更多參見Certificate Issues

?

TLS?bootstrapping?簡化kubelet證書制作

Kubernetes1.4版本引入了一組簽署證書用的API。這組API的引入,使我們可以不用提前準備kubelet用到的證書。

官網地址:https://kubernetes.io/docs/tasks/tls/certificate-rotation/

每個kubelet用到的證書都是獨一無二的,因為它要綁定各自的IP地址,于是需要給每個kubelet單獨制作證書,如果業務量很大的情況下,node節點會很多,這樣一來kubelet的數量也隨之增加,而且還會經常變動(增減Node)kubelet的證書制作就成為一件很麻煩的事情。使用TLS bootstrapping就可以省事兒很多。

工作原理:Kubelet第一次啟動的時候,先用同一個bootstrap token作為憑證。這個token已經被提前設置為隸屬于用戶組system:bootstrappers,并且這個用戶組的權限也被限定為只能用來申請證書。 用這個bootstrap token通過認證后,kubelet申請到屬于自己的兩套證書(kubelet server、kube-apiserver client for kubelet),申請成功后,再用屬于自己的證書做認證,從而擁有了kubelet應有的權限。這樣一來,就去掉了手動為每個kubelet準備證書的過程,并且kubelet的證書還可以自動輪替更新

參考文檔:

Kubernetes TLS bootstrapping 那點事

?

證書制作步驟

1? 創建CA證書

創建證書配置文件 mkdir ca; cd ca;

vim ca-config.json

{"signing": {"default": {"expiry": "87600h"},"profiles": {"etcd": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]},"kubernetes": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}} }

字段說明:

ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數;后續在簽名證書時使用某個 profile;

signing:表示該證書可以簽名其他證書;生成的ca.pem證書中 CA=TRUE;

server auth:表示client可以用該 CA 對server提供的證書進行驗證;

client auth:表示server可以用該CA對client提供的證書進行驗證;

expiry:過期時間

創建CA證書簽名請求文件

vim ca-csr.json

{"CN": "kubernetes","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}],"ca": {"expiry": "87600h"} }

?

字段說明:

“CN”:Common Name,kube-apiserver 從證書中提取作為請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法;

“O”:Organization,kube-apiserver 從證書中提取該字段作為請求用戶所屬的組 (Group)

生成CA證書和私鑰

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

ls -al | grep ca

-rw-r--r-- 1 root root 487 Jun 26 11:20 ca-config.json -rw-r--r-- 1 root root 1001 Jun 26 11:20 ca.csr -rw-r--r-- 1 root root 264 Jun 26 11:20 ca-csr.json -rw------- 1 root root 1675 Jun 26 11:20 ca-key.pem -rw-r--r-- 1 root root 1359 Jun 26 11:20 ca.pem

其中ca-key.pem是ca的私鑰,ca.csr是一個簽署請求,ca.pem是CA證書,是后面kubernetes組件會用到的RootCA。

?

2 創建K8S證書

在創建這個證書之前,先規劃一下架構

k8s-master1? 10.211.55.11

etcd01? ? ? ? ? 10.211.55.11

2.1. 創建kubernetes證書

創建kubernetes證書簽名請求文件? mkdir kubernetes; cd kubernetes;

vim kubernetes-csr.json

{"CN": "kubernetes","hosts": ["127.0.0.1","10.254.0.1""10.211.55.11","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}] }

字段說明:

如果 hosts 字段不為空則需要指定授權使用該證書的 IP 或域名列表。

由于該證書后續被 kubernetes master 集群使用,將master節點的IP都填上(如有多個),同時還有service網絡的首IP。(一般是 kube-apiserver 指定的 service-cluster-ip-range 網段的第一個IP,如 10.254.0.1)

生成kubernetes證書和私鑰

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

ls |grep kubernetes

kubernetes.csr kubernetes-csr.json kubernetes-key.pem kubernetes.pem

2.2 創建kube-controller-manager證書

創建 kube-controller-manager 證書簽名請求文件??

vim kube-controller-manager-csr.json

{"CN": "system:kube-controller-manager","key": {"algo": "rsa","size": 2048},"hosts": ["127.0.0.1","10.211.55.11"],"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:kube-controller-manager","OU": "system"}] }

說明:

hosts 列表包含所有 kube-controller-manager 節點 IP;

CN 為 system:kube-controller-manager、O 為 system:kube-controller-manager,kubernetes 內置的 ClusterRoleBindings system:kube-controller-manager 賦予 kube-controller-manager 工作所需的權限

生成kube-controoller-manager證書和私鑰

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager?

ls |grep kube-controller-manager?

kube-controller-manager.csr kube-controller-manager-csr.json kube-controller-manager-key.pem kube-controller-manager.pem

2.3 創建kube-scheduler證書?

?創建 kube-scheduler 證書簽名請求文件

vim kube-scheduler-csr.json?

{"CN": "system:kube-scheduler","hosts": ["127.0.0.1","10.211.55.11"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:kube-scheduler","OU": "System"}] }

?

說明:

hosts 列表包含所有 kube-scheduler 節點 IP;

CN 為 system:kube-scheduler、O 為 system:kube-scheduler,kubernetes 內置的 ClusterRoleBindings system:kube-scheduler 將賦予 kube-scheduler 工作所需的權限。

?

經過上述操作,我們會用到如下文件

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-scheduler-csr.json| cfssljson -bare kube-scheduler

ls | grep kube-scheduler

kube-scheduler.csr kube-scheduler-csr.json kube-scheduler-key.pem kube-scheduler.pem

3 創建ADMIN證書

創建admin證書簽名請求文件? mkdir admin ; cd admin

?vim admin-csr.json

{"CN": "admin","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:masters","OU": "System"}] }

?

說明:

后續 kube-apiserver 使用 RBAC 對客戶端(如 kubelet、kube-proxy、Pod)請求進行授權;

kube-apiserver 預定義了一些 RBAC 使用的 RoleBindings,如 cluster-admin 將 Group system:masters 與 Role cluster-admin 綁定,該 Role 授予了調用kube-apiserver 的所有 API的權限;

O指定該證書的 Group 為 system:masters,kubelet 使用該證書訪問 kube-apiserver 時 ,由于證書被 CA 簽名,所以認證通過,同時由于證書用戶組為經過預授權的 system:masters,所以被授予訪問所有 API 的權限;

注:這個admin 證書,是將來生成管理員用的kube config 配置文件用的,現在我們一般建議使用RBAC 來對kubernetes 進行角色權限控制, kubernetes 將證書中的CN 字段 作為User, O 字段作為 Group

相關權限認證可以參考下面文章

https://mp.weixin.qq.com/s/XIkQdh5gnr-KJhuFHboNag

生成admin證書和私鑰

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

ls | grep admin

admin.csr admin-csr.json admin-key.pem admin.pem

4 創建ETCD證書

創建etcd證書簽名請求文件?

vim etcd-csr.json

{"CN": "etcd","hosts": ["127.0.0.1","10.211.55.11"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing" }] }

字段說明:

如果 hosts 字段不為空則需要指定授權使用該證書的 IP 或域名列表。該證書后續被 etcd 集群使用

生成kubernetes證書和私鑰

cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd

ls |grep etcd

etcd.csr etcd-csr.json etcd-key.pem etcd.pem

?

6 查看證書信息:?

cfssl-certinfo -cert kubernetes.pem

在搭建k8s集群的時候,將這些文件分發到至此集群中其他節點機器中即可。至此,TLS證書創建完畢

admin: total 24 drwxr-xr-x 2 root root 4096 Sep 24 12:44 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 1009 Sep 24 12:15 admin.csr -rw-r--r-- 1 root root 229 Sep 24 12:14 admin-csr.json -rw------- 1 root root 1679 Sep 24 12:15 admin-key.pem -rw-r--r-- 1 root root 1399 Sep 24 12:15 admin.pemca: total 28 drwxr-xr-x 2 root root 4096 Sep 24 12:01 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 487 Sep 24 12:01 ca-config.json -rw-r--r-- 1 root root 1001 Sep 24 12:01 ca.csr -rw-r--r-- 1 root root 309 Sep 24 11:58 ca-csr.json -rw------- 1 root root 1679 Sep 24 12:01 ca-key.pem -rw-r--r-- 1 root root 1359 Sep 24 12:01 ca.pemetcd: total 24 drwxr-xr-x 2 root root 4096 Sep 24 12:24 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 1005 Sep 24 12:24 etcd.csr -rw-r--r-- 1 root root 272 Sep 24 12:23 etcd-csr.json -rw------- 1 root root 1675 Sep 24 12:24 etcd-key.pem -rw-r--r-- 1 root root 1375 Sep 24 12:24 etcd.pemkubernetes: total 56 drwxr-xr-x 2 root root 4096 Sep 24 12:44 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 1119 Sep 24 12:11 kube-controller-manager.csr -rw-r--r-- 1 root root 350 Sep 24 12:11 kube-controller-manager-csr.json -rw------- 1 root root 1675 Sep 24 12:11 kube-controller-manager-key.pem -rw-r--r-- 1 root root 1493 Sep 24 12:11 kube-controller-manager.pem -rw-r--r-- 1 root root 1245 Sep 24 12:02 kubernetes.csr -rw-r--r-- 1 root root 512 Sep 24 12:02 kubernetes-csr.json -rw------- 1 root root 1679 Sep 24 12:02 kubernetes-key.pem -rw-r--r-- 1 root root 1610 Sep 24 12:02 kubernetes.pem -rw-r--r-- 1 root root 1094 Sep 24 12:13 kube-scheduler.csr -rw-r--r-- 1 root root 331 Sep 24 12:12 kube-scheduler-csr.json -rw------- 1 root root 1675 Sep 24 12:13 kube-scheduler-key.pem -rw-r--r-- 1 root root 1468 Sep 24 12:13 kube-scheduler.pem

參考

Kubernetes 的證書認證

k8s學習筆記-證書詳解

總結

以上是生活随笔為你收集整理的[kubernetes] 证书详细总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。