LoginSignup
8
2

More than 3 years have passed since last update.

[小ネタ]KubernetesでnodeName指定のPodデプロイはスケジューリングを無視する

Posted at

はじめに

KubernetesでPodをデプロイするYAMLファイルでは様々な値を指定することができますが、その中にnodeNameというものがあります。nodeNameでは特定のNodeを指定することで、そのNodeに対してPodをデプロイすることができます。今回はこのnodeNameについて、簡単に紹介したいと思います。

nodeNameとは

早速nodeNameを使ってみます。なお利用している環境はこちらの記事と同様になります。

YAMLファイルでは以下のように記述します。

sample-nodename.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-nodename
spec:
  containers:
  - name: nginx-container
    image: nginx:1.12
  nodeName: kube-worker01  # PodSpecで指定する

さて、nodeNameを指定した場合、KubernetesのschedulerはこのPodを「無視」し、指定したNode上のkubeletはこのPodをデプロイしようと試みます。そのため、通常Podをデプロイした場合とは異なり、「どのNodeにデプロイしようか」というスケジューリングが働きません。

試しにnodeNameで指定したNodeをcordonでスケジュール対象外とした場合を見てみます。

# kube-worker01をcordon
[root@kube-master01 ~]# kubectl cordon kube-worker01
node/kube-worker01 cordoned
[root@kube-master01 ~]# kubectl get nodes
NAME            STATUS                     ROLES    AGE   VERSION
kube-master01   Ready                      master   9d    v1.15.1
kube-worker01   Ready,SchedulingDisabled   <none>   9d    v1.15.1
kube-worker02   Ready                      <none>   9d    v1.15.1
[root@kube-master01 ~]#

# Podデプロイ
[root@kube-master01 ~]# kubectl apply -f sample-nodename.yaml
pod/sample-nodename created
[root@kube-master01 ~]#

# 確認
[root@kube-master01 ~]# kubectl get pods -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP               NODE            NOMINATED NODE   READINESS GATES
sample-nodename   1/1     Running   0          7s    192.168.132.59   kube-worker01   <none>           <none>
[root@kube-master01 ~]#

御覧の通り、スケジューリング対象外のNodeにデプロイができてしまいました。通常cordon/uncordonなどで特定のNodeのスケジューリングをコントロールする場合、そのNodeに対してPodがデプロイされては困る(もしくはPodが動作しない)ような状況だと思われます。しかしnodeNameを指定している場合、それを無視してPodがデプロイされてしまいます。そのため、あるPodを特定のNodeにデプロイしたい場合、基本的にnodeNameは利用せず、labelなどを利用したスケジューリングを検討するほうが良いと思います。

なお、nodeNameで指定したNodeが停止している場合、デプロイしたPodはPendingとなります。

# Node停止
>vagrant halt kube-worker01
>vagrant status
Current machine states:

kube-master01             running (virtualbox)
kube-worker01             poweroff (virtualbox)
kube-worker02             running (virtualbox)
kube-client               running (virtualbox)

[root@kube-master01 ~]# kubectl get nodes
NAME            STATUS                        ROLES    AGE   VERSION
kube-master01   Ready                         master   9d    v1.15.1
kube-worker01   NotReady,SchedulingDisabled   <none>   9d    v1.15.1
kube-worker02   Ready                         <none>   9d    v1.15.1

# Podデプロイ
[root@kube-master01 ~]# kubectl apply -f sample-nodename.yaml
pod/sample-nodename created
[root@kube-master01 ~]#

# 確認
[root@kube-master01 ~]# kubectl get pods -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP       NODE            NOMINATED NODE   READINESS GATES
sample-nodename   0/1     Pending   0          5s    <none>   kube-worker01   <none>           <none>
[root@kube-master01 ~]#

参考ドキュメント

8
2
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
8
2