kubernetes the hard way on PC (１２．kubectl )

#初めに
「[kubernetes the hard way](https://github.com/kelseyhightower/kubernetes-the-hard-way) を PC でやってみる」の１２回目、「kubectl」についてです。（ [目次](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) ）

今回、この一連の記事内では、リモートから kubectl コマンドを実行していないので
今回の作業はなくてもOKではあります。
ただ、せっかくなので、 KVM ホストノード (sakura) から kubectl でアクセスできるように構成します。

kubernetes the hard way では、 Google Cloud の Front end load balancer 経由でアクセスさせていますが、
今回はオンプレで Load Balancer を構成する気力が無かったので、
名前解決でアクセスし分けられるように構成しておき、
もしいずれ Load Balancer を実装することがあれば、名前解決を Load Balancer の IP に変えればよい、という形で構成します。

![49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/bbf8fdde-d916-3eb8-8380-1f470436302d.png)


やることは以下の通りです。
**今回は KVM ホストノードで実施しています**

- 名前解決の設定
- kubectl バイナリの配置
- 秘密鍵・証明書の取得
- kubernetes の configuration ファイルの作成
- アクセス検証


# 名前解決の設定

ホストノード (sakura) の /etc/hosts に k8sapi という名前解決を設定します。
下記の例では k8smaster0 を指していますが、 k8smaster0,1,2 どれでも OK です。
（※ロードバランサーが設定されている場合は当然そこを指します）

```shell-session
# cat /etc/hosts
...(略)
192.168.199.200         k8smaster0 k8sapi
192.168.199.201         k8smaster1
192.168.199.202         k8smaster2
```

#kubectl バイナリの配置

[第１０回](https://qiita.com/shimauma_Zzzzz/items/5822813313a7aae049a0#kubernetes-%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%AE%E5%85%A5%E6%89%8B)で、 kubernetes の各種バイナリを取得していますが、
その中から kubectl を ホストノードの /usr/local/bin に配置します。

```shell-session
[root@sakura /]# which kubectl
/usr/local/bin/kubectl
```

#秘密鍵・証明書の取得

kubectl で利用する秘密鍵や証明書を取得し、作業用ディレクトリに配置します。

```shell-session
# pwd
/root

# ls
admin-key.pem  admin.pem  ca.pem
```

#kubernetes の configuration ファイルの作成

configuration ファイルを作成します。
kubernetes the hard way では、 set-cluster コマンドの際には `--embed-certs` オプションを指定していますが
set-credential、set-context の際には `--embed-certs` を付けていません。
（つけていない場合、config ファイルの証明書・秘密鍵部分にはファイルのパスが指定されます。 
`--embed-certs` を付けると証明書等の内容が取り込まれます)

なぜ kubernetes the hard way では `--embed-certs` を付けたり付けなかったりしているのかわかりませんが
ここではすべて付けて試してみます。）

```shell-session
# kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.pem \
>     --embed-certs=true \
>     --server=https://k8sapi:6443
Cluster "kubernetes-the-hard-way" set.
```
（※ `--server` オプションでは、名前解決設定した k8sapi を指定しています)

参考に、ですが、　この時点で  $HOME/.kube ディレクトリと、その中の config ファイルが作成されます。

```shell-session
[root@sakura ~]# cd .kube/
[root@sakura .kube]# ls
config
[root@sakura .kube]# ls -l
合計 4
-rw------- 1 root root 1965  8月  2 19:50 config
# cat config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRU...(略)...==
    server: https://k8sapi:6443
  name: kubernetes-the-hard-way
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []
```

certificate-authority-date や server に設定が入っていますが、
contexts, users には何も入っていませんね。

次に、 credential 設定コマンドを実行します。
(kubernetes the hard way とは違い、 `--embed-certs=true` を付けています。

```shell-session
# kubectl config set-credentials admin \
>     --client-certificate=admin.pem \
>     --client-key=admin-key.pem \
>     --embed-certs=true
User "admin" set.
```

この際なので、config ファイルも見ておきましょう。

```shell-session
# cat config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1...(略)...==
    server: https://k8sapi:6443
  name: kubernetes-the-hard-way
contexts: []
current-context: ""
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: LS0tLS1...(略)...0tLS0K
    client-key-data: LS0tLS1...(略)...==
```

user 部分に admin の証明書等の情報が入りましたね。
なお、 `--embed-certs=true` を入れていないと、下記のようになります。

```shell-session
users:
- name: admin
  user:
    client-certificate: /root/admin.pem
    client-key: /root/admin-key.pem
```

次に、 context 設定コマンドを実行します。

```shell-session
# kubectl config set-context kubernetes-the-hard-way \
>   --cluster=kubernetes-the-hard-way \
>   --user=admin
Context "kubernetes-the-hard-way" created.
```

config ファイルです。（一部）

```shell-session
# cat config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1...(略)...==
    server: https://k8sapi:6443
  name: kubernetes-the-hard-way
contexts:
- context:
    cluster: kubernetes-the-hard-way
    user: admin
  name: kubernetes-the-hard-way
current-context: ""
kind: Config
preferences: {}
users:
- name: admin
...(略)
```

context 部分に、 context 名とユーザー名が入りましたね。

最後に、利用する context を設定します。

```shell-session
# kubectl config use-context kubernetes-the-hard-way
Switched to context "kubernetes-the-hard-way".
```

config ファイルに current-context が入りました。

```shell-session
contexts:
- context:
    cluster: kubernetes-the-hard-way
    user: admin
  name: kubernetes-the-hard-way
current-context: kubernetes-the-hard-way
```

さて、最後に `kubectl config view` を見てみましょう。

```shell-session
# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://k8sapi:6443
  name: kubernetes-the-hard-way
contexts:
- context:
    cluster: kubernetes-the-hard-way
    user: admin
  name: kubernetes-the-hard-way
current-context: kubernetes-the-hard-way
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
```

証明書等の部分は DATA+OMITTED、REDACTED となっていて見えないですが、
その他の情報は確認できますね。

#検証

では kubectl コマンドが利用できるかどうか確認してみます。
kubernetes the hard way では `get component status` を実施していますが、
v1.16 ではエラーになるので、代わりに `get node` で確認します。

```shell-session
# kubectl get nodes -o wide
NAME         STATUS   ROLES    AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
k8sworker0   Ready    <none>   85d   v1.16.9   192.168.199.210   <none>        Ubuntu 20.04 LTS   5.4.0-40-generic   containerd://1.3.4
k8sworker1   Ready    <none>   85d   v1.16.9   192.168.199.211   <none>        Ubuntu 20.04 LTS   5.4.0-40-generic   containerd://1.3.4
k8sworker2   Ready    <none>   85d   v1.16.9   192.168.199.212   <none>        Ubuntu 20.04 LTS   5.4.0-42-generic   containerd://1.3.4
```

無事に見えました。（なお、 ホームディレクトリに配置した 各種証明書等のファイルを消しても問題ありません。）
`--embed-certs` を付けていない場合は当然エラーになります。

```shell-session
# kubectl get nodes
Error in configuration:
* unable to read client-cert /root/admin.pem for admin due to open /root/admin.pem: no such file or directory
* unable to read client-key /root/admin-key.pem for admin due to open /root/admin-key.pem: no such file or directory
```

---
今回はここまでとして、次回は Provisioning Pod Network Routes の部分を実施します。


← [１１．Worker Nodes](https://qiita.com/shimauma_Zzzzz/items/725a333ac1c7c9634793)
↑ [目次](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)
→ [１３．Pod Network](https://qiita.com/shimauma_Zzzzz/items/9a968bd1fac186586e37)

----