社内のいらなくなったサーバを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が出る前にやってしまったときのものです。