全部產品
Search
文件中心

Container Service for Kubernetes:建立無狀態工作負載Deployment

更新時間:Feb 12, 2025

Deployment是Kubernetes中最常使用的工作負載類型之一,也被稱為“無狀態工作負載”,它的目標是保證叢集中始終有固定數量的Pod以您指定的狀態持續運行。本文介紹如何在ACK叢集中通過控制台及kubectl建立無狀態應用。

閱讀前提示

在建立工作負載前,建議您閱讀工作負載,瞭解工作負載的基礎知識和注意事項。本文主要分為以下兩部分內容:

  • 建立Deployment:提供控制台和kubectl兩種建立方式的快速建立流程。

  • 配置項說明:提供控制台配置項的相關文檔以及使用kubectl時的YAML樣本。

建立Deployment

通過控制台建立

重要

以下是一個簡化的工作負載建立流程。您可以參考該流程快速部署並驗證工作負載。熟悉基本操作後,您可以參考配置項說明自訂您的工作負載。

  1. 配置應用基本資料

    1. 登入Container Service管理控制,在左側導覽列選擇叢集列表叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態無狀態頁面,單擊使用鏡像建立

      image

    2. 應用基本資料設定精靈頁面,設定應用的基本資料。然後單擊下一步,進入容器配置嚮導頁面。

      image

  2. 配置容器

    容器配置地區,完成容器的鏡像名稱連接埠基本配置。其餘設定均為可選設定,保持預設即可。然後單擊下一步,進入進階配置嚮導頁面。鏡像地址如下所示。

    重要

    拉取此鏡像前,您需要為叢集開啟公網訪問能力。如果您在建立叢集時,為專用網路配置SNAT選擇保持預設勾選,則叢集已擁有公網訪問能力。如果未選擇,請參見為已有叢集開啟公網訪問能力

    registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest

    image

  3. 完成進階配置

    進階配置嚮導頁面中設定訪問、伸縮、調度和標籤註解。在訪問設定地區,設定暴露後端Pod的方式,單擊確定,然後單擊最下方的建立

    重要

    此步驟會建立一個LoadBalancer類型的Service用於暴露工作負載,其使用的CLB執行個體會產生一定的費用,詳細計費項目請參見隨用隨付。如果您後續不計劃使用此CLB,請及時釋放。

    image

  4. 查看應用

    建立完成設定精靈頁面中查看應用任務。建立應用任務已提交面板,單擊查看應用詳情單擊訪問方式頁簽,找到新建立的服務(即nginx-test-svc),單擊外部端點列的連結即可訪問。image

    image

    您可通過控制台對已建立的工作負載進行查看編輯重新部署等操作。image

通過kubectl建立

重要

建立工作負載前,請確保已通過kubectl串連到叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集

  1. 執行以下命令建立工作負載。以下命令指定了容器鏡像,而其他配置保持預設。

    • 1.18以上版本的叢集,使用以下命令啟動。

      kubectl create deployment nginx --image=registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
    • 1.18及以下版本的叢集,使用以下命令啟動。

      kubectl run -it nginx --image=registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
  2. 執行以下命令,建立一個LoadBalancer類型的Service,使用Server Load Balancer執行個體對外暴露工作負載。

    kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
  3. 執行以下命令,查看Service的公網IP地址。

    kubectl get svc

    預期輸出:

    NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
    kubernetes   ClusterIP      172.16.**.***    <none>          443/TCP        4h47m
    nginx        LoadBalancer   172.16.**.***    106.14.**.***   80:31130/TCP   1h10m
  4. 在瀏覽器中輸入nginx的公網IP(106.14.**.***),即可訪問工作負載所屬的Nginx容器。image

配置項說明

控制台配置項說明

應用基本資料

image

配置項

說明

應用程式名稱

工作負載的名稱,工作負載所屬的Pod的名稱會以此產生。

副本數量

工作負載包含的Pod數量,預設數量為2。

類型

工作負載的類型,本文中選擇無狀態(Deployment)。工作負載的選型請參見建立工作負載

標籤

工作負載的標籤。

註解

工作負載的註解(Annotation)。

