LoginSignup
14
14

More than 5 years have passed since last update.

K8s on Vagrant, Workerノードの追加と削除

Last updated at Posted at 2018-04-27

k8sクラスタに、新たなノードを追加、削除、再編入する方法のメモです。

この記事は、k8s on Vagrant の6回目です。

  1. Kubenetes v1.10 クラスタをVagrantで構築したメモ
  2. K8s on Vagrant, Node障害時の振る舞いについての検証記録
  3. K8s on Vagrant, ダッシュボードのセットアップ
  4. K8s on Vagrant, NFS 永続ボリュームの利用メモ
  5. K8s on Vagrant, NGINX Ingress Controller の利用

ワーカノードの追加

追加のWorkerノードを起動

ノードのセットアップは、前述の1回目の「Kubenetes v1.10 クラスタをVagrantで構築したメモ」のVagrantfileを変更して、新たなノード k8s4 を作成します。

$ vagrant up k8s4

追加したノードにログインして、ネットワークの初期設定のファイルを変更します。

$ vagrant ssh k8s4

ネットワーク設定の変更

次のファイルを編集する。

$ sudo -s
root@k8s4:~# vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

--node-ipに、自己ノードのIPアドレスをセット

10-kubeadm.conf
省略
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.244.0.10 --cluster-domain=cluster.local --node-ip=172.42.42.14"
省略

設定を読み込ませて、kubelet デーモンを再起動

root@k8s4:~# systemctl daemon-reload
root@k8s4:~# systemctl restart kubelet

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

トークンの有効期限が切れている場合は、マスターノードでトークンを生成します。

root@k8s1:~# kubeadm token create
9u28t5.5725jznlj67vu2bz

メモっておいた、マスターノードをセットアップした時の最後のメッセージで、--discovery-token-ca-cert-hashの値を再使用
また、 --token は上記で作成したトークンを利用します。 トークンの有効期限?は、1日程度はあるので、毎回createしなくても良い様です。

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 172.42.42.11:6443 --token 6l3di0.azqz2qvamk24mjuj --discovery-token-ca-cert-hash sha256:f1fa8b0f197792f7b7a97d2798a262573a7d058959aa7aff42e65d3b2a679450

ワーカーノードでJOINの実行

前述の情報から kubeadm join のオプションの情報を得て、クラスタへ追加する。

root@k8s4:~# kubeadm join 172.42.42.11:6443 --token 9u28t5.5725jznlj67vu2bz --discovery-token-ca-cert-hash sha256:f1fa8b0f197792f7b7a97d2798a262573a7d058959aa7aff42e65d3b2a679450
[preflight] Running pre-flight checks.
    [WARNING FileExisting-crictl]: crictl not found in system path
Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
[discovery] Trying to connect to API Server "172.42.42.11:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://172.42.42.11:6443"
[discovery] Requesting info from "https://172.42.42.11:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "172.42.42.11:6443"
[discovery] Successfully established connection with API Server "172.42.42.11:6443"

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

Run 'kubectl get nodes' on the master to see this node join the cluster.

k8s4が追加された

vagrant@k8s1:~$ kubectl get node
NAME      STATUS    ROLES     AGE       VERSION
k8s1      Ready     master    12d       v1.10.1
k8s2      Ready     node      12d       v1.10.1
k8s3      Ready     node      12d       v1.10.1
k8s4      Ready     <none>    3m        v1.10.1

ラベルを追加

vagrant@k8s1:~$ kubectl label node k8s4 node-role.kubernetes.io/node=
node "k8s4" labeled
vagrant@k8s1:~$ kubectl get nodes
NAME      STATUS    ROLES     AGE       VERSION
k8s1      Ready     master    12d       v1.10.1
k8s2      Ready     node      12d       v1.10.1
k8s3      Ready     node      12d       v1.10.1
k8s4      Ready     node      4m        v1.10.1

さらに、ラベルを追加、デーモンセットで必要なラベルなので、必ず追加する。

vagrant@k8s1:~$ kubectl label nodes k8s4 type=worker
node "k8s4" labeled
vagrant@k8s1:~$ kubectl get nodes -L type
NAME      STATUS    ROLES     AGE       VERSION   TYPE
k8s1      Ready     master    12d       v1.10.1   master
k8s2      Ready     node      12d       v1.10.1   worker
k8s3      Ready     node      12d       v1.10.1   worker
k8s4      Ready     node      16m       v1.10.1   worker

追加完了!!!

追加ノードへのスケジュール

初期状態

vagrant@k8s1:~$ kubectl get pods -o wide
NAME                        READY     STATUS    RESTARTS   AGE       IP             NODE
echoheaders-4c9r8           1/1       Running   3          2h        10.244.2.186   k8s3

レプリカ数を増加

vagrant@k8s1:~$ kubectl scale --replicas=10 replicationcontroller echoheaders
replicationcontroller "echoheaders" scaled

特に何もしなくても、新しく追加したk8s4にもスケージュールされる

