#初めに
「kubernetes the hard way を PC でやってみる」の7回目、「Generating Kubernetes Configuration Files for Authentication」についてです。( 目次 )
ここもやればできるがわからない、という部分だと思いますので、ここもすこし丁寧にやりたいです。
下記の一連の手順は、 前回作成した各種証明書等を設定ファイルに組み込み、API Server 等と連携する際に利用できるようにします。
この記事では、 「Generating Kubernetes Configuration Files for Authentication」 部分について記載します。
設定ファイルの作成対象は以下の通りです。
- Configuration ファイル作成
- worker ノード (kubelet) 用
- kube-proxy 用
- kube-controller-manager 用
- kube-scheduler 用
- admin ユーザー用
- Configuration ファイル配布
#Configuration ファイル作成
Configuration ファイルには、 Cluster, Context, Credentials(User) が設定されており、
Context を選択することにより、複数のクラスター環境をつど選択することができます。
(Cert は証明書, Key は秘密鍵のデータです)
kubectl コマンドを打つ際に --config
で指定するか、 kubectl config use-context xxx
で指定することにより
kubectl から接続する cluster を選択することができます。
これらは、 kubectl コマンドを利用する際だけではなく、
kubernetes の各種コンポーネントが API server などと通信するときにも利用されます。
ここでは、「初めに」に記載した各種コンポーネント用の Configuration ファイルを作成します。
作業場所ですが、 各種証明書やキーファイルのあるディレクトリで実施します。
(別の場所で実施する場合は、各コマンド中の証明書やキーをフルパス指定します)
- worker ノード (kubelet) 用
3台の worker ノードの kubelet 用に、ループを回しながら設定ファイルを生成しています。
最初に KUBERNETES_PUBLIC_ADDRESS 変数に k8sapi を指定しています。
これは kubernetes the hard way にはなく、今回独自です。
「第3回.VM作成」の hosts 設定 のところで、 k8smaster0 の IP に k8sapi という名前も付けていました。
これにより、 API サーバーは k8smaster0 上のものが使われます。
今回は実施しませんが、 外部 Load Balancer 等で API サーバーを負荷分散する際に、
代表IP を k8sapi と名前解決させれば API サーバーの負荷分散が可能になります。
# export KUBERNETES_PUBLIC_ADDRESS=k8sapi
# for instance in k8sworker0 k8sworker1 k8sworker2
> 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:k8sworker0" set.
Context "default" created.
Switched to context "default".
Cluster "kubernetes-the-hard-way" set.
User "system:node:k8sworker1" set.
Context "default" created.
Switched to context "default".
Cluster "kubernetes-the-hard-way" set.
User "system:node:k8sworker2" set.
Context "default" created.
Switched to context "default".
root@k8smaster0:/data/assam/k8s/ca#
作成されたファイルは以下のようになっています。
server 部分が https://k8sapi:6443 になっているのがわかります。
また、ノード用の kubeconfig なので、 user 部分は system:node:ノード名 となっています。
証明書や秘密鍵は各ノード用のものが設定されています。
# cat k8sworker0.kubeconfig
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUd... (略)
server: https://k8sapi:6443
name: kubernetes-the-hard-way
contexts:
- context:
cluster: kubernetes-the-hard-way
user: system:node:k8sworker0
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: system:node:k8sworker0
user:
client-certificate-data: LS0tLS1CR... (略)
client-key-data: LS0tLS1CRUd... (略)
以後は各種コンポーネント向けに繰り返しになります。
- kube-proxy 用
# export KUBERNETES_PUBLIC_ADDRESS=k8sapi
# 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
Cluster "kubernetes-the-hard-way" set.
# 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
User "system:kube-proxy" set.
# kubectl config set-context default \
> --cluster=kubernetes-the-hard-way \
> --user=system:kube-proxy \
> --kubeconfig=kube-proxy.kubeconfig
Context "default" created.
# kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
Switched to context "default".
- kube-controller-manager 用
kube-controller-manager は、worker ノードではなく Control plane ノードにあります。
そのため、 --server
では 127.0.0.1:6443 を指定すれば 各ノード上の API サーバーにつながります。
# 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
Cluster "kubernetes-the-hard-way" set.
# 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
User "system:kube-controller-manager" set.
# kubectl config set-context default \
> --cluster=kubernetes-the-hard-way \
> --user=system:kube-controller-manager \
> --kubeconfig=kube-controller-manager.kubeconfig
Context "default" created.
root@k8smaster0:/data/assam/k8s/ca# kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
Switched to context "default".
- kube-scheduler 用
scheduler も controller-manager 同様 --server
には 127.0.0.1:6443 を指定しています。
# 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
Cluster "kubernetes-the-hard-way" set.
# 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
User "system:kube-scheduler" set.
# kubectl config set-context default \
> --cluster=kubernetes-the-hard-way \
> --user=system:kube-scheduler \
> --kubeconfig=kube-scheduler.kubeconfig
Context "default" created.
# kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
Switched to context "default".
- admin ユーザー用
ここでも control plane ノード上での実行を想定して、 127.0.0.1:6443 を指定しています。
ただ、 admin ユーザーでの kubectl 実行は、別にリモートノードでも問題ないです。
そのため、 127.0.0.1 の代わりに k8sapi を指定しておいても(今回の環境では)問題ありません。
(※今回の環境では k8sapi は control plane ノード#1 を指しているので、
ここで k8sapi と指定しても問題ありません。ただ、 kubernetes the hard way では
この段階では API サーバー用ロードバランサーが用意されていないため、 ロードバランサーの IP などを指定しているとつながらない、ということになります。 ロードバランサーが用意できた後の、第12回で外部の IPに変えています。)
# 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
Cluster "kubernetes-the-hard-way" set.
# kubectl config set-credentials admin \
> --client-certificate=admin.pem \
> --client-key=admin-key.pem \
> --embed-certs=true \
> --kubeconfig=admin.kubeconfig
User "admin" set.
# kubectl config set-context default \
> --cluster=kubernetes-the-hard-way \
> --user=admin \
> --kubeconfig=admin.kubeconfig
Context "default" created.
# kubectl config use-context default --kubeconfig=admin.kubeconfig
Switched to context "default".
#Configuration ファイル配布
作成した configuration ファイルは以下の通りですが、
それぞれ control plane / worker 上に配布します。
(別途各サーバー上で適切な場所に配置しなおすため、ここでは rootのホームディレクトリに配置しました)
ファイル | 配布先 |
---|---|
k8sworker0.kubeconfig | k8sworker0 |
k8sworker1.kubeconfig | k8sworker1 |
k8sworker2.kubeconfig | k8sworker2 |
kube-proxy.kubeconfig | k8sworker0,1,2 |
kube-controller-manager.kubeconfig | k8smaster0,1,2 |
kube-scheduler.kubeconfig | k8smaster0,1,2 |
admin.kubeconfig | k8smaster0,1,2 |
kubelet, proxy は worker 上で稼働し、 controller-manager, scheduler は control plane 上で稼働することを考えると
配置先も理解しやすいと思います。
admin は kubectl を使うときですが、現時点では control plane から実施します。
今回はここまでとして、次回は Generating the Data Encryption Config and Key の部分を実施します。
← 6.Certificates
↑ 目次
→ 8.Encryption Config and Key