時區同步

容器與所在節點是否使用相同的時區。

容器配置

基本配置

image

配置項

說明

鏡像名稱

  • 選擇鏡像

    您可以單擊選擇鏡像,選擇所需的鏡像。支援選擇以下三種類型的鏡像。

    • Container Registry企業版:可以選擇託管在Container RegistryACR中的企業版鏡像。需要選擇鏡像所屬地區,以及鏡像服務執行個體。關於ACR的更多資訊,請參見什麼是Container RegistryACR

    • Container Registry個人版:可以選擇託管在Container RegistryACR中的個人版鏡像。需要選擇鏡像所屬地區,以及鏡像服務執行個體。

    • 製品中心:由阿里雲及龍蜥社區提供的一些常見鏡像。使用製品中心時,需要叢集開啟公網訪問能力。關於製品中心的更多資訊,請參見製品中心

    使用其他來源的鏡像時,您可直接填入鏡像地址,格式為domainname/namespace/imagename:tag。不指定domainname時,例如輸入nginx:1.7.9,將從DockerHub拉取鏡像。

  • 選擇鏡像拉取策略

    ACK支援以下三種鏡像拉取策略(imagePullPolicy):

    • 優先使用本地鏡像(IfNotPresent)(預設):如果Worker節點上有本地鏡像,則使用本地鏡像,本地不存在時拉取鏡像。

    • 總是拉取鏡像(Always):表示每次部署或擴容都會從Container Registry重新拉取鏡像,而不會從本地拉取鏡像。

    • 僅使用本地鏡像(Never):僅使用本地鏡像,本地無鏡像時拉取失敗。

  • 設定鏡像密鑰

    使用ACR或第三方倉庫時,您可能需要配置密鑰以拉取鏡像。

    說明

    對於ACR企業版執行個體,您可以通過免密組件拉取鏡像。具體操作,請參見安裝並使用免密組件非託管版

資源限制

容器資源的resources.limits。更多資訊,請參見Requests and Limits

所需資源

容器資源的resources.requests。更多資訊,請參見Requests and Limits

容器啟動項

  • stdin:表示為該容器開啟標準輸入。

  • tty:表示為該容器分配一個虛擬終端,以便於向容器發送訊號。

通常這兩個選項是一起使用的,表示將終端(tty)綁定到容器的標準輸入(stdin)上。例如,一個互動程式從使用者擷取標準輸入,並顯示到終端中。

特權容器

  • 勾選特權容器,則privileged=true,開啟特權模式。

  • 不勾選特權容器,則privileged=false,不使用特權模式。

特權模式允許容器擁有與所在的Worker節點作業系統近似的許可權,例如訪問硬體裝置、掛載檔案系統等。

初始化容器

選中該選項,表示建立一個初始化容器。

初始化容器提供了一種機制來阻塞或延遲應用程式容器的啟動,初始化容器執行成功後,Pod內的其他容器會並行啟動。例如,檢測依賴服務的可用性。初始化容器可以包括一些應用鏡像中不存在的工具 + 生產力和安裝指令碼,用來初始化應用程式容器的運行環境,例如設定核心參數、組建組態檔案。更多資訊,請參見Init Containers

連接埠設定

image

配置項

說明

名稱

容器連接埠的名稱,僅用於區分連接埠,沒有實際功能。

容器連接埠

設定容器對外暴露的連接埠,必須介於1~65535之間。容器只有對外暴露連接埠,才能實現對Pod外暴露以及Pod中容器互相通訊。

一個Pod中的所有容器共用Pod的網路通訊協定棧,因此在Pod中配置多個容器時,連接埠不能重複。

協議

容器連接埠使用的4層(傳輸層)協議,支援TCP和UDP。

環境變數

image

配置項

說明

類型

設定環境變數的類型,支援以下類型:

  • 自訂

    使用env直接在工作負載中寫入程式碼環境變數。

  • 配置項

    使用envFrom擷取儲存在ConfigMap中的非敏感配置資料。

  • 保密字典

    使用envFrom擷取儲存在ConfigMap中的敏感資訊,如密碼、API 金鑰等。

  • 變數/變數引用

    使用value/valueFrom擷取其他環境變數或者預先定義的值。

  • 資源引用

    使用resourceFieldRef擷取Pod所在節點的資源資訊。

