kubernetes the hard way on PC（７．k8sConfig）

#初めに
「[kubernetes the hard way](https://github.com/kelseyhightower/kubernetes-the-hard-way) を PC でやってみる」の7回目、「Generating Kubernetes Configuration Files for Authentication」についてです。（ [目次](https://qiita.com/shimauma_Zzzzz/items/84ecf5c748ceafd05380#%E8%AA%AC%E6%98%8E%E8%A8%98%E4%BA%8B%E7%9B%AE%E6%AC%A1) ）
ここもやればできるがわからない、という部分だと思いますので、ここもすこし丁寧にやりたいです。

下記の一連の手順は、 [前回](https://qiita.com/shimauma_Zzzzz/items/03d28db24cf9d9830760)作成した各種証明書等を設定ファイルに組み込み、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 は秘密鍵のデータです）

![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/409b1d33-c5cf-12e2-a093-1535e797beee.png)

kubectl コマンドを打つ際に `--config` で指定するか、 `kubectl config use-context xxx` で指定することにより
kubectl から接続する cluster を選択することができます。

![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/9861f118-8e73-2c97-9eca-ca6a3725c0b7.png)

これらは、 kubectl コマンドを利用する際だけではなく、　
kubernetes の各種コンポーネントが API server などと通信するときにも利用されます。
ここでは、「初めに」に記載した各種コンポーネント用の Configuration ファイルを作成します。
作業場所ですが、 各種証明書やキーファイルのあるディレクトリで実施します。
（別の場所で実施する場合は、各コマンド中の証明書やキーをフルパス指定します）

- worker ノード (kubelet) 用

3台の worker ノードの kubelet 用に、ループを回しながら設定ファイルを生成しています。
最初に  KUBERNETES_PUBLIC_ADDRESS 変数に k8sapi を指定しています。
これは kubernetes the hard way にはなく、今回独自です。
[「第3回.VM作成」の hosts 設定](https://qiita.com/shimauma_Zzzzz/items/4c436a6030f7ed120d5d#hosts-%E3%81%AE%E8%A8%AD%E5%AE%9A) のところで、 k8smaster0 の IP に k8sapi という名前も付けていました。
これにより、 API サーバーは k8smaster0 上のものが使われます。　
今回は実施しませんが、 外部 Load Balancer 等で API サーバーを負荷分散する際に、
代表IP を k8sapi と名前解決させれば API サーバーの負荷分散が可能になります。


```shell-session
# 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:ノード名　となっています。
証明書や秘密鍵は各ノード用のものが設定されています。

```shell-session
# 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 用

```shell-session
# 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.
```
```shell-session
# 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.
```
```shell-session
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=system:kube-proxy \
>     --kubeconfig=kube-proxy.kubeconfig
Context "default" created.
```
```shell-session
# 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 サーバーにつながります。

```shell-session
# 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.
```
```shell-session
# 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.
```
```shell-session
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=system:kube-controller-manager \
>     --kubeconfig=kube-controller-manager.kubeconfig
Context "default" created.
```
```shell-session
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 を指定しています。

```shell-session
# 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.
```
```shell-session
# 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.
```
```shell-session
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=system:kube-scheduler \
>     --kubeconfig=kube-scheduler.kubeconfig
Context "default" created.
```
```shell-session
# 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 などを指定しているとつながらない、ということになります。　ロードバランサーが用意できた後の、第１２回で外部の IPに変えています。）

```shell-session
# 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.
```
```shell-session
# kubectl config set-credentials admin \
>     --client-certificate=admin.pem \
>     --client-key=admin-key.pem \
>     --embed-certs=true \
>     --kubeconfig=admin.kubeconfig
User "admin" set.
```
```shell-session
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=admin \
>     --kubeconfig=admin.kubeconfig
Context "default" created.
```
```shell-session
# 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 の部分を実施します。


← [６．Certificates](https://qiita.com/shimauma_Zzzzz/items/03d28db24cf9d9830760)
↑ [目次](https://qiita.com/shimauma_Zzzzz/items/84ecf5c748ceafd05380#%E8%AA%AC%E6%98%8E%E8%A8%98%E4%BA%8B%E7%9B%AE%E6%AC%A1)
→ [８．Encryption Config and Key](https://qiita.com/shimauma_Zzzzz/items/c51fe9ba789bb9dfa1d4)

----