はじめに
本記事は「Kubernetes the hard wayする ~1.Compute Resources展開編~
」の続きです。CKA取得を目指し、Kubernetes the hardwayに取り組んだ際、各章で何をやっているのかをメモしたものを投稿していきます。
本記事では元ドキュメントの「Provisioning a CA and Generating TLS Certificates
」の部分をやっていきます。元ドキュメント及びコマンド等は以下のURLを参照のこと。
https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/04-certificate-authority.md
CA作成
今回作成するKubernetesクラスタで使用するCA証明書と秘密鍵を作成する。この証明書はこのクラスタ上でのみ真正性が確認できれば良いため、インターネット上で使用される証明書と異なり、どこかの証明機関から署名を受ける必要はない。
今回作成するCA証明書をはじめ、Kubernetes the hardway上で作成する証明書と秘密鍵はcfssl及びcfssljsonを使用して作成する。cfsslはopensslで証明書などを作成する操作をjsonで宣言的に行うことができるツールで、cfssljsonはcfsslの出力をpemなどの一般的な証明書や秘密鍵用のファイルフォーマットに変換するためのツールである。
まずCAを作成するための設定ファイル(ca-config.json
)を作成する。このファイルはCA証明書の有効期間などの情報を含んでいる。次に、CA証明書のCSR作成用の設定ファイル(ca-csr.json
)を作成する。このファイルでは証明書を使用するユーザの組織や所在国を設定する。外部に公開される証明書ではないので、日本在住でも元ドキュメント通りに設定して構わない。
次に、作成した設定ファイルを使用して秘密鍵と公開鍵の作成、及び証明書の作成を行う。cfssl gencert
コマンドで秘密鍵と公開鍵の作成、CSR要求の作成、及び証明書の発行まで一気に行える。その結果をcfssljson
コマンドでpemファイルに変換する。
一通りの操作を終えるとca-key.pem
ファイルとca.pem
ファイルが作成される。ca-key.pem
ファイルにはCA用の秘密鍵が、ca.pem
ファイルにはCA用の証明書が保存されている。
クライアント用証明書と各コンポーネント用証明書の作成
クライアント用の証明書と、Kubernetesの各コンポーネント用証明書を作成する。Kubernetesでは各コンポーネント及びユーザはクライアント証明書で認証するため、これらの証明書は先ほど作成したCA証明書で署名されている必要がある。
はじめにクライアント用証明書を作成する。このクライアントとは、kubelet
コマンドでクラスタを操作する際に使用するadmin
ユーザのことを指す。まずadmin
ユーザ用のCSR作成用の設定ファイル(admin-csr.json
)を作成し、秘密鍵と証明書を作成する。この時、cfssl
コマンドにCAの証明書と秘密鍵を渡し、admin
ユーザ用の証明書に署名している。
次に、各ワーカーノードのkubelet用の証明書を作成する。今回作成するKubernetesクラスタではNodeの認証にNode Authorizer
という認証モードを使用する。Node Authorizer
で各ノードを認証するため、各証明書のCNにsystem:node:<instance-name>
を指定する必要がある。
その後、kube-controller-manager
、kube-proxy
、kube-scheduler
の証明書を作成する。これらは概ね同じ手順で作成される。CSR要求のCNだけ異なり、system:<component-name>
になっている。
次に、kube-apiserver
用の証明書を作成する。この時、ホスト名としてapiserverのクラスタ内でのDNS名、LB用Public IP、各コントロールプレーン用VMのIP、及び10.32.0.1
を設定する。この10.32.0.1
というアドレスはkubernetes
clusterIP serviceのアドレスで、clusterIP用に予約されたアドレスレンジの中の、一番最初のアドレスが使用される。
clusterIP用に予約されるアドレスレンジは、コントロールプレーン作成時にkube-apiserverバイナリの--service-cluster-ip-rangeというオプションで指定する。
最後に、Service Account用の証明書を作成する。この証明書はSAが認証用に使うトークンを署名するために、kube-controll-manager
が使用する。
作成した証明書の配布
各ワーカーノードにルート証明書(ca.pem
)と各workerノード用の証明書(worker-X.pem
)と秘密鍵(worker-X-key.pem
)を配布する。
次に、各コントロールプレーンノードにルート証明書(ca.pem
)と秘密鍵(ca-key.pem
)、kube-apiserver
用の証明書(kubernetes.pem
)と秘密鍵(kubernetes-key.pem
)、Service Account用証明書(service-account.pem
)と秘密鍵(service-account-key.pem
)を配布する。
その他の証明書はkubeconfig
ファイルを作成するために使用するため、配布しない。
まとめ
Kubernetesクラスタ全体で使用されるCA証明書及び秘密鍵と、この秘密鍵で署名されるユーザ用証明書及び各コンポーネント用証明書を作成し、一部を各ノードに配布した。配布しなかった証明書は、今後kubeconfig
ファイルを作成するために使用する。