精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文帶你徹底厘清 Kubernetes 中的證書工作機制

云計算
在 Kubernetes 中包含多個以獨立進程形式運行的組件,這些組件之間通過 HTTP/GRPC 相互通信,以協同完成集群中應用的部署和管理工作。

本文轉載自微信公眾號「 趙化冰」,轉載本文請聯系 趙化冰公眾號。

[[328701]]

目錄

  • Kubernetes 組件的認證方式
  • Kubernetes 中使用到的CA和證書
  • Kubernetes 中的證書配置
    • etcd 證書配置
    • kube-apiserver 證書配置
    • 采用 kubeconfig 訪問 kube-apiserver
    • Service Account 證書
    • Kubernetes 證書簽發
    • 使用 TLS bootstrapping 簡化 Kubelet 證書制作
  • 小結
  • 參考文檔

Kubernetes 組件的認證方式

首先讓我們來看一下 Kubernetes 中的組件:在 Kubernetes 中包含多個以獨立進程形式運行的組件,這些組件之間通過 HTTP/GRPC 相互通信,以協同完成集群中應用的部署和管理工作。

kubernetes 組件,圖片來源kubernetes.io

從圖中可以看到,Kubernetes 控制平面中包含了 etctd,kube-api-server,kube-scheduler,kube-controller-manager 等組件,這些組件會相互進行遠程調用,例如 kube-api-server 會調用 etcd 接口存儲數據,kube-controller-manager 會調用 kube-api-server 接口查詢集群中的對象狀態;同時,kube-api-server 也會和在工作節點上的 kubelet 和 kube-proxy 進行通信,以在工作節點上部署和管理應用。

以上這些組件之間的相互調用都是通過網絡進行的。在進行網絡通信時,通信雙方需要驗證對方的身份,以避免惡意第三方偽造身份竊取信息或者對系統進行攻擊。為了相互驗證對方的身份,通信雙方中的任何一方都需要做下面兩件事情:

  • 向對方提供標明自己身份的一個證書
  • 驗證對方提供的身份證書是否合法,是否偽造的?

