taxin's notes

読書、勉強メモ etc.

Kubernetes the hard way (GCP版) #5 (認証用Kubernetes設定ファイルの作成)

Kubernetes the hard way (GCP版)の続きです。

前回の記事はこちら。

taxintt.hatenablog.com

Chap5. Generating Kubernetes Configuration Files for Authentication(認証用Kubernetes設定ファイルの作成)

このチャプターではChap4で作成した証明書を利用して、接続設定ファイルとして利用するkubeconfigファイルを作成します。

クライアント認証用のkubeconfigファイルの作成

controller managerkubeletkube-proxyscheduler・adminユーザー用のkubeconfigファイルを作成します。

最初に外部公開用のIPアドレスKUBERNETES_PUBLIC_ADDRESSとして取得します。
API Serverの前段に配置するELBで利用するIPアドレスをkubeconfig内で指定することで、Control PlaneのHA構成にも対応することが可能です。

(完全に余談ですが、Kubernetesクラスタの構築ツールの一つであるkubeadmでもHA構成のクラスタを作成できるようです。)

kubernetes.io

~/w/k/h/04 ❯❯❯ KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \
      --region $(gcloud config get-value compute/region) \
      --format 'value(address)')
~/w/k/h/04 ❯❯❯ echo $KUBERNETES_PUBLIC_ADDRESS
    35.233.237.51


次に、kubelet用のkubeconfigファイルを作成します。
各ノードごとにファイル名は${instance}.kubeconfigとして、kubeconfigファイルにクラスタに関する設定を追加していきます。

~/w/k/h/04 ❯❯❯ for instance in worker-0 worker-1 worker-2; do
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \
    --kubeconfig=${instance}.kubeconfig

  kubectl config set-credentials system:node:${instance} \
    --client-certificate=${instance}.pem \
    --client-key=${instance}-key.pem \
    --embed-certs=true \
    --kubeconfig=${instance}.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:node:${instance} \
    --kubeconfig=${instance}.kubeconfig

  kubectl config use-context default --kubeconfig=${instance}.kubeconfig
done
Cluster "kubernetes-the-hard-way" set.
User "system:node:worker-0" set.
Context "default" created.
Switched to context "default".
Cluster "kubernetes-the-hard-way" set.
User "system:node:worker-1" set.
Context "default" created.
Switched to context "default".
Cluster "kubernetes-the-hard-way" set.
User "system:node:worker-2" set.
Context "default" created.
Switched to context "default".


引数や利用するファイルなどは変わりますが、同じコマンドを実行するため実行される各コマンドについて説明しておきます。

最初にkubectl config set-clusterコマンドでkubeconfigファイルにクラスタの情報を追加します。(下記の情報を引数で渡します。)

  • --certificate-authority: 作成したCA証明書ファイル (ca.pem)
  • --server: https://${KUBERNETES_PUBLIC_ADDRESS}:6443 (外部公開用のIPアドレスを用いたURL) を指定

kubeletの通信相手はControl PlaneのAPI Serverとなるため、--serverの部分ではAPI Serverの前段に配置予定のELB用のIPアドレスを用いたURLを指定します。

  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \
    --kubeconfig=${instance}.kubeconfig


次に作成したクライアント証明書と鍵ファイルを指定して、kubectl config set-credentialsコマンドでkubeconfigファイルにクライアント証明書の情報を追加します。

  • --client-certificate: 作成したkubelet用のクライアント証明書 ( e.g.worker-0.pem)
  • --client-key: 作成したkubelet用のクライアント証明書の秘密鍵 ( e.g.worker-0-key.pem)
  kubectl config set-credentials system:node:${instance} \
    --client-certificate=${instance}.pem \
    --client-key=${instance}-key.pem \
    --embed-certs=true \
    --kubeconfig=${instance}.kubeconfig


最後に、kubectl config set-context defaultコマンドでクラスタのアクセス先情報であるcontextを作成します。

  • --cluster: kubeconfig内で指定するクラスタ名(kubernetes-the-hard-way)
  • --user: クライアント証明書内で指定したCN(Common Name) ( e.g.node:worker-0)

--userで指定するユーザー名は基本的に作成した証明書で指定したCNと同じ名前となります。

kubernetes.io

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:node:${instance} \
    --kubeconfig=${instance}.kubeconfig


次に、kube-proxy用のkubeconfigファイルを作成します。
各ノードごとにファイル名はkube-proxy.kubeconfigとして、先ほどと同じように設定を追加していきます。

同じコマンドを実行していますが、下記の引数は理解しておく必要があると思います。

  • --server: kube-proxyの通信相手は同じノード内のAPI Serverであるため、https://${KUBERNETES_PUBLIC_ADDRESS}:6443を指定
  • --user: クライアント証明書内で指定したCN(Common Name) であるsystem:kube-proxyを指定
~/w/k/h/04 ❯❯❯ {
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \
    --kubeconfig=kube-proxy.kubeconfig

  kubectl config set-credentials system:kube-proxy \
    --client-certificate=kube-proxy.pem \
    --client-key=kube-proxy-key.pem \
    --embed-certs=true \
    --kubeconfig=kube-proxy.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:kube-proxy \
    --kubeconfig=kube-proxy.kubeconfig

  kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
}
Cluster "kubernetes-the-hard-way" set.
User "system:kube-proxy" set.
Context "default" created.
Switched to context "default".