配置項、保密字典支援對全部檔案的引用,以保密字典為例。選擇保密字典類型,只選擇目標保密字典,則預設引用全部檔案。環境變數

對應的YAML,也引用了整個密鑰(Secret)。yaml

選擇資源引用,主要使用resourceFieldRef參數,從Pod規範中引用容器已經聲明的資源值,然後將這些值作為環境變數傳遞給容器。對應的YAML如下:

image

變數名稱

設定在Pod中環境變數名稱。

變數/變數引用

指定環境變數的值或從其他來源擷取的值。

健全狀態檢查

image

配置項

說明

存活檢查(Liveness Probes):用來檢查容器是否正常,不正常則重啟容器。

請求類型:HTTP請求

向容器發送HTTP請求,定期檢查容器是否正常。

  • 協議HTTP/HTTPS

  • 路徑:訪問HTTP Server的路徑。

  • 連接埠:容器暴露的訪問連接埠或連接埠名,連接埠號碼必須介於1和65535之間。

  • Http頭:即HTTP Headers,HTTP請求中自訂的要求標頭,HTTP允許重複的Header。支援索引值對的配置方式。

  • 延遲探測時間(秒):即initialDelaySeconds,容器啟動後第一次執行探測時需要等待多少秒,預設為3秒。

  • 執行探測頻率(秒):即periodSeconds,指執行探測的時間間隔,預設為10秒,最小為1秒。

  • 逾時時間(秒):即timeoutSeconds,探測逾時時間。預設1秒,最小1秒。

  • 健康閾值:探測失敗後,最少連續探測成功多少次才被認定為成功。預設是1,最小值是1。對於存活檢查(liveness)必須是1。

  • 不健康閾值:探測成功後,最少連續探測失敗多少次才被認定為失敗。預設值是3,最小值是1。

請求類型:TCP串連

向容器發送一個TCP Socket,Kubelet將嘗試在指定連接埠上開啟容器的Socket。如果可以建立串連,容器被認為是健康的,如果不能,則認為容器已失敗。

  • 連接埠:容器暴露的訪問連接埠或連接埠名,連接埠號碼必須介於1和65535之間。

  • 延遲探測時間(秒):即initialDelaySeconds,容器啟動後第一次執行探測時需要等待多少秒,預設為15秒。

  • 執行探測頻率(秒):即periodSeconds,指執行探測的時間間隔,預設為10秒,最小為1秒。

  • 逾時時間(秒):即timeoutSeconds,探測逾時時間。預設1秒,最小1秒。

  • 健康閾值:探測失敗後,最少連續探測成功多少次才被認定為成功。預設值是1,最小值是1。對於存活檢查(liveness)必須是1。

  • 不健康閾值:探測成功後,最少連續探測失敗多少次才被認定為失敗。預設值是3,最小值是1。

請求類型:命令列

通過在容器中執行探針檢測命令,來檢測容器的健康情況。

  • 命令列:用於檢測容器健康情況的探測命令。

  • 延遲探測時間(秒):即initialDelaySeconds,容器啟動後第一次執行探測時需要等待多少秒,預設為5秒。

  • 執行探測頻率(秒):即periodSeconds,指執行探測的時間間隔,預設為10秒,最小為1秒。

  • 逾時時間(秒):即timeoutSeconds,探測逾時時間。預設1秒,最小1秒。

  • 健康閾值:探測失敗後,最少連續探測成功多少次才被認定為成功。預設是1,最小值是1。對於存活檢查(liveness)必須是1。

  • 不健康閾值:探測成功後,最少連續探測失敗多少次才被認定為失敗。預設值是3,最小值是1。

就緒檢查(Readiness Probes):用來確定容器是否已經就緒,且可以接受流量。

啟動探測(Startup Probes):用於檢測容器內應用是否已啟動。

說明

僅Kubernetes叢集1.18及之後版本支援啟動探測。

生命週期

image

配置項

說明

啟動執行