vagrant@k8s1:~$ kubectl get pods -o wide
NAME                        READY     STATUS    RESTARTS   AGE       IP             NODE
echoheaders-4c9r8           1/1       Running   3          2h        10.244.2.186   k8s3
echoheaders-568hm           1/1       Running   0          43s       10.244.2.196   k8s3
echoheaders-74kx6           1/1       Running   0          43s       10.244.5.5     k8s4
echoheaders-8z9tn           1/1       Running   0          43s       10.244.1.135   k8s2
echoheaders-bm7zn           1/1       Running   0          43s       10.244.5.2     k8s4
echoheaders-jh4bk           1/1       Running   0          43s       10.244.1.134   k8s2
echoheaders-kzzch           1/1       Running   0          43s       10.244.5.3     k8s4
echoheaders-p5sxv           1/1       Running   0          43s       10.244.1.133   k8s2
echoheaders-t9f6v           1/1       Running   0          43s       10.244.2.197   k8s3
echoheaders-tlvzj           1/1       Running   0          43s       10.244.5.4     k8s4

ノードの削除の準備

特定ノードへのスケジュールの停止

vagrant@k8s1:~$ kubectl cordon k8s2
node "k8s2" cordoned

ポッドの追い出し

vagrant@k8s1:~$ kubectl drain k8s2 --ignore-daemonsets
node "k8s2" already cordoned
WARNING: Ignoring DaemonSet-managed pods: kube-flannel-ds-5lsd4, kube-proxy-n82vs, kube-keepalived-vip-5xsvq
pod "echoheaders-8z9tn" evicted
pod "echoheaders-p5sxv" evicted
pod "echoheaders-jh4bk" evicted
node "k8s2" drained

追い出し完了状態

vagrant@k8s1:~$ kubectl get pods -o wide
NAME                        READY     STATUS    RESTARTS   AGE       IP             NODE
echoheaders-4c9r8           1/1       Running   3          2h        10.244.2.186   k8s3
echoheaders-568hm           1/1       Running   0          5m        10.244.2.196   k8s3
echoheaders-74kx6           1/1       Running   0          5m        10.244.5.5     k8s4
echoheaders-7cfbq           1/1       Running   0          43s       10.244.2.198   k8s3
echoheaders-bm7zn           1/1       Running   0          5m        10.244.5.2     k8s4
echoheaders-kzzch           1/1       Running   0          5m        10.244.5.3     k8s4
echoheaders-rlcn6           1/1       Running   0          43s       10.244.5.7     k8s4
echoheaders-t9f6v           1/1       Running   0          5m        10.244.2.197   k8s3
echoheaders-tlvzj           1/1       Running   0          5m        10.244.5.4     k8s4
echoheaders-x68xb           1/1       Running   0          43s       10.244.5.6     k8s4

クラスタからのノードの除去

k8s2は、既に削除可能な状態となっている

vagrant@k8s1:~$ kubectl get node
NAME      STATUS                     ROLES     AGE       VERSION
k8s1      Ready                      master    12d       v1.10.1
k8s2      Ready,SchedulingDisabled   node      12d       v1.10.1
k8s3      Ready                      node      12d       v1.10.1
k8s4      Ready                      node      14m       v1.10.1

ノードの削除は、delete nodeするだけ

vagrant@k8s1:~$ kubectl delete node k8s2
node "k8s2" deleted

削除結果

vagrant@k8s1:~$ kubectl get node
NAME      STATUS    ROLES     AGE       VERSION
k8s1      Ready     master    12d       v1.10.1
k8s3      Ready     node      12d       v1.10.1
k8s4      Ready     node      14m       v1.10.1

切り離したノードの再編入

これから追加するノードで、設定のリセット、そして、ジョイン

root@k8s2:~# kubeadm reset

root@k8s2:~# kubeadm join 172.42.42.11:6443 --token 9u28t5.5725jznlj67vu2bz --discovery-token-ca-cert-hash sha256:f1fa8b0f197792f7b7a97d2798a262573a7d058959aa7aff42e65d3b2a679450

上記実行後

vagrant@k8s1:~$ kubectl get node
NAME      STATUS    ROLES     AGE       VERSION
k8s1      Ready     master    12d       v1.10.1
k8s2      Ready     <none>    48s       v1.10.1
k8s3      Ready     node      12d       v1.10.1
k8s4      Ready     node      19m       v1.10.1

ラベルの付与

vagrant@k8s1:~$ kubectl label node k8s2 node-role.kubernetes.io/node=
node "k8s2" labeled

vagrant@k8s1:~$ kubectl label nodes k8s2 type=worker
node "k8s2" labeled

ラベル付与の結果です。 これで、ポッドがスケジュールされる様になります。

vagrant@k8s1:~$ kubectl get nodes -L type
NAME      STATUS    ROLES     AGE       VERSION   TYPE
k8s1      Ready     master    12d       v1.10.1   master
k8s2      Ready     node      2m        v1.10.1   worker
k8s3      Ready     node      12d       v1.10.1   worker
k8s4      Ready     node      20m       v1.10.1   worker
14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14