oomichi / try-kubernetes

11 stars 5 forks source link

Test a pod with PV can move to another node when the original node is down #97

Closed oomichi closed 4 years ago

oomichi commented 4 years ago

Persistent Volume をアタッチした Pod が稼動していた Node に障害が起きた場合、Pod は別の Node で立上がるが Persistent Volume のアタッチで multi-attach error でエラーになる障害がある模様。 まずは手元の環境で再現させ、必要に応じてコミュニティにエスカレーションする。

問題発生環境

この問題は既にコミュニティで認識されているもので、現時点で対処されていない。 https://github.com/kubernetes/kubernetes/issues/80040#issuecomment-527600684

oomichi commented 4 years ago

手元の環境で再現させる

手元環境

  1. Cinder Standalone を有効にする
  2. PVC を作成する
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
    name: cinder-claim
    spec:
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
      storage: 1Gi
  3. pvc を使ったPodを作成する
    apiVersion: v1
    kind: Pod
    metadata:
    name: task-pv-pod
    spec:
    volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: cinder-claim
    containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/tmp/test"
          name: task-pv-storage
  4. 作成したPod の稼働ノードを確認する -> k8s-cpu02 であることが分かる
    $ kubectl get pods -o wide
    NAME                                             READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
    task-pv-pod                                      1/1     Running   0          117s    10.244.2.8     k8s-cpu02   <none>           <none>
  5. k8s-cpu02 を停止する
    
    $ nova stop k8s-cpu02
    $ nova list
    +--------------------------------------+------------+---------+------------+-------------+------------------------+
    | ID                                   | Name       | Status  | Task State | Power State | Networks               |
    +--------------------------------------+------------+---------+------------+-------------+------------------------+
    | 540d112e-26ce-425e-ac50-a4b12af59fa1 | e2e        | ACTIVE  | -          | Running     | provider=192.168.1.173 |
    | a6abbbc7-8302-42e4-9e11-ba176e8e0aa1 | k8s-cpu01  | ACTIVE  | -          | Running     | provider=192.168.1.160 |
    | 53f5bc3e-bcd3-445d-80fb-befdae9ce742 | k8s-cpu02  | SHUTOFF | -          | Shutdown    | provider=192.168.1.158 |
    | 23261bf9-76bd-4f8a-96ba-85ac07e7d0df | k8s-master | ACTIVE  | -          | Running     | provider=192.168.1.185 |
    +--------------------------------------+------------+---------+------------+-------------+------------------------+
6. node, pod の状態を確認する

$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-cpu01 Ready 6d19h v1.16.0 k8s-cpu02 NotReady 47h v1.16.0 k8s-master Ready master 6d19h v1.16.0 $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES task-pv-pod 1/1 Running 0 22h 10.244.2.8 k8s-cpu02

上記の通り、Nodeの状態がNotReady にも関わらず、Pod は k8s-cpu02 で Running となっている。
これは Pod の Toleration の設定が5分間は Node がNotReadyに陥っても何もしないことになっているため。

$ kubectl describe pod task-pv-pod ... Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events:

5分過ぎたところでTerminatingになった
-> この状態で止まっている
-> /var/log/syslog には multi-attach error のログは出ていない

$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES task-pv-pod 1/1 Terminating 0 22h 10.244.2.8 k8s-cpu02

oomichi commented 4 years ago

この問題は既にコミュニティで認識されている