2016-08-23 21 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地方兩個副本(在部署我已經要求兩個)在同一個節點上。如果該節點關閉,則會丟失兩個容器,並且該服務將脫機。

我想讓Kubernetes做的事情是確保它不會在容器是相同類型的同一節點上加倍容器 - 這隻會消耗資源並且不會提供任何冗餘。我查看了關於部署,副本集,節點等的文檔,但是我找不到任何可以讓我告訴Kubernetes執行此操作的選項。

有沒有辦法告訴Kubernetes跨節點多少冗餘我想要一個容器?

編輯:我不確定標籤會起作用;標籤約束節點將運行的位置,以便它可以訪問本地資源(SSD)等。我所要做的就是確保節點脫機時不會停機。

回答

0

如果一個節點出現故障,其上運行的任何豆莢將在另一個節點上自動重新啓動。

如果您開始明確指定您希望它們運行的​​位置,那麼您實際上會失去Kubernetes在不同節點上重新安排它們的能力。

因此,通常的做法是簡單地讓Kubernetes做它的事情。

然而,如果你確實有有效的要求,在特定節點上運行一個吊艙,由於對某些局部容積式等要求,有一個讀:

+0

我不知道標籤將工作;標籤約束節點將運行的位置,以便它可以訪問本地資源(SSD)等。我所要做的就是確保節點脫機時不會停機。 –

0

也許DaemonSet會更好。我使用DaemonStetsnodeSelector在特定節點上運行窗格並避免重複。

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

+0

這樣做會很有用,但是縮小或縮小几乎不可能。 –

+0

視情況而定。您也可以玩資源限制,並強制將播客始終安排到其他節點。 – Camil

5

如果您創建的部署服務,之前創建部署說,Kubernetes會蔓延整個節點的豆莢。

此行爲來自調度程序,它是在盡力而爲的基礎上提供的,前提是您在兩個節點上都有足夠的可用資源。在文檔中

相應部分:Configuration best practices - Service

1

我與安託萬科滕同意使用的服務,爲您的部署。如果由於某種原因,某個服務點在某個節點中死亡,服務會始終通過創建新的服務點來保留所有服務。但是,如果您只想在所有節點之間分發部署,則可以在您的pod清單文件中使用pod anti affinity。我在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的。在pod規範中,您擁有podAntiAffinity,它將限制在一個節點中擁有兩個相同的pod(標籤app:nginx)。如果您想將多個部署放置在一個節點中,也可以使用podAffinity。

3

我認爲你正在尋找Affinity/Anti-Affinity Selectors。

親和力是用於共同定位豆莢,所以我希望我的網站嘗試和計劃在我的緩存相同的主機上。另一方面,反親和力是相反的,不要按照一套規則安排在主機上。

因此,對於你在做什麼,我會仔細看看這兩個鏈接: 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

相關問題