在 Kubernetes 中使用了數字證書來提供身份證明,我們可以把數字證書簡單理解為我們在日常生活中使用的“身份證”,上面標注了證書擁有者的身份信息,例如名稱,所屬組織機構等。為了保證證書的權威性,會采用一個通信雙方都信任的 CA(證書機構,Certificate Authority)來頒發證書。這就類似于現實生活中頒發“身份證”的政府機構。數字證書中最重要的內容實際上是證書擁有者的公鑰,該公鑰代表了用戶的身份。本文假設讀者已經了解數字證書和 CA 的基本原理,如果你對此不太清楚,或者希望重新溫習一下相關知識,可以先閱讀一下這篇文章《數字證書原理》(https://zhaohuabing.com/post/2020-03-19-pki)。

CA (證書機構),圖片來源www.trustauth.cn

在 Kubernetes 的組件之間進行通信時,數字證書的驗證是在協議層面通過 TLS 完成的,除了需要在建立通信時提供相關的證書和密鑰外,在應用層面并不需要進行特殊處理。采用 TLS 進行驗證有兩種方式:

  • 服務器單向認證:只需要服務器端提供證書,客戶端通過服務器端證書驗證服務的身份,但服務器并不驗證客戶端的身份。這種情況一般適用于對 Internet 開放的服務,例如搜索引擎網站,任何客戶端都可以連接到服務器上進行訪問,但客戶端需要驗證服務器的身份,以避免連接到偽造的惡意服務器。
  • 雙向 TLS 認證:除了客戶端需要驗證服務器的證書,服務器也要通過客戶端證書驗證客戶端的身份。這種情況下服務器提供的是敏感信息,只允許特定身份的客戶端訪問。

在 Kubernetes 中,各個組件提供的接口中包含了集群的內部信息。如果這些接口被非法訪問,將影響集群的安全,因此組件之間的通信需要采用雙向 TLS 認證。即客戶端和服務器端都需要驗證對方的身份信息。在兩個組件進行雙向認證時,會涉及到下面這些證書相關的文件:

  • 服務器端證書:服務器用于證明自身身份的數字證書,里面主要包含了服務器端的公鑰以及服務器的身份信息。
  • 服務器端私鑰:服務器端證書中包含的公鑰所對應的私鑰。公鑰和私鑰是成對使用的,在進行 TLS 驗證時,服務器使用該私鑰來向客戶端證明自己是服務器端證書的擁有者。
  • 客戶端證書:客戶端用于證明自身身份的數字證書,里面主要包含了客戶端的公鑰以及客戶端的身份信息。
  • 客戶端私鑰:客戶端證書中包含的公鑰所對應的私鑰,同理,客戶端使用該私鑰來向服務器端證明自己是客戶端證書的擁有者。
  • 服務器端 CA 根證書:簽發服務器端證書的 CA 根證書,客戶端使用該 CA 根證書來驗證服務器端證書的合法性。
  • 客戶端端 CA 根證書:簽發客戶端證書的 CA 根證書,服務器端使用該 CA 根證書來驗證客戶端證書的合法性。

下面這張來自 《The magic of TLS, X509 and mutual authentication explained》 文章中的圖形象地解釋了雙向 TLS 認證的原理。如果你需要了解更多關于 TLS 認證的原理,可以閱讀一下 medium 上的原文(https://medium.com/sitewards/the-magic-of-tls-x509-and-mutual-authentication-explained-b2162dec4401)。

圖片來源The magic of TLS, X509 and mutual authentication explained

Kubernetes 中使用到的CA和證書

Kubernetes 中使用了大量的證書,本文不會試圖覆蓋到所有可能使用到的證書,但會討論到主要的證書。理解了這些證書的使用方法和原理后,也能很快理解其他可能遇到的證書文件。下圖標識出了在 kubernetes 中主要使用到的證書和其使用的位置:

Kubernetes 中使用到的主要證書

上圖中使用序號對證書進行了標注。圖中的箭頭表明了組件的調用方向,箭頭所指方向為服務提供方,另一頭為服務調用方。為了實現 TLS 雙向認證,服務提供方需要使用一個服務器證書,服務調用方則需要提供一個客戶端證書,并且雙方都需要使用一個 CA 證書來驗證對方提供的證書。為了簡明起見,上圖中只標注了證書使用方提供的證書,并沒有標注證書的驗證方驗證使用的 CA 證書。圖中標注的這些證書的作用分別如下:

  1. etcd 集群中各個節點之間相互通信使用的證書。由于一個 etctd 節點既為其他節點提供服務,又需要作為客戶端訪問其他節點,因此該證書同時用作服務器證書和客戶端證書。
  2. etcd 集群向外提供服務使用的證書。該證書是服務器證書。
  3. kube-apiserver 作為客戶端訪問 etcd 使用的證書。該證書是客戶端證書。
  4. kube-apiserver 對外提供服務使用的證書。該證書是服務器證書。
  5. kube-controller-manager 作為客戶端訪問 kube-apiserver 使用的證書,該證書是客戶端證書。
  6. kube-scheduler 作為客戶端訪問 kube-apiserver 使用的證書,該證書是客戶端證書。
  7. kube-proxy 作為客戶端訪問 kube-apiserver 使用的證書,該證書是客戶端證書。
  8. kubelet 作為客戶端訪問 kube-apiserver 使用的證書,該證書是客戶端證書。
  9. 管理員用戶通過 kubectl 訪問 kube-apiserver 使用的證書,該證書是客戶端證書。
  10. kubelet 對外提供服務使用的證書。該證書是服務器證書。
  11. kube-apiserver 作為客戶端訪問 kubelet 采用的證書。該證書是客戶端證書。
  12. kube-controller-manager 用于生成和驗證 service-account token 的證書。該證書并不會像其他證書一樣用于身份認證,而是將證書中的公鑰/私鑰對用于 service account token 的生成和驗證。kube-controller-manager 會用該證書的私鑰來生成 service account token,然后以 secret 的方式加載到 pod 中。pod 中的應用可以使用該 token 來訪問 kube-apiserver, kube-apiserver 會使用該證書中的公鑰來驗證請求中的 token。我們將在文中稍后部分詳細介紹該證書的使用方法。

通過這張圖,對證書機制比較了解的讀者可能已經看出,我們其實可以使用多個不同的 CA 來頒發這些證書。只要在通信的組件中正確配置用于驗證對方證書的 CA 根證書,就可以使用不同的 CA 來頒發不同用途的證書。但我們一般建議采用統一的 CA 來頒發 kubernetes 集群中的所有證書,這是因為采用一個集群根 CA 的方式比采用多個 CA 的方式更容易管理,可以避免多個CA 導致的復雜的證書配置、更新等問題,減少由于證書配置錯誤導致的集群故障。

Kubernetes 中的證書配置

前面我們介紹了 Kubernetes 集群中主要使用到的證書。下面我們分別看一下如何將這些證書及其對應的私鑰和 CA 根證書需要配置到 Kubernetes 中各個組件中,以供各個組件進行使用。這里假設使用一個集群根 CA 來頒發所有相關證書,因此涉及到 CA 的配置對應的證書文件名都是相同的。

etcd 證書配置

需要在 etcd 的啟動命令行中配置以下證書相關參數:

  • etcd 對外提供服務的服務器證書及私鑰。
  • etcd 節點之間相互進行認證的 peer 證書、私鑰以及驗證 peer 的 CA。
  • etcd 驗證訪問其服務的客戶端的 CA。
  1. /usr/local/bin/etcd \\ 
  2.   --cert-file=/etc/etcd/kube-etcd.pem \\                   # 對外提供服務的服務器證書 
  3.   --key-file=/etc/etcd/kube-etcd-key.pem \\                # 服務器證書對應的私鑰 
  4.   --peer-cert-file=/etc/etcd/kube-etcd-peer.pem \\         # peer 證書,用于 etcd 節點之間的相互訪問 
  5.   --peer-key-file=/etc/etcd/kube-etcd-peer-key.pem \\      # peer 證書對應的私鑰 
  6.   --trusted-ca-file=/etc/etcd/cluster-root-ca.pem \\       # 用于驗證訪問 etcd 服務器的客戶端證書的 CA 根證書 
  7.   --peer-trusted-ca-file=/etc/etcd/cluster-root-ca.pem\\   # 用于驗證 peer 證書的 CA 根證書 
  8.   ... 

kube-apiserver 證書配置

需要在 kube-apiserver 中配置以下證書相關參數:

  • kube-apiserver 對外提供服務的服務器證書及私鑰。
  • kube-apiserver 訪問 etcd 所需的客戶端證書及私鑰。
  • kube-apiserver 訪問 kubelet 所需的客戶端證書及私鑰。
  • 驗證訪問其服務的客戶端的 CA。
  • 驗證 etcd 服務器證書的 CA 根證書。
  • 驗證 service account token 的公鑰。
  1. /usr/local/bin/kube-apiserver \\  
  2.   --tls-cert-file=/var/lib/kubernetes/kube-apiserver.pem \\                             # 用于對外提供服務的服務器證書 
  3.   --tls-private-key-file=/var/lib/kubernetes/kube-apiserver-key.pem \\                  # 服務器證書對應的私鑰 
  4.   --etcd-certfile=/var/lib/kubernetes/kube-apiserver-etcd-client.pem \\                 # 用于訪問 etcd 的客戶端證書 
  5.   --etcd-keyfile=/var/lib/kubernetes/kube-apiserver-etcd-client-key.pem \\              # 用于訪問 etcd 的客戶端證書的私鑰 
  6.   --kubelet-client-certificate=/var/lib/kubernetes/kube-apiserver-kubelet-client.pem \\ # 用于訪問 kubelet 的客戶端證書 
  7.   --kubelet-client-key=/var/lib/kubernetes/kube-apiserver-kubelet-client-key.pem \\     # 用于訪問 kubelet 的客戶端證書的私鑰 
  8.   --client-ca-file=/var/lib/kubernetes/cluster-root-ca.pem \\                           # 用于驗證訪問 kube-apiserver 的客戶端的證書的 CA 根證書 
  9.   --etcd-cafile=/var/lib/kubernetes/cluster-root-ca.pem \\                              # 用于驗證 etcd 服務器證書的 CA 根證書   
  10.   --kubelet-certificate-authority=/var/lib/kubernetes/cluster-root-ca.pem \\            # 用于驗證 kubelet 服務器證書的 CA 根證書 
  11.   --service-account-key-file=/var/lib/kubernetes/service-account.pem \\                 # 用于驗證 service account token 的公鑰 
  12.   ... 

采用 kubeconfig 訪問 kube-apiserver

Kubernetes 中的各個組件,包括kube-controller-mananger、kube-scheduler、kube-proxy、kubelet等,采用一個kubeconfig 文件中配置的信息來訪問 kube-apiserver。該文件中包含了 kube-apiserver 的地址,驗證 kube-apiserver 服務器證書的 CA 證書,自己的客戶端證書和私鑰等訪問信息。

在一個使用 minikube 安裝的集群中,生成的 kubeconfig 配置文件如下所示,這四個文件分別為 admin 用戶, kube-controller-mananger、kubelet 和 kube-scheduler 的kubeconfig配置文件。

  1. $ ls /etc/kubernetes/ 
  2. admin.conf  controller-manager.conf  kubelet.conf  scheduler.conf 

我們打開 controller-manager.conf 來看一下。

  1. apiVersion: v1 
  2. clusters: 
  3. - cluster: 
  4.     # 用于驗證 kube-apiserver 服務器證書的 CA 根證書 
  5.  
  6.     certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJd01ETXdOekF3TXpjeE1Wb1hEVE13TURNd05qQXdNemN4TVZvd0ZURVRNQkVHQTFVRQpBeE1LYldsdWFXdDFZbVZEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTczCkdIMWxqNkxEUm1FLy9hQ2cvNUlmampKYy8zOGcyMVpITXJDMkx5RGVqZWhrdWUwZFB1WTJ0L2JjTjJYM1dGNEsKaWNzNmhhWnBDbFVxL3pteVRITWhhZnlmVVF5MDFJZmhDV2I5NXI4akpHZ2NyU3U3UUtXM3ZOd1Z1TmhJNmd6SApSWW45Ry82VHJKTjdOMWRjejNmMlU1OFRjUHVCQzZOUzVTc1JmemFSczVDZnd0UTNaa2czQUFVYTlQSDZFVmtDCkIvRGR1bXBialZGakMwSllOWlFVNTlGNUxDeHJ0bEYvOUJsSVhnZGw0ZlNCNzQ0ZW1UelcySEZQek9lTklYYnUKYTJPa0FFTDdJc3hSRTFBaEFKZ1h6cFNmdi9paDBuMEJpQ1VaV1hLZjg2UjZJL2xlK2docG51c21kTXUwbkNEUApHMm9laXhRTit5NzFQU2tGcGdzQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUIwR0ExVWRKUVFXCk1CUUdDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCaWpXYlpPNU9uaU9lNHRHUlQvRGFXaFBkY2ZwbE8vcVQ5WkFqU1hXZU41TStubExQZQpGV1NLRGRWU1NzajJ6UVdMU3A1Vjc3MkFoa2NYQlM0a2ZiY2ZCTUl2ejVsYXJZeHgxcnduTzZLbVZSTHdkNUNkCnRER2RjUjF0UzdqeTRSV05ISlAyNWZhZHB5TE9KVzJlZkdLRmRiSnZyRjljekV1ODR5a1drdThtVnNNa0RzTXkKbnVFNGtXblNvODgweFpxVG9QN01qM3hkRlNYYWdoNytwK3FMazk1VjhBNTRUNmRKa2VjSGg4SzdNYVRxdWVOVgpzOVhuZDA2WEJGQWFCVXRsSGZybmRXUzhmaTQ5dTY0NEFWOWJHclNYRnR1Q0lydnIxVkY2d0R3dEJYZi9UUStrCkx3Zk1oNVZDVWt1bEJqWEpqK1ZvRnBLZm5Qck9nbEExZzRtUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== 
  7.     server: https://localhost:8443 
  8.   name: kubernetes 
  9. contexts: 
  10. - context: 
  11.     cluster: kubernetes 
  12.     user: system:kube-controller-manager 
  13.   name: system:kube-controller-manager@kubernetes 
  14. current-context: system:kube-controller-manager@kubernetes 
  15. kind: Config 
  16. preferences: {} 
  17. users: 
  18. name: system:kube-controller-manager 
  19.   user
  20.     # 用于訪問 kube-apiserver 的客戶端證書 
  21.  
  22.     client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lJZVE4aDNXSlNmZEF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2JXbHVhV3QxWW1WRFFUQWVGdzB5TURBek1EY3dNRE0zTVRGYUZ3MHlNVEExTVRrd05qVTNNemxhTUNreApKekFsQmdOVkJBTVRIbk41YzNSbGJUcHJkV0psTFdOdmJuUnliMnhzWlhJdGJXRnVZV2RsY2pDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5DTzJpTEZzNGRTTW9sR2plN2tjY1VFbURDVjEvbWQKV1p1cS9DT0RvV1p2Uy80clNrOXNsaFQvektIVTVkVmg3SFV4TGNWU1RkQXZScGEwN3dXK3h2eWlDR3Y5UmMyVAp0bkFnUFFhQ2VkOC8zZlFpMzI1QmZCZVl4UjRTTm8raEM1b0ZYYkhpdC9OWWlQTVMvM1hFOGVCc0dEZCtjd1pzCnhNTDZzc0pJNzVOSmNXckV3eXlMbzIrb1JSRmJ2TlpJWFRZekJpRGd3QkZxNUkzZVA5QTl2d29rUG5STFBSdlYKQU9SV3hUZDMyblJLOTY1SU9uV25mNzY0bHhSeEV6bHIyS09rSzc5NlVJWTlyL0lYOWdGQjNqbGZFK1lBOE5VLwpuV2x3cElNL0ZpMk9hL1hjNnQzNUJHSnNXcTR4bHQ5RDdqS3V2bTNONmJlanJPOFZNODU5QU44Q0F3RUFBYU1uCk1DVXdEZ1lEVlIwUEFRSC9CQVFEQWdXZ01CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUNNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCZVg4QmVuTlJoUTVWaVpMMjRxcWxIMjRlMDVyYWVVTFZJQlQzWE90cmdQcXF1WXRGWgptRG9naEpuSW05aVVMcHFTTUxHMlJrQ0RBMEk2Rit0SGVFVHRMRDlNdjA2N1huQ2VCclhkTFVTYzkwaHNZWm1KClNsVG11c21TZGUxUXJsRnFxQVRZY2VCVWgwM0lSbXZIL1BtS21va1FUZDZER0paVVVhM3ducEN6Nko4aGcySGwKWlZFaURKcHNoeXNBaVdCUWZBN01TRlFlb0poSjhUdHgzdEhNZDlaaHlmcVVHOVByUGJkMUlBQTIrRlVudXRsNwpoRmdZdTBxbG5aZFZCWE9JM1dvZndWZ2dDTEQrbFVCeGgzNVhLNStxYXhWNVlDTit0ZTNFeDJERHVmRW1UV0FoCkwwUVNTc0RTZGd0Vi9TNFhvV2xQcXU0Q2lRVnZydUg3WHkxMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== 
  23.     # 客戶端證書對應的私鑰 
  24.  
  25.     client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMEk3YUlzV3poMUl5aVVhTjd1Unh4UVNZTUpYWCtaMVptNnI4STRPaFptOUwvaXRLClQyeVdGUC9Nb2RUbDFXSHNkVEV0eFZKTjBDOUdsclR2QmI3Ry9LSUlhLzFGelpPMmNDQTlCb0o1M3ovZDlDTGYKYmtGOEY1akZIaEkyajZFTG1nVmRzZUszODFpSTh4TC9kY1R4NEd3WU4zNXpCbXpFd3ZxeXdranZrMGx4YXNURApMSXVqYjZoRkVWdTgxa2hkTmpNR0lPREFFV3JramQ0LzBEMi9DaVErZEVzOUc5VUE1RmJGTjNmYWRFcjNya2c2CmRhZC92cmlYRkhFVE9XdllvNlFydjNwUWhqMnY4aGYyQVVIZU9WOFQ1Z0R3MVQrZGFYQ2tnejhXTFk1cjlkenEKM2ZrRVlteGFyakdXMzBQdU1xNitiYzNwdDZPczd4VXp6bjBBM3dJREFRQUJBb0lCQVFDRDVMT2pKZkJoZGVRcgoySWpPT1g2Um9GUTI5YXgrV2JwZnJnU0MyUzNyUUJ1SkJBdWNxd2xIQW5hQktjaW41NlBJZ1c5MnlKUVpRcXliCmhwVmF4c25FM3h3QVgwNFRzb1MvNkVOdnFIZzJiWWVLYTd0dFdOQ0hnNysxUXNOcWxlaG1ZVnBkc3dtdVJhRm0KUis5eXBUaHFPeklkZGtSOEhiRlp0WDN6VEhqbVpYaUhGdlIvMFhYK1BVbDR6SllSWjlCbVBnY2Ric2tSTldScgo0Qk8wUmlQQWRKVEo2VHZLMGhxT1g1UHo4ekl3S1ZzYjdyYndUdXArTGs4eWNCVUd3Q1N3RzEyanVNQW1kYkJJClZmdmlFK1VYRHRIQXdLWXlnMEhCVitJVlEvcVNwSVJ1WXQ4SmY1MWVKN1VEbHhiN3ZRTStEYVNsNjVaMVNyWUcKQU9UTGpPVkJBb0dCQU5PYzB0OG5ybmhUR3V0MGhMdVp6SWs4ekFranhYYWtiSURlZi9XeXlQdW94Z3J2ZGMzcwpsbHV0U3hSOFV4WGVuQjBLZFpnYnNoc1ozeW9GbEI0YThTMzI1UFRsYm9xOVB0TDRaOFBzczQ3L0l1bHYxTk10CnZzZjdKZ1FuaFRCVndkdjN6OXFpdml6bjB4Mk9CdURxdzNSYXcvWEhwRy9RczJ5WmF4S29GNW9SQW9HQkFQeE8KQVBDUXQ2Q2swOFF2WTE4VjFLQXA0d2h1YWEyMS9MeC9rZUZJSURRd0tZZnFHRGdBWUYvQzJUbC9xc29TMXAvTwpFcFVkVkRBNHVpblFVbnFhNGg0a0JOYjRXTFhrSXhRdXdjWHdJNjRMNWR3ZWJHalhxUWUwbnkxQkhkTmU2Z0dqClorbit4OUJLWnJmcEliYkQ2blpYUUREbS9jZWYyWU5NVWRqVWpudnZBb0dBQnlIMUZhSi94ZngvSHNxWm9yMG4KWU1UVTE4WUY1TjdiN1dnU2hoU1ZvNjNucHZ5MVN0Q2JyTkZsZzNaQlVxNWpNck5ralZENXF1SXZYSG85cU5vZApvUC8rYmFiQ0dCa1M0Z2VQYjlJdHB6ZEFWUC80KzNsQ1FmbGNLYTJ2VnBhOVp3MnVTdDlMYTdZUXJxRlg2QUxoCnZhMUZoNlpJQzZETU8yL2NaUStYWkJFQ2dZQnNGMHNGeFNvMlU0YzZISWM1SEZRc2plVnJIa3ArRm1LQnF6R24KVDB3a3I2R0xUZm8wTzgwT0daOFFxQ1pXVGozTzF1MVZIdXlMZ0RJWmFkdDhGVkRjVXRnVDlPK2tkV21sNHVZMwpVOHNsYklsOGhUZ3lybm9IQ0JYTndJRHpwazBnaUk0alRIajBQbnZGUE1hcDAwTm1rYmk1ZXF5czBrblFtMmpSCk9UY1Yxd0tCZ0RNUWZSVlNNNXlGcjVIalJ4UXcwRDdrUWhONDlLbngrMWs2bWRORWJ6VG9rQ1RRcWlSeUJQdGgKcjlqZk0rRXFZcnZ1elRmRVpiS1VBMEZac09yeStxMHpXb29mTURLajFGV3BaTXJBSmdxdDFlcWtFbVFrVi8vSApQMzF3ejZDa1RneDdJby9iZ09PbmhsbUplU3NHaXpqenV2TjFEcWtjNVR3M3oxUSs1dmxmCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== 

可以看到,訪問 kube-apiserver 所需要的相關證書內容已經被采用 base64 編碼寫入了文件中。其他幾個文件中的內容也是類似的,只是配置的用戶名和客戶端證書有所不同。

在啟動這些組件時,需要在參數中指出 kubeconfig 文件的路徑,例如 kube-controller-manager 的啟動命令如下。

  1. /usr/local/bin/kube-controller-manager \\ 
  2. --kubeconfig=/etc/kubernetes/controller-manager.conf 
  3. # 下面幾個證書和訪問 kube-apiserver 無關,我們會在后面介紹到 
  4. --cluster-signing-cert-file=/var/lib/kubernetes/cluster-root-ca.pem             # 用于簽發證書的 CA 根證書 
  5. --cluster-signing-key-file=/var/lib/kubernetes/cluster-root-ca-key.pem          # 用于簽發證書的 CA 根證書的私鑰   
  6. --service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem  # 用于對 service account token 進行簽名的私鑰 
  7. ... 

Service Account 證書

Kubernetes 中有兩類用戶,一類為 user account,一類為 service account。service account 主要被 pod 用于訪問 kube-apiserver。在為一個 pod 指定了 service account 后,kubernetes 會為該 service account 生成一個 JWT token,并使用 secret 將該 service account token 加載到 pod 上。pod 中的應用可以使用 service account token 來訪問 api server。service account 證書被用于生成和驗證 service account token。該證書的用法和前面介紹的其他證書不同,因為實際上使用的是其公鑰和私鑰,而并不需要對證書進行驗證。

我們可以看到 service account 證書的公鑰和私鑰分別被配置到了 kube-apiserver 和 kube-controller-manager 的命令行參數中,如下所示:

  1. /usr/local/bin/kube-apiserver \\  
  2.   --service-account-key-file=/var/lib/kubernetes/service-account.pem \\          # 用于驗證 service account token 的公鑰 
  3.   ... 
  4.    
  5.  /usr/local/bin/kube-controller-manager \\ 
  6.  --service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem  # 用于對 service account token 進行簽名的私鑰 
  7.  ... 

下圖展示了 kubernetes 中生成、使用和驗證 service account token 的過程。

認證方法:客戶端證書還是 token ?

從前面的介紹中我們可以看到,Kubernetes 提供了兩種客戶端認證的方法,控制面組件采用的是客戶端數字證書;而在集群中部署的應用則采用了 service account token 的方式。為什么 Kubernetes 不為 service account 也生成一個證書,并采用該證書進行身份認證呢?實際上 Istio 就是這樣做的,Istio 會自動為每個 service account 生成一個證書,并使用該證書來在 pod 中的應用之間建立雙向 tls 認證。我沒有找到 Kubernetes 這個設計決策的相關說明,如果你知道原因,歡迎和我聯系探討。

Kubernetes 證書簽發

Kubernetes 提供了一個 certificates.k8s.io API,可以使用配置的 CA 根證書來簽發用戶證書。該 API 由 kube-controller-manager 實現,其簽發證書使用的根證書在下面的命令行中進行配置。我們希望 Kubernetes 采用集群根 CA 來簽發用戶證書,因此在 kube-controller-manager 的命令行參數中將相關參數配置為了集群根 CA。

  1. /usr/local/bin/kube-controller-manager \\ 
  2. --cluster-signing-cert-file=/var/lib/kubernetes/cluster-root-ca.pem             # 用于簽發證書的 CA 根證書 
  3. --cluster-signing-key-file=/var/lib/kubernetes/cluster-root-ca-key.pem          # 用于簽發證書的 CA 根證書的私鑰   
  4. ... 

關于更多 Kubernetes 證書簽發 API 的內容,可以參見 管理集群中的 TLS 認證。

使用 TLS bootstrapping 簡化 Kubelet 證書制作

在安裝 Kubernetes 時,我們需要為每一個工作節點上的 Kubelet 分別生成一個證書。由于工作節點可能很多,手動生成 Kubelet 證書的過程會比較繁瑣。為了解決這個問題,Kubernetes 提供了 TLS bootstrapping (https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/) 的方式來簡化 Kubelet 證書的生成過程。其原理是預先提供一個 bootstrapping token,kubelet 通過該 kubelet 調用 kube-apiserver 的證書簽發 API 來生成 自己需要的證書。要啟用該功能,需要在 kube-apiserver 中啟用 --enable-bootstrap-token-auth ,并創建一個 kubelet 訪問 kube-apiserver 使用的 bootstrap token secret。如果使用 kubeadmin 安裝,可以使用 kubeadm token create命令來創建 token。

采用TLS bootstrapping 生成證書的流程如下:

  1. 調用 kube-apiserver 生成一個 bootstrap token。
  2. 將該 bootstrap token 寫入到一個 kubeconfig 文件中,作為 kubelet 調用 kube-apiserver 的客戶端驗證方式。
  3. 通過 --bootstrap-kubeconfig 啟動參數將 bootstrap token 傳遞給 kubelet 進程。
  4. Kubelet 采用bootstrap token 調用 kube-apiserver API,生成自己所需的服務器和客戶端證書。
  5. 證書生成后,Kubelet 采用生成的證書和 kube-apiserver 進行通信,并刪除本地的 kubeconfig 文件,以避免 bootstrap token 泄漏風險。

小結

Kubernetes 中使用了大量的證書來確保集群的安全,弄清楚這些證書的用途和配置方法將有助于我們深入理解 kubernetes 的安裝過程和組件的配置。本文是筆者在學習 過程中整理的 Kubernetes 集群中主要使用到的證書,由于筆者對 Kubernetes 的理解有限,文章中難免存在部分錯誤,歡迎指正。

參考文檔

Kubernetes PKI 證書和要求 (https://kubernetes.io/zh/docs/setup/best-practices/certificates/)

kubernetes the hard way (https://github.com/kelseyhightower/kubernetes-the-hard-wa)

Kubernetes 之 二進制安裝(二) 證書詳解(https://blog.51cto.com/13210651/2361208)

TLS bootstrapping (https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/)

 

數字證書原理 (https://zhaohuabing.com/post/2020-03-19-pki/)

 

責任編輯:武曉燕 來源: 趙化冰
相關推薦

2024-10-16 10:11:52

2022-05-11 07:38:45

SpringWebFlux

2023-10-27 08:15:45

2021-08-31 07:02:20

Diff算法DOM

2024-05-22 09:45:49

2023-12-15 09:45:21

阻塞接口

2023-12-12 07:31:51

Executors工具開發者

2018-10-22 08:14:04

2022-09-05 09:25:53

KubernetesService

2021-08-05 06:54:05

觀察者訂閱設計

2020-05-11 14:35:11

微服務架構代碼

2022-09-09 10:00:13

KubernetesConfigMap

2022-07-18 21:53:46

RocketMQ廣播消息

2025-07-16 08:00:00

人工智能AI

2025-07-02 09:50:55

2020-05-14 13:39:19

Java 垃圾回收機制

2023-11-20 08:18:49

Netty服務器

2022-12-20 07:39:46

2023-12-21 17:11:21

Containerd管理工具命令行

2020-06-24 12:01:16

Python數據類字符
點贊
收藏

51CTO技術棧公眾號

免费资源在线观看| 色欲一区二区三区精品a片| 蜜臀久久精品| 91丨九色丨蝌蚪丨老版| 国产精品伦子伦免费视频| 精品伦精品一区二区三区视频密桃 | 久久久人成影片一区二区三区在哪下载 | 欧美在线观看视频一区二区| 国产一区一区三区| 天堂а√在线8种子蜜桃视频| 日韩国产精品久久| 欧美极度另类性三渗透| 国产美女免费无遮挡| 成人精品国产亚洲| 午夜电影网一区| 一本久久a久久精品vr综合| 亚洲春色一区二区三区| 丝瓜av网站精品一区二区| 色综合久久88色综合天天看泰| 欧美多人猛交狂配| 北条麻妃一区二区三区在线| 91久久精品一区二区三区| 国产在线视频综合| 在线日本视频| 久久婷婷久久一区二区三区| 444亚洲人体| 精品乱码一区内射人妻无码| 一区二区动漫| 欧美黑人xxx| 欧美美女性生活视频| 亚洲影院天堂中文av色| 精品日韩欧美在线| 久久久精品高清| 国产成人精品一区二三区在线观看 | 亚洲 国产 日韩 综合一区| 久久最新免费视频| 先锋资源在线视频| 福利一区在线| 色av综合在线| 日韩精品视频一区二区在线观看| 午夜激情在线| 1区2区3区欧美| 婷婷五月色综合| 精品电影在线| 久久综合狠狠综合久久激情| 精品国产免费人成电影在线观...| jlzzjlzzjlzz亚洲人| 麻豆久久久久久久| 国产精品成人一区二区| 黄瓜视频在线免费观看| 亚洲制服av| 欧美在线视频播放| 你懂的国产视频| 99re国产精品| 97超碰色婷婷| 国产一区在线观看免费| 三上亚洲一区二区| www.亚洲成人| 欧美做爰啪啪xxxⅹ性| 97精品视频| 久久精品中文字幕电影| 日本一二三区在线观看| 欧美96在线丨欧| 色综合久久中文字幕综合网小说| 538任你躁在线精品视频网站| 亚洲国产精品综合久久久| 91精品啪在线观看国产18| 91久久精品一区二区三区| 久久久免费视频网站| 成人免费直播| 欧美午夜电影一区| 成人综合久久网| 国产一区二区三区亚洲综合| 日韩精品自拍偷拍| 精品人妻一区二区免费视频| 亚洲动漫精品| 中文字幕视频在线免费欧美日韩综合在线看 | 亚洲女与黑人做爰| 欧美激情亚洲天堂| 自拍网站在线观看| 欧美精品丝袜中出| 亚洲一级Av无码毛片久久精品| 欧美精品中文字幕亚洲专区| 国产亚洲精品一区二区| 男女全黄做爰文章| 国产在线不卡| 日韩av免费在线| 91麻豆成人精品国产免费网站| 国产精品一区在线观看你懂的| 国产精品青青草| 精品一二三区视频| 成人免费视频在线观看| 免费看日本毛片| 久久精品黄色| 亚洲激情国产精品| 国产又粗又长又黄的视频| 最新精品国产| 国产97在线观看| 亚洲AV午夜精品| 国产午夜精品一区二区三区视频 | 久久99国产精品麻豆| 国产精品日韩欧美一区二区三区| 九色在线播放| 一片黄亚洲嫩模| 成人性视频欧美一区二区三区| 狂野欧美xxxx韩国少妇| 亚洲欧美福利视频| 日本天堂中文字幕| 久久裸体视频| 国产精品一区二区a| www.成人.com| 香蕉乱码成人久久天堂爱免费| 久热精品在线播放| 色婷婷精品视频| 欧美激情久久久久| 一卡二卡在线视频| 久久精品一二三| 久草视频这里只有精品| 四虎国产精品永久在线国在线| 日韩二区三区在线| 九九热精品在线观看| 麻豆精品在线观看| 日韩av电影在线观看| 91美女主播在线视频| 日韩一区二区三区av| 国产性猛交xx乱| 免费欧美在线| 国产欧美一区二区三区另类精品 | www.亚洲资源| 色94色欧美sute亚洲线路一ni| 成人做爰www看视频软件| 91不卡在线观看| 国产日韩欧美视频在线| caoporn国产精品免费视频| 欧美性极品少妇精品网站| 久久久久亚洲AV成人网人人小说| 亚洲国产不卡| 96精品久久久久中文字幕| 尤物网在线观看| 欧美在线色视频| 亚洲精品国产一区黑色丝袜| 国产精品日本欧美一区二区三区| 91精品国产99久久久久久红楼| 欧美精品日韩少妇| 欧美二区三区91| 亚洲人做受高潮| 麻豆91在线观看| 亚洲日本欧美在线| 日韩成人综合网| 在线视频免费一区二区| 国产情侣呻吟对白高潮| 国产欧美日韩视频在线观看| 久久精品香蕉视频| 欧美男同视频网| 国产精品草莓在线免费观看| 国产午夜在线视频| 欧美性色黄大片| 亚洲一级理论片| 久久99国产精品麻豆| 在线观看成人免费| 亚洲日本视频在线| 97人人爽人人喊人人模波多| 无码国产精品一区二区色情男同| 高跟丝袜欧美一区| 性猛交娇小69hd| 精品一区二区三区欧美| 亚洲精品国产suv一区88| jazzjazz国产精品麻豆| 668精品在线视频| 黄色片在线播放| 欧美日韩免费一区二区三区| 日本高清不卡免费| 波多野结衣视频一区| 成人久久久久久久久| 欧美一区二区性| 91在线色戒在线| 国产在线美女| 在线观看中文字幕亚洲| 国产露脸91国语对白| 亚洲午夜久久久久久久久电影院| 3d动漫精品啪啪1区2区免费| 波多野结衣视频播放| 奶水喷射视频一区| 一区二区高清视频| 中文字幕一区图| 国产不卡视频在线| 八戒八戒神马在线电影| 亚洲国产一区二区三区在线观看 | 日本h片在线| 国产视频精品久久久| 91精品人妻一区二区三区果冻| 亚洲黄一区二区三区| 成人影视免费观看| 国产一区二区三区视频在线播放| 国产欧美日韩网站| 色97色成人| 国产在线一区二区三区播放| 最新日韩一区| 国内精品久久久| 免费的黄网站在线观看| 亚洲成人久久久久| 夜夜骚av一区二区三区| 午夜精品福利一区二区三区蜜桃| www.99热| 91一区二区三区在线观看| 伊人影院综合在线| 国产精品视频| 黄色片免费在线观看视频| 国产一区二区欧美| 国产伦理一区二区三区| 亚洲日本中文| 国产成人精品一区二区| 136福利第一导航国产在线| 中文字幕亚洲激情| 九九在线视频| 亚洲精品久久久久久久久久久久久 | 亚洲免费视频一区| 日韩毛片网站| 日本欧美精品在线| 变态调教一区二区三区| 日韩中文在线视频| 黄视频在线观看免费| 亚洲国产精品久久91精品| 国产美女精品视频国产| 色哟哟日韩精品| 999这里只有精品| 亚洲一区二区三区四区的| 亚洲人做受高潮| 欧美国产禁国产网站cc| 黄色正能量网站| 99精品视频在线观看| 国产乱淫av片| 国产91精品在线观看| 国产精品嫩草影院8vv8 | 亚洲综合成人在线视频| 亚洲 欧美 变态 另类 综合| 中文字幕av一区二区三区高| 少妇大叫太粗太大爽一区二区| 国产69精品一区二区亚洲孕妇| 亚洲涩涩在线观看| 另类欧美日韩国产在线| 日韩一级片播放| 久久久一二三| 一级黄色香蕉视频| 日韩经典一区二区| 无码少妇一区二区三区芒果| 久久亚洲色图| 黄色av免费在线播放| 久久综合影音| 色七七在线观看| 热久久一区二区| 国产小视频精品| 久久国产精品99久久人人澡| 最新天堂在线视频| 国内精品免费在线观看| 亚洲第一成肉网| 国产精品资源站在线| 日本黄色一级网站| 处破女av一区二区| 日韩 中文字幕| 国产午夜精品一区二区三区嫩草 | 一区二区三区久久| 久久亚洲AV无码| 午夜私人影院久久久久| 久久国产视频精品| 色狠狠综合天天综合综合| 中文天堂在线播放| 宅男在线国产精品| 人妻中文字幕一区| 亚洲人成在线观看网站高清| 永久免费在线观看视频| 欧美人成在线视频| 三级在线观看视频| 国产精品久久久久一区二区| 成人51免费| 国产精品一区二区a| 一道本一区二区三区| 艳色歌舞团一区二区三区| 国产真实久久| 成人在线观看a| 国产专区欧美精品| 国产精品无码一区二区三| 国产欧美一二三区| 亚洲精品av在线播放| 国产又大又长又粗| 精品欧美乱码久久久久久 | 成人精品国产免费网站| 少妇按摩一区二区三区| 亚洲欧洲av一区二区三区久久| 久久久精品视频在线| 色美美综合视频| a天堂视频在线| 精品亚洲精品福利线在观看| 午夜在线播放| 97视频在线观看成人| 高清在线一区| 国产视色精品亚洲一区二区| 日本黄色精品| 极品美女扒开粉嫩小泬| 免费看欧美女人艹b| 中文字幕一区二区三区人妻在线视频 | 亚洲免费影院| 三级黄色片免费看| 久久久精品天堂| 久久久无码精品亚洲国产| 日本高清视频一区二区| 成 人 免费 黄 色| 中文字幕亚洲色图| 中文在线8资源库| 高清国产一区| 久久精品青草| 久久久国产欧美| 91在线观看高清| 国产无码精品久久久| 777奇米四色成人影色区| 日本天堂在线| 久久人人爽人人爽人人片av高清| 未满十八勿进黄网站一区不卡| 久久五月天婷婷| 亚洲图片在线| 欧美激情国产日韩精品一区18| 美丽的姑娘在线观看免费动漫| 欧美国产第一页| 99综合久久| 亚洲最新在线| 麻豆一区二区三| 超薄肉色丝袜一二三| 欧美丝袜一区二区| 天堂av资源网| 久久久久国产精品免费网站| 精品91福利视频| 一区二区精品在线观看| 男女男精品网站| 国产精久久一区二区三区| 岛国视频午夜一区免费在线观看| 高清乱码毛片入口| 欧美激情va永久在线播放| 伊人久久大香| 中文字幕在线中文字幕日亚韩一区 | 久久天天做天天爱综合色| 日本五十路女优| 亚洲第一偷拍网| av在线播放资源| 国产免费一区二区三区| 亚洲精选成人| 久久一区二区电影| 欧美日韩国产精品一区二区不卡中文| 东京干手机福利视频| 久久久久久久一| 精品国产一区二区三区成人影院 | av免费在线一区| 日本视频一区二区在线观看| 视频一区在线视频| 青娱乐国产视频| 欧美日本国产视频| 黄色网页在线看| 91九色对白| 在线国产日韩| 色无极影院亚洲| 在线欧美小视频| 欧美私人网站| 99久久自偷自偷国产精品不卡| 国色天香一区二区| 国产亚洲色婷婷久久99精品91| 第一福利永久视频精品| 国产51人人成人人人人爽色哟哟| 国产精品欧美亚洲777777 | 免费av观看网址| 国产日本欧洲亚洲| 国产一区二区在线不卡| 九九精品在线播放| 欧美电影完整版在线观看| 日av中文字幕| 自拍偷拍亚洲综合| 成人午夜免费在线观看| 国产成人精品一区二区| 91成人免费| 人妻无码中文久久久久专区| 欧美性淫爽ww久久久久无| 成码无人av片在线观看网站| 国产三区精品| 蜜桃在线一区二区三区| 精品无码av在线| 亚洲最新av在线| 一区二区三区视频播放| 日本va中文字幕| 亚洲一区中文日韩| 国产高清视频免费最新在线| 91成人理论电影| 久久精品麻豆| 欧美黄色免费观看| 国产午夜一区二区| 2021年精品国产福利在线| 无码人妻丰满熟妇区五十路百度| 一区二区中文视频| 天堂在线中文| 97欧洲一区二区精品免费| 日韩在线一二三区| 久草视频免费在线播放| 中文欧美在线视频|