k8sクラスタにノードを追加する


社内のいらなくなったサーバをk8sクラスタにせこせこ追加している村田です。
今回はすでにあるマスターノードがある環境で、ノードの追加を行ってみようと思いますよ。

# TL;DR

kubeadm を使って token create, joinをするだけです。


# ノードの準備

まずKubernethesをインストールします。

https://kubernetes.io/ja/docs/setup/independent/install-kubeadm/ あたりを参考にセットアップしてください。
OSのswapやネットワークの設定、Dockerとk8sのインストールを行う感じです。

# マスターノードでトークンの作成

参加させるノードに渡すためのトークンを作成します。このトークンを使ってマスターノードと認証します。


```
[root@k8s-node01 kubernetes]# kubeadm token create
ORENK8SDAtc91xgsvv8gz

[root@k8s-node01 kubernetes]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt \
>   | openssl rsa -pubin -outform der 2>/dev/null \
>   | openssl dgst -sha256 -hex | sed 's/^.* //'
CACERTNOHASHDAYO6a9b56024195b2024d8ecdfea6ab715ec93174b420e2
```


# ノードに参加

↑で作ったトークンを使って、参加させるノード側で以下のようにjoinコマンドを流します。
172.32.254.101はマスターノードのIPアドレスです。

```
[root@k8s-node02 ~]# kubeadm join 172.32.254.101:6443 --discovery-token ORENK8SDAtc91xgsvv8gz --discovery-token-ca-cert-hash sha256:CACERTNOHASHDAYO6a9b56024195b2024d8ecdfea6ab715ec93174b420e2
[preflight] Running pre-flight checks
    [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.1. Latest validated version: 18.09
    [WARNING Hostname]: hostname "k8s-node02.derori.local" could not be reached
    [WARNING Hostname]: hostname "k8s-node02.derori.local": lookup k8s-node02.derori.local on 172.16.3.39:53: no such host
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.15" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" 
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" 
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
```

これ、結構時間かかります。＆こけてエラーが出ているとマスターノードから参照できないので結果はちゃんと見てください。

# 見てみる

まだNotReadyだけど、参加された。

```
[root@k8s-node01 kubernetes]# kubectl get node -o wide -A
NAME                     STATUS     ROLES    AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
k8s-node01.derori.local   Ready      master   6d22h   v1.15.3   172.32.254.101   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.1
k8s-node02.derori.local   NotReady   <none>   40s     v1.15.3   172.32.254.102   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.1
```

5分ぐらいでReadyになった。calico-nodeっていうpodが立ち上がった。

```
[root@k8s-node01 kubernetes]# kubectl get all,node -A -o wide
NAMESPACE     NAME                                                 READY   STATUS    RESTARTS   AGE     IP               NODE                     NOMINATED NODE   READINESS GATES
kube-system   pod/calico-kube-controllers-65b8787765-mwvzf         1/1     Running   0          6d22h   10.13.158.66     k8s-node01.derori.local   <none>           <none>
kube-system   pod/calico-node-2x5nm                                1/1     Running   0          6m25s   172.32.254.102   k8s-node02.derori.local   <none>           <none>
kube-system   pod/calico-node-rcct7                                1/1     Running   0          6d22h   172.32.254.101   k8s-node01.derori.local   <none>           <none>
kube-system   pod/coredns-5c98db65d4-62f6x                         1/1     Running   0          6d22h   10.13.158.67     k8s-node01.derori.local   <none>           <none>
kube-system   pod/coredns-5c98db65d4-84s6q                         1/1     Running   0          6d22h   10.13.158.65     k8s-node01.derori.local   <none>           <none>
kube-system   pod/etcd-k8s-node01.derori.local                      1/1     Running   0          6d22h   172.32.254.101   k8s-node01.derori.local   <none>           <none>
kube-system   pod/kube-apiserver-k8s-node01.derori.local            1/1     Running   0          6d22h   172.32.254.101   k8s-node01.derori.local   <none>           <none>
kube-system   pod/kube-controller-manager-k8s-node01.derori.local   1/1     Running   0          6d22h   172.32.254.101   k8s-node01.derori.local   <none>           <none>
kube-system   pod/kube-proxy-s4745                                 1/1     Running   0          6d22h   172.32.254.101   k8s-node01.derori.local   <none>           <none>
kube-system   pod/kube-proxy-ztxwg                                 1/1     Running   0          6m25s   172.32.254.102   k8s-node02.derori.local   <none>           <none>
kube-system   pod/kube-scheduler-k8s-node01.derori.local            1/1     Running   0          6d22h   172.32.254.101   k8s-node01.derori.local   <none>           <none>

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  6d22h   <none>
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   6d22h   k8s-app=kube-dns

NAMESPACE     NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE     CONTAINERS    IMAGES                          SELECTOR
kube-system   daemonset.apps/calico-node   2         2         2       2            2           beta.kubernetes.io/os=linux   6d22h   calico-node   calico/node:v3.8.2              k8s-app=calico-node
kube-system   daemonset.apps/kube-proxy    2         2         2       2            2           beta.kubernetes.io/os=linux   6d22h   kube-proxy    k8s.gcr.io/kube-proxy:v1.15.3   k8s-app=kube-proxy

NAMESPACE     NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS                IMAGES                           SELECTOR
kube-system   deployment.apps/calico-kube-controllers   1/1     1            1           6d22h   calico-kube-controllers   calico/kube-controllers:v3.8.2   k8s-app=calico-kube-controllers
kube-system   deployment.apps/coredns                   2/2     2            2           6d22h   coredns                   k8s.gcr.io/coredns:1.3.1         k8s-app=kube-dns

NAMESPACE     NAME                                                 DESIRED   CURRENT   READY   AGE     CONTAINERS                IMAGES                           SELECTOR
kube-system   replicaset.apps/calico-kube-controllers-65b8787765   1         1         1       6d22h   calico-kube-controllers   calico/kube-controllers:v3.8.2   k8s-app=calico-kube-controllers,pod-template-hash=65b8787765
kube-system   replicaset.apps/coredns-5c98db65d4                   2         2         2       6d22h   coredns                   k8s.gcr.io/coredns:1.3.1         k8s-app=kube-dns,pod-template-hash=5c98db65d4

NAMESPACE   NAME                          STATUS   ROLES    AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
            node/k8s-node01.derori.local   Ready    master   6d22h   v1.15.3   172.32.254.101   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.1
            node/k8s-node02.derori.local   Ready    <none>   6m25s   v1.15.3   172.32.254.102   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.1
```

4台ゲットしたので4台分やりました。ansibleとかでレシピ作ったら楽だね。

```
[root@k8s-node01 kubernetes]# kubectl get node -A -o wide
NAME                     STATUS   ROLES    AGE    VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
k8s-node01.derori.local   Ready    master   7d     v1.15.3   172.32.254.101   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.1
k8s-node02.derori.local   Ready    <none>   133m   v1.15.3   172.32.254.102   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.1
k8s-node05.derori.local   Ready    <none>   19m    v1.15.3   172.32.254.105   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.2
node03.k8s.derori.local   Ready    <none>   64m    v1.15.3   172.32.254.103   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.2
node04.k8s.derori.local   Ready    <none>   44m    v1.15.3   172.32.254.104   <none>        CentOS Linux 7 (Core)   3.10.0-957.27.2.el7.x86_64   docker://19.3.2
```

# まとめ

これでマスターノードにapplyすると適当にPodsなどがプロビジョニングされるはずです。Ingressとかのルーティングとかどうなるのかまだよくわからないですが、これからやっていこうと思います。

※centos8が出る前にやってしまったときのものです。