同様に、kube-scheduler・kube-controller-manager用のkubeconfigファイルを作成します。
Control Planeで利用するkubeconfigファイルを作成して、先ほどと同じように設定を追加していきます。

一部の引数について説明を記載しておきます。

  • --server: 2つのコンポーネントの通信相手は同じノード内のAPI Serverとなるため、ループバックアドレスを用いてhttps://127.0.0.1:6443を指定
  • --user: クライアント証明書内で指定したCN(Common Name) を指定 (system:kube-controller-manager, system:kube-scheduler)

qiita.com

~/w/k/h/04 ❯❯❯ {
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://127.0.0.1:6443 \
    --kubeconfig=kube-controller-manager.kubeconfig

  kubectl config set-credentials system:kube-controller-manager \
    --client-certificate=kube-controller-manager.pem \
    --client-key=kube-controller-manager-key.pem \
    --embed-certs=true \
    --kubeconfig=kube-controller-manager.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:kube-controller-manager \
    --kubeconfig=kube-controller-manager.kubeconfig

  kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
}
Cluster "kubernetes-the-hard-way" set.
User "system:kube-controller-manager" set.
Context "default" created.
Switched to context "default".

~/w/k/h/04 ❯❯❯ {
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://127.0.0.1:6443 \
    --kubeconfig=kube-scheduler.kubeconfig

  kubectl config set-credentials system:kube-scheduler \
    --client-certificate=kube-scheduler.pem \
    --client-key=kube-scheduler-key.pem \
    --embed-certs=true \
    --kubeconfig=kube-scheduler.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=system:kube-scheduler \
    --kubeconfig=kube-scheduler.kubeconfig

  kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
}
Cluster "kubernetes-the-hard-way" set.
User "system:kube-scheduler" set.
Context "default" created.
Switched to context "default".


最後に、adminユーザー用のkubeconfigファイルを作成します。
このkubeconfigファイルはクラスタと通信するクライアント側で利用するkubeconfigファイルではないので注意が必要です。
(Chap8. でControl Plane内で各種設定を行う際に利用する用のconfigファイルだと考えられます。)

一部の引数について説明を記載しておきます。

  • --server: Control Plane内で利用するkubeconfigファイルなので、ループバックアドレスを用いてhttps://127.0.0.1:6443を指定
  • --user: クライアント証明書内で指定したCN(Common Name) を指定 (admin)
w/k/h/04 ❯❯❯ {
  kubectl config set-cluster kubernetes-the-hard-way \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=https://127.0.0.1:6443 \
    --kubeconfig=admin.kubeconfig

  kubectl config set-credentials admin \
    --client-certificate=admin.pem \
    --client-key=admin-key.pem \
    --embed-certs=true \
    --kubeconfig=admin.kubeconfig

  kubectl config set-context default \
    --cluster=kubernetes-the-hard-way \
    --user=admin \
    --kubeconfig=admin.kubeconfig

  kubectl config use-context default --kubeconfig=admin.kubeconfig
}
Cluster "kubernetes-the-hard-way" set.
User "admin" set.
Context "default" created.
Switched to context "default".


kubeconfigファイルの作成が完了したら、コンポーネントが存在するNodeにファイルを配布していきます。

w/k/h/04 ❯❯❯ for instance in worker-0 worker-1 worker-2; do
  gcloud compute scp ${instance}.kubeconfig kube-proxy.kubeconfig ${instance}:~/
done
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
worker-0.kubeconfig                                                                                                                                    100% 6383    59.0KB/s   00:00
kube-proxy.kubeconfig                                                                                                                                  100% 6321    65.0KB/s   00:00
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
worker-1.kubeconfig                                                                                                                                    100% 6383    31.4KB/s   00:00
kube-proxy.kubeconfig                                                                                                                                  100% 6321    61.9KB/s   00:00
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
worker-2.kubeconfig                                                                                                                                    100% 6383    61.1KB/s   00:00
kube-proxy.kubeconfig                                                                                                                                  100% 6321    60.4KB/s   00:00

~/w/k/h/04 ❯❯❯ for instance in controller-0 controller-1 controller-2; do
  gcloud compute scp admin.kubeconfig kube-controller-manager.kubeconfig kube-scheduler.kubeconfig ${instance}:~/
done
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
admin.kubeconfig                                                                                                                                       100% 6265    61.8KB/s   00:00
kube-controller-manager.kubeconfig                                                                                                                     100% 6387    57.8KB/s   00:00
kube-scheduler.kubeconfig                                                                                                                              100% 6337    59.1KB/s   00:00
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
admin.kubeconfig                                                                                                                                       100% 6265    22.8KB/s   00:00
kube-controller-manager.kubeconfig                                                                                                                     100% 6387    60.8KB/s   00:00
kube-scheduler.kubeconfig                                                                                                                              100% 6337    63.9KB/s   00:00
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
admin.kubeconfig                                                                                                                                       100% 6265    52.7KB/s   00:00
kube-controller-manager.kubeconfig                                                                                                                     100% 6387    58.5KB/s   00:00
kube-scheduler.kubeconfig                                                                                                                              100% 6337    64.2KB/s   00:00
~/w/k/h/04 ❯❯❯


今回は、Chap5の内容をざっくりまとめました。
他に参考にした資料のリンクはこちらです。

Kubernetesのユーザー管理と認証・権限確認機構を理解しよう | さくらのナレッジ