2016-08-23 8 views
7

私はこのような何かに見えるKubernetes展開持つ(置き換え名として他のことを「....」):ノード間でデプロイメントをどのように配布できますか?

# Please edit the object below. Lines beginning with a '#' will be ignored, 
# and an empty file will abort the edit. If an error occurs while saving this file will be 
# reopened with the relevant failures. 
# 
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    annotations: 
    deployment.kubernetes.io/revision: "3" 
    kubernetes.io/change-cause: kubectl replace deployment .... 
     -f - --record 
    creationTimestamp: 2016-08-20T03:46:28Z 
    generation: 8 
    labels: 
    app: .... 
    name: .... 
    namespace: default 
    resourceVersion: "369219" 
    selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/.... 
    uid: aceb2a9e-6688-11e6-b5fc-42010af000c1 
spec: 
    replicas: 2 
    selector: 
    matchLabels: 
     app: .... 
    strategy: 
    rollingUpdate: 
     maxSurge: 1 
     maxUnavailable: 1 
    type: RollingUpdate 
    template: 
    metadata: 
     creationTimestamp: null 
     labels: 
     app: .... 
    spec: 
     containers: 
     - image: gcr.io/..../....:0.2.1 
     imagePullPolicy: IfNotPresent 
     name: .... 
     ports: 
     - containerPort: 8080 
      protocol: TCP 
     resources: 
      requests: 
      cpu: "0" 
     terminationMessagePath: /dev/termination-log 
     dnsPolicy: ClusterFirst 
     restartPolicy: Always 
     securityContext: {} 
     terminationGracePeriodSeconds: 30 
status: 
    availableReplicas: 2 
    observedGeneration: 8 
    replicas: 2 
    updatedReplicas: 2 

私が観察してる問題であることKubernetes場所展開で両方のレプリカ(私は同じノード上に2つの質問をしました)。そのノードがダウンすると、両方のコンテナが失われ、サービスがオフラインになります。

Kubernetesは、コンテナが同じタイプの同じノード上のコンテナを2倍にしないようにしたいと考えています。これは、リソースを消費するだけで冗長性を提供しません。私は配備、複製セット、ノードなどのドキュメントを見てきましたが、私はKubernetesにこれを伝えるオプションを見つけることができませんでした。

コンテナに必要なノード間の冗長性をKubernetesに伝える方法はありますか?

編集:ラベルが正常に機能しないと思われます。ラベルは、ノードが実行されてローカルリソース(SSD)などにアクセスできるように制約します。ノードがオフラインになると、ダウンタイムが発生しないようにするだけです。

答えて

0

ノードが停止した場合、ノード上で実行されているポッドは、別のノードで自動的に再起動されます。

実行する場所を正確に指定し始めると、実際にはKubernetesが別のノードでスケジュールを変更する機能が失われます。

したがって、一般的な練習は、単にクベルネイスにそのことをさせることです。

あなたは、原因などを特定のローカルボリュームタイプの要件に、特定のノード上のポッドを実行するには、有効な要件を持っていますがの読み取りがある場合:

+0

を私はラベルが動作するかわかりません。ラベルは、ノードが実行されてローカルリソース(SSD)などにアクセスできるように制約します。ノードがオフラインになると、ダウンタイムが発生しないようにするだけです。 –

0

たぶんDaemonSetがうまくいくでしょう。私はnodeSelectorDaemonStetsを使用して特定のノードでポッドを実行し、重複を避けるために使用しています。

http://kubernetes.io/docs/admin/daemons/

+0

それは仕事のようですが、不可能に近づいたり下ろしたりします。 –

+0

状況によって異なります。また、リソース制限で再生し、ポッドを常に別のノードにスケジューリングさせることもできます。 – Camil

5

あなたが言った展開を作成前に、その展開のためのサービス、を作成する場合、Kubernetesは、ノード間であなたのポッドを分散します。

この動作はスケジューラからのものです。この動作は、両方のノードで十分なリソースが利用可能であるという条件で、ベストエフォート型で提供されています。ドキュメントの

対応するセクション:Configuration best practices - Service

1

私はアントワーヌ・コットンに同意するには、デプロイメントのためのサービスを使用します。何らかの理由で、特定のノードで1つのポッドが死んでいる場合、サービスは常に新しいポッドを作成してサービスを維持します。ただし、すべてのノードにデプロイメントを配布したい場合は、ポッドマニフェストファイルでpodのアンチアフィニティを使用できます。私はgitlab pageの例を入れて、Kubernetes Blogにも見つけることができます。あなたの便宜のために、ここでも例を提供しています。この例では

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx spec: replicas: 2 template: metadata: labels: app: nginx spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: kubernetes.io/hostname containers: - name: nginx image: gcr.io/google_containers/nginx-slim:0.8 ports: - containerPort: 80

、各展開アプリであり、このラベルの値がnginxのあるラベルを有します。ポッド仕様では、1つのノードに2つの同じポッド(ラベルapp:nginx)を持つように制限するpodAntiAffinityがあります。 1つのノードに複数のデプロイメントを配置する場合は、podAffinityを使用することもできます。

3

私はあなたがアフィニティー/反親​​和性セレクターを探していると思います。

アフィニティは、ポッドを同じ場所に配置するためのものです。そのため、私のウェブサイトでは、たとえば自分のキャッシュと同じホスト上でスケジュールを立てるようにします。一方、アンチアフィニティは反対です。一連の規則に従ってホスト上でスケジュールを設定しないでください。

だから、あなたがやっていることのために、私はこの二つのリンクを詳しく見てかかるだろう: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#never-co-located-in-the-same-node

https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/#tolerating-node-failure

関連する問題