天天看點

建立TLS證書和秘鑰建立TLS證書和秘鑰

執行下列步驟前建議你先閱讀以下内容:

**注意:**這一步是在安裝配置kubernetes的所有步驟中最容易出錯也最難于排查問題的一步,而這卻剛好是第一步,萬事開頭難,不要因為這點困難就望而卻步。

如果您足夠有信心在完全不了解自己在做什麼的情況下能夠成功地完成了這一步的配置,那麼您可以盡管跳過上面的幾篇文章直接進行下面的操作。

生成的 CA 證書和秘鑰檔案如下:

ca-key.pem

ca.pem

kubernetes-key.pem

kubernetes.pem

kube-proxy.pem

kube-proxy-key.pem

admin.pem

admin-key.pem

使用證書的元件如下:

etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;

kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;

kubelet:使用 ca.pem;

kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;

kubectl:使用 ca.pem、admin-key.pem、admin.pem;

kube-controller-manager:使用 ca-key.pem、ca.pem

注意:以下操作都在 master 節點即 172.20.0.113 這台主機上執行,證書隻需要建立一次即可,以後在向叢集中添加新節點時隻要将 /etc/kubernetes/ 目錄下的證書拷貝到新節點上即可。

方式一:直接使用二進制源碼包安裝

方式二:使用go指令安裝

我們的系統中安裝了Go1.7.5,使用以下指令安裝更快捷:

在<code>$GOPATH/bin</code>目錄下得到以cfssl開頭的幾個指令。

注意:以下文章中出現的cat的檔案名如果不存在需要手工建立。

建立 CA 配置檔案

字段說明

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

<code>signing</code>:表示該證書可用于簽名其它證書;生成的 ca.pem 證書中 <code>CA=TRUE</code>;

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

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

建立 CA 證書簽名請求

建立 <code>ca-csr.json</code> 檔案,内容如下:

"CN":<code>Common Name</code>,kube-apiserver 從證書中提取該字段作為請求的使用者名 (User Name);浏覽器使用該字段驗證網站是否合法;

"O":<code>Organization</code>,kube-apiserver 從證書中提取該字段作為請求使用者所屬的組 (Group);

生成 CA 證書和私鑰

建立 kubernetes 證書簽名請求檔案 <code>kubernetes-csr.json</code>:

如果 hosts 字段不為空則需要指定授權使用該證書的 IP 或域名清單,由于該證書後續被 <code>etcd</code> 叢集和 <code>kubernetes master</code> 叢集使用,是以上面分别指定了 <code>etcd</code> 叢集、<code>kubernetes master</code> 叢集的主機 IP 和 <code>kubernetes</code> 服務的服務 IP(一般是 <code>kube-apiserver</code> 指定的 <code>service-cluster-ip-range</code> 網段的第一個IP,如 10.254.0.1。

hosts 中的内容可以為空,即使按照上面的配置,向叢集中增加新節點後也不需要重新生成證書。

生成 kubernetes 證書和私鑰

或者直接在指令行上指定相關參數:

建立 admin 證書簽名請求檔案 <code>admin-csr.json</code>:

後續 <code>kube-apiserver</code> 使用 <code>RBAC</code> 對用戶端(如 <code>kubelet</code>、<code>kube-proxy</code>、<code>Pod</code>)請求進行授權;

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

OU 指定該證書的 Group 為 <code>system:masters</code>,<code>kubelet</code> 使用該證書通路 <code>kube-apiserver</code> 時 ,由于證書被 CA 簽名,是以認證通過,同時由于證書使用者組為經過預授權的 <code>system:masters</code>,是以被授予通路所有 API 的權限;

生成 admin 證書和私鑰

建立 kube-proxy 證書簽名請求檔案 <code>kube-proxy-csr.json</code>:

CN 指定該證書的 User 為 <code>system:kube-proxy</code>;

<code>kube-apiserver</code> 預定義的 RoleBinding <code>cluster-admin</code> 将User <code>system:kube-proxy</code> 與 Role <code>system:node-proxier</code> 綁定,該 Role 授予了調用 <code>kube-apiserver</code> Proxy 相關 API 的權限;

生成 kube-proxy 用戶端證書和私鑰

以 kubernetes 證書為例

确認 <code>Issuer</code> 字段的内容和 <code>ca-csr.json</code> 一緻;

确認 <code>Subject</code> 字段的内容和 <code>kubernetes-csr.json</code> 一緻;

确認 <code>X509v3 Subject Alternative Name</code> 字段的内容和 <code>kubernetes-csr.json</code> 一緻;

确認 <code>X509v3 Key Usage、Extended Key Usage</code> 字段的内容和 <code>ca-config.json</code> 中 <code>kubernetes</code> profile 一緻;

将生成的證書和秘鑰檔案(字尾名為<code>.pem</code>)拷貝到所有機器的 <code>/etc/kubernetes/ssl</code> 目錄下備用;

<a href="https://coreos.com/os/docs/latest/generate-self-signed-certificates.html" target="_blank">Generate self-signed certificates</a>

<a href="https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/02-certificate-authority.md" target="_blank">Setting up a Certificate Authority and Creating TLS Certificates</a>

<a href="https://blogs.msdn.microsoft.com/kaushal/2012/02/17/client-certificates-vs-server-certificates/" target="_blank">Client Certificates V/s Server Certificates</a>

<a href="http://blog.jobbole.com/104919/" target="_blank">數字證書及 CA 的掃盲介紹</a>

<a href="https://github.com/rootsongjc/kubernetes-handbook/blob/master/guide/tls-bootstrapping.md" target="_blank">TLS bootstrap 引導程式</a>

版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任

本文轉自    懿懿懿   51CTO部落格,原文連結:

<a href="http://blog.51cto.com/search/result?q=cfssl" target="_blank">cfssl</a>

繼續閱讀