為容器設定啟動前置命令和參數。啟動命令與參數定義了容器啟動時執行的操作,用於初始化應用服務。適用於需要特定環境變數、掛載點或連接埠映射的應用部署情境。

啟動後處理

為容器設定啟動後的命令。啟動後處理命令用於容器啟動後執行特定任務,如初始化配置、運行指令碼等,適用於需要在主進程前完成準備工作的情境。

停止前處理

為容器設定預結束命令。停止前處理命令用於關閉容器內的應用進程,確保資料一致性與服務正常終止。適用於需安全停機避免資料丟失或服務異常的情境。

您可以為容器的生命週期配置啟動執行、啟動後處理和停止前處理。具體操作,請參見配置生命週期

資料卷

配置項

說明

增加本機存放區

使Pod掛載所在節點的本機存放區卷,本機存放區卷的資料儲存在節點上,節點停機時資料即不再可用。在本機存放區同樣支援Secret、ConfigMap與其他臨時卷類型。儲存的功能較為複雜,使用儲存卷前,建議您閱讀儲存瞭解ACK中儲存的基礎知識。

增加雲端儲存聲明(PersistentVolumeClaim)

使Pod掛載雲端儲存卷,用於持久化儲存容器內重要資料。雲端儲存卷是位於叢集外的遠端儲存服務,與Worker節點完全獨立,不受節點變化的影響。在使用ACK時,雲端儲存卷通常是阿里雲提供的雲端硬碟、NAS、OSS等儲存服務。儲存的功能較為複雜,使用儲存卷前,建議您閱讀儲存瞭解ACK中儲存的基礎知識。

日誌配置

採集配置

  • 日誌庫:在叢集關聯的Log ServiceProject中產生一個對應的Logstore,用於儲存採集到的日誌。使用日誌前,建議您閱讀日誌管理瞭解ACK中日誌的基礎知識。

  • 容器內日誌路徑:需要採集的容器內日誌路徑。設定為Stdout時,表示採集容器的標準輸出日誌。

自訂Tag

通過定時觸發工作負載伸縮,適用於業務負載存在周期性變化的情境,例如社交媒體在午餐後和晚餐後周期性的流量高峰。更多資訊,請參見使用容器定時水平伸縮(CronHPA)

進階配置

配置卡片

配置項

說明

訪問設定

Service

服務(Service)為一組Pod提供一個固定、統一的四層(傳輸層)入口,它是對外暴露工作負載時必須配置的資源。Service支援多種類型,包括虛擬叢集IP節點連接埠負載平衡等。配置Service前,請參見Service管理瞭解Service基礎知識。

Ingress

路由(Ingress)為叢集中的多個Service提供七層(應用程式層)入口,並通過網域名稱匹配將請求轉寄到不同的Service。在使用Ingress前,您需要安裝Ingress Controller,ACK為此提供了多種適用於不同的情境的選項,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比進行選型。

伸縮配置

指標伸縮

通過監測容器的效能指標觸發自動調整。指標伸縮可以協助您在業務負載出現波動時自動調整工作負載使用的資源總量,在高負載時擴容緩解壓力,低負載時縮容節省資源。更多資訊,請參見使用容器水平伸縮(HPA)

定時伸縮

通過定時觸發工作負載伸縮,適用於業務負載存在周期性變化的情境,例如社交媒體在午餐後和晚餐後周期性的流量高峰。更多資訊,請參見使用容器定時水平伸縮(CronHPA)

調度設定

升級方式

Pod配置發生變更時,工作負載使用新Pod替換舊Pod的機制。

  • 滾動升級(rollingupdate):每次只替換一部分Pod,直到新Pod運行成功後再執行下一次替換。使用這種方式可以保證服務不中斷,但使用者可能同時訪問到不同版本的Pod。

  • 替換升級(recreate):一次性替換所有的Pod,可能會造成服務中斷,但是可以保證所有Pod版本的一致性。

  • 節點親和性

  • 應用親和性

  • 應用反親和性

  • 調度容忍

親和性、反親和性、容忍等配置用於調度,即使Pod運行在特定節點上。調度的操作較為複雜,需要您提前按照需求進行規劃。詳細操作,請參見調度

