2017-09-22 6 views
1

現在、K8Sクラスタでポッドを管理するためにDeploymentsを使用しています。Kubernetes - ローリングアップデートで新しいポッドを起動せずに古いポッドを取り除く

私の配備の中には、2つのポッド/レプリカが必要なものがあります.3つのポッド/レプリカが必要なものもあれば、1つのポッド/レプリカしか必要ないものもあります。 Imの問題は、1つのポッド/レプリカを持つものです。

私のYAMLファイルは次のとおりです。

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: user-management-backend-deployment 
spec: 
    replicas: 1 
    strategy: 
    type: RollingUpdate 
    rollingUpdate: 
     maxUnavailable: 1 
     maxSurge: 2 
    selector: 
    matchLabels: 
     name: user-management-backend 
    template: 
    metadata: 
     labels: 
     name: user-management-backend 
    spec: 
     containers: 
     - name: user-management-backend 
     image: proj_csdp/user-management_backend:3.1.8 
     imagePullPolicy: IfNotPresent 
     ports: 
      - containerPort: 8080 
     livenessProbe: 
      httpGet: 
      port: 8080 
      path: /user_management/health 
      initialDelaySeconds: 300 
      timeoutSeconds: 30 
     readinessProbe: 
      httpGet: 
      port: 8080 
      path: /user_management/health 
      initialDelaySeconds: 10 
      timeoutSeconds: 5 
     volumeMounts: 
      - name: nfs 
      mountPath: "/vault" 
     volumes: 
     - name: nfs 
      nfs: 
      server: kube-nfs 
      path: "/kubenfs/vault" 
      readOnly: true 

私は罰金を実行している古いバージョンを持っています。

# kubectl get po | grep user-management-backend-deployment 
user-management-backend-deployment-3264073543-mrrvl    1/1  Running  0   4d 

今、私は画像を更新する:古いポッド作業を維持しながら

# kubectl set image deployment user-management-backend-deployment user-management-backend=proj_csdp/user-management_backend:3.2.0 

は今RollingUpdate設計どおり、K8Sは新しいポッドを持ち出す必要があり、新しいポッドへの準備ができて一度だけ古いポッドを削除する必要があります、トラフィックを取る。しかし、私が見ているのは、古いポッドが直ちに削除され、新しいポッドが作成されてから、トラフィックを取るのに時間がかかり、トラフィックを落とさなければならないということです。

# kubectl get po | grep user-management-backend-deployment 
user-management-backend-deployment-3264073543-l93m9    0/1  ContainerCreating 0   1s 

# kubectl get po | grep user-management-backend-deployment 
user-management-backend-deployment-3264073543-l93m9    1/1  Running   0   33s 

私はmaxSurge: 2 & maxUnavailable: 1を使用しているが、これは動作していないようです。

なぜこれが機能しないのですか?

答えて

2

maxUnavailable: 1と思われます。私は自明あなたの経験、その値を設定することを再現することができた、と自明maxUnavailable: 0

に設定することで、正しい経験を達成ここで、スケジューラは、あなたが経験している行動に到着したかの私の「擬似証拠」だ:

replicas: 1なので、k8sの希望の状態はちょうどReadyの1つのポッドです。あなたがリクエストした戦略であるローリングアップデート中に、新しいポッドが作成され、合計は2になります。しかし、ポッドを利用不可能な状態にする許可をk8sに与え、希望ポッドの数は1です。したがって、これらの制約はすべて満たされています。1 Podは、使用不可能な状態で、RU戦略で許可されている必要な数です。すべてのポッドが使用できなくなるせないようにmaxUnavailableゼロに、あなた正しく直接K8Sを設定することにより

としてはすでに答え

+0

感謝。 'maxUnavailable:0'が働いています! –

2

それは短時間replica回数以上急増ポッドを意味していても、あなたがmaxUnavailableを設定することができます所望の結果を得るために0に設定する。余分なノートのカップルは:

  1. 新しいポッドが使用する単一の特定のボリュームをマウントステートフルサービスを使用している場合、これが動作することを期待してはいけません。ボリュームはすぐに交換するポッドに接続されるため、新しいポッドに取り付けることはできません。

  2. ドキュメントでは、.spec.strategy.rollingUpdate.maxSurgeを0に設定している場合、これを0に設定することはできません。

https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#max-unavailable

関連する問題