標籤和註解

Pod標籤

為該工作負載所屬的每個Pod添加標籤(Label)。叢集中包括工作負載、Service在內的各種資源會通過標籤與Pod進行匹配。ACK為Pod預設添加格式為app:(應用程式名稱)的標籤。

Pod註解

為該工作負載所屬的每個Pod添加註解(Annotation)。ACK中的部分功能會使用到註解,您可在使用這些功能時再編輯。

工作負載YAML樣本

apiVersion: apps/v1
kind: Deployment    # 工作負載類型
metadata:
  name: nginx-test
  namespace: default  # 根據需要更改命名空間
  labels:
    app: nginx
spec:
  replicas: 2  # 指定Pod數量
  selector:
    matchLabels:
      app: nginx
  template: # Pod配置
    metadata:
      labels: # Pod標籤
        app: nginx 
      annotations: # Pod註解
        description: "This is an application deployment"
    spec:
      containers:
      - name: nginx  # 鏡像名稱
        image: nginx:1.7.9  # 使用特定版本的 Nginx 鏡像
        ports:
        - name: nginx  # name
          containerPort: 80  # 容器暴露的連接埠
          protocol: TCP  # 指定協議為 TCP/UDP,預設也是 TCP
        command: ["/bin/sh"]  # 容器啟動項
        args: [ "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY) && exec nginx -g 'daemon off;'"] # 輸出變數、添加啟動 nginx 的命令
        stdin: true  # 開啟標準輸入
        tty: true    # 分配一個虛擬終端
        env:
          - name: SPECIAL_LEVEL_KEY
            valueFrom:
              configMapKeyRef:
                name: special-config  # 配置項的名稱 
                key: SPECIAL_LEVEL    # 配置項的key名稱
        securityContext:
          privileged: true  # true 開啟特權模式,false關閉特權模式,預設值 false
        resources:
          limits:
            cpu: "500m"               # 最大 CPU 使用量,500 毫核
            memory: "256Mi"           # 最大記憶體使用量量,256 MiB
            ephemeral-storage: "1Gi"  # 最大臨時儲存使用量,1 GiB
          requests:
            cpu: "200m"               # 請求的最小 CPU 使用量,200 毫核
            memory: "128Mi"           # 請求的最小記憶體使用量量,128 MiB
            ephemeral-storage: "500Mi" # 請求的最小臨時儲存使用量,500 MiB
        livenessProbe:  # 存活性探針配置
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:  # 就緒探針配置
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        volumeMounts:
        - name: tz-config
          mountPath: /etc/localtime
          readOnly: true
      volumes:
      - name: tz-config
        hostPath:
          path: /etc/localtime  #通過 volumeMounts 和 volumes 欄位將宿主機的 /etc/localtime 檔案掛載到容器內相同路徑下。
---
# service
apiVersion: v1
kind: Service
metadata:
  name: nginx-test-svc
  namespace: default  # 根據需要更改命名空間
  labels:
    app: nginx
spec:
  selector:
    app: nginx  # 匹配標籤,確保服務指向正確的 Pods
  ports:
    - port: 80           # Service 在叢集內提供的連接埠
      targetPort: 80     # 指向容器內部應用程式監聽的連接埠 (containerPort)
      protocol: TCP      # 協議,預設是 TCP
  type: ClusterIP        # 服務類型,預設是 ClusterIP,內部訪問
---
# ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: default  # 根據需要更改命名空間
  annotations:
    kubernetes.io/ingress.class: "nginx"  # 指定 Ingress 控制器類型
    # 如果使用阿里雲 SLB Ingress 控制器,可以指定如下:
    # service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxxxxxxx"
    # service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.spec.s1.small"
spec:
  rules:
    - host: foo.bar.com  # 替換為你的網域名稱
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service  # 後端服務名稱
                port:
                  number: 80         # 後端服務連接埠
  tls:  # 可選,用於啟用 HTTPS
    - hosts:
        - foo.bar.com  # 替換為你的網域名稱
      secretName: tls-secret  # TLS 認證 Secret 名稱

相關文檔