全部產品
Search
文件中心

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

更新時間:Dec 21, 2024

Container Compute Service (ACS)支援通過容器鏡像、編排YAML模板和kubectl命令列的方式建立無狀態應用。本文以Nginx應用為例,介紹如何在ACS叢集中建立無狀態應用。

控制台

使用鏡像建立

步驟一:配置應用基本資料

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面,單擊使用鏡像建立

  4. 應用基本資料設定精靈中,設定應用的基本資料。

    配置項

    說明

    應用程式名稱

    輸入應用的名稱。

    副本數量

    應用程式套件含的Pod數量,預設數量為2。

    工作負載

    選擇無狀態(Deployment)

    標籤

    為該應用添加一個標籤,標識該應用。

    註解

    為該應用添加一個註解(Annotation)。

    執行個體類型

    選擇執行個體類型。關於執行個體類型的說明,請參見ACS Pod執行個體概述

    QoS類型

    選擇QoS類型。更多資訊,請參見算力品質定義

    • 通用型執行個體支援defaultbest-effort

    • 效能型執行個體僅支援default

  5. 單擊下一步,進入容器配置嚮導頁面。

步驟二:配置容器

容器配置嚮導頁面中,配置容器的鏡像、資源、連接埠、環境變數、健全狀態檢查、生命週期、資料卷和日誌等資訊。

說明

容器1頁簽右側,單擊添加容器,可以為應用的Pod設定多個容器。

  1. 基本配置地區,完成容器的基本配置。

    配置項

    說明

    鏡像名稱

    • 選擇鏡像

      單擊選擇鏡像,選擇所需的鏡像。

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

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

      • 製品中心:包含應用程式容器化基礎OS鏡像、基礎語言鏡像、AI/巨量資料相關鏡像,本樣本以製品中心的Nginx鏡像為例說明。關於製品中心的更多資訊,請參見製品中心

    • (可選)設定鏡像拉取策略

      鏡像拉取策略的下拉式清單中選擇鏡像拉取策略。預設情況下不設定,採用Kubernetes預設的IfNotPresent。

      • 優先使用本地鏡像(IfNotPresent):如果本地已經存在該鏡像(之前拉取過該鏡像至宿主機中),則不會再次拉取,如果本地不存在該鏡像,則會拉取該鏡像。

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

      • 僅使用本地鏡像(Never):僅使用本地鏡像。

    • (可選)設定鏡像密鑰

      單擊設定鏡像密鑰,為私人鏡像設定密鑰以確保安全。

      • 對於ACR個人版執行個體,您可以通過設定鏡像密鑰的方式拉取容器鏡像。設定密鑰的更多資訊,請參見管理保密字典

      • 對於ACR企業版執行個體,您可以通過免密組件拉取鏡像。具體操作,請參見免密拉取ACR鏡像

    所需資源

    為容器設定資源額度。

    • CPU:可指定該容器CPU資源配額和資源限制,預設資源配額和資源限制相等,計費模式為隨用隨付。如果您通過YAML方式設定不同於資源配額的資源限制,資源配額將改寫成與資源限制相等。詳見資源規格

    • 記憶體:可指定該容器Memory資源額度和資源限制,預設資源額度和資源限制相等,計費模式為隨用隨付。如果您通過YAML方式設定不同於資源額度的資源限制,資源額度將改寫成與資源限制相等。詳見資源規格

    容器啟動項

    (可選)設定容器啟動項。

    • stdin:將控制台輸入發送到容器。

    • tty:將標準輸入控制台作為容器的控制台輸入。

    說明

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

    初始化容器

    (可選)選擇該選項,表示建立一個初始化容器。

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

  2. (可選)在連接埠設定地區,單擊新增設定容器的連接埠。

    配置項

    說明

    名稱

    設定容器連接埠名稱。

    容器連接埠

    設定暴露的容器訪問連接埠,連接埠號碼必須介於1~65535。

    協議

    支援TCP和UDP。

  3. (可選)在環境變數地區,單擊新增設定環境變數。

    支援通過索引值對的形式為Pod配置環境變數,用於給Pod添加環境標誌或傳遞配置等。更多資訊,請參見Pod Environment Variables

    配置項

    說明

    類型

    設定環境變數的類型:

    • 自訂

    • 配置項

    • 保密字典

    • 變數/變數引用

    • 資源引用

    配置項、保密字典支援全部檔案的引用。

    本樣本以保密字典為例。選擇保密字典類型,只選擇目標保密字典,則預設引用全部檔案。環境變數

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

    變數名稱

    設定環境變數名稱。

    變數/變數引用

    設定變數引用的值。

  4. (可選)在健全狀態檢查地區,根據需要開啟存活檢查就緒檢查啟動探測

    • 存活檢查(Liveness):用於檢測何時重啟容器。

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

    • 啟動探測(Startup Probes):用於檢測何時啟動容器。

    更多資訊,請參見配置存活、就緒和啟動探測器

    配置項

    配置說明

    Http請求

    向容器發送一個HTTP GET請求,支援的參數包括:

    • 協議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將嘗試在指定連接埠上開啟容器的通訊端。 如果可以建立串連,容器被認為是健康的,如果不能就認為是失敗的。支援的參數包括:

    • 連接埠:容器暴露的訪問連接埠或連接埠名,連接埠號碼必須介於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。

  5. (可選)在生命週期地區,設定容器的生命週期。

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

    配置項

    說明

    啟動執行

    為容器設定啟動前置命令和參數。

    啟動後處理

    為容器設定啟動後的命令。

    停止前處理

    為容器設定預終止命令。

  6. (可選)在資料卷地區,為容器掛載資料卷。

    • 本機存放區:配置項(ConfigMap)、保密字典(Secret)和臨時目錄,將對應的掛載源掛載到容器路徑中。更多資訊,請參見volumes

    • 雲端儲存:支援雲端硬碟、NAS等。更多資訊,請參見儲存概述

  7. (可選)在日誌配置地區,進行採集配置自訂Tag設定。

    配置項

    說明

    採集配置

    • 日誌庫:即在Log Service中產生一個對應的Logstore,用於儲存採集日誌。

    • 容器內日誌路徑:支援Stdout和文本日誌。

      • Stdout:表示採集容器的標準輸出日誌。

      • 文本日誌:表示收集容器內指定路徑的日誌本例中表示/var/log/nginx下所有的文本日誌,也支援萬用字元的方式。

    自訂Tag

    您還可以設定自訂Tag,設定Tag後,會將該Tag一起採集到容器的日誌輸出中。自訂Tag可以協助您給容器日誌打上Tag,方便進行日誌統計和過濾等分析操作。

  8. 單擊下一步,進入進階配置設定精靈頁面。

步驟三:完成進階配置

進階配置嚮導頁面中設定訪問、伸縮、調度和標籤註解。

  1. 訪問設定地區,設定暴露後端Pod的方式。

    您可以設定暴露後端Pod的方式。本例中選擇虛擬叢集IP和路由(Ingress),構建一個公網可訪問的Nginx應用。

    • 佈建服務(Service):在服務(Service)右側,單擊建立,設定建立服務配置項。

      展開查看服務配置說明

      配置項

      說明

      名稱

      輸入服務的名稱,本例為nginx-svc。

      類型

      選擇服務類型,即服務訪問的方式。本例中選擇虛擬叢集IP

      • 虛擬叢集IP:即ClusterIP,指通過叢集的內部IP暴露服務,選擇該值,服務只能夠在叢集內部訪問,這也是預設的ServiceType。

        說明

        您的服務類型為虛擬叢集IP時,方可設定執行個體間探索服務(Headless Service)

      • 負載平衡:即LoadBalancer,指阿里雲提供的負載平衡服務(SLB),可選擇公網訪問或私網訪問。阿里雲負載平衡服務可以路由到ClusterIP服務。

        • 建立SLB:您可以通過單擊修改,修改SLB規格。

        • 使用已有SLB:您可以在現有的列表中選擇SLB規格。

        說明

        負載平衡類型支援建立SLB和使用已有SLB,並且多個Kubernetes Service可以複用同一個SLB,但存在以下限制:

        • 使用已有的Server Load Balancer執行個體會強制覆蓋已有的監聽。

        • Kubernetes通過Service建立的SLB不能複用(會導致SLB被意外刪除)。只能複用您手動在控制台(或調用OpenAPI)建立的SLB。

        • 複用同一個SLB的多個Service不能有相同的前端監聽連接埠,否則會造成連接埠衝突。

        • 複用SLB時,監聽的名字以及虛擬伺服器組的名字被Kubernetes作為唯一識別碼。請勿修改監聽和虛擬伺服器組的名字。

        • 不支援跨叢集複用SLB。

      連接埠映射

      添加服務連接埠和容器連接埠。容器連接埠需要與後端的Pod中暴露的容器連接埠一致。

      外部流量策略

      • Local:流量只發給原生Pod。

      • Cluster:流量可以轉寄到其他節點上的Pod。

      說明

      當您的服務類型為負載平衡時,才能設定外部流量策略

      註解

      為該服務添加一個註解(Annotation),配置負載平衡的參數。例如設定service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20表示將該服務的頻寬峰值設定為20Mbit/s,從而控制服務的流量。

      標籤

      為該服務添加一個標籤,標識該服務。

    • 配置路由(Ingress):在路由(Ingress)右側,單擊建立設定後端Pod的路由規則。

      展開查看路由配置說明

      說明

      通過鏡像建立應用時,您僅能為一個服務建立路由(Ingress)。本例中使用一個虛擬機器主機名稱作為測試網域名稱,您需要在Hosts檔案中添加一條網域名稱映射(Ingress外部端點 + Ingress網域名稱)。在實際工作情境中,請使用備案網域名稱。

      101.37.XX.XX   foo.bar.com    #即Ingress的IP。

      配置項

      說明

      名稱

      輸入路由的名稱,本例為alb-ingress。

      規則

      路由規則是指授權入站到達叢集服務的規則。更多資訊,請參見ALB Ingress快速入門

      • 網域名稱:輸入Ingress網域名稱。

      • 路徑:指定服務訪問的URL路徑,預設為根路徑/,本例中不做配置。每個路徑(path)都關聯一個backend(服務),在阿里雲SLB將流量轉寄到backend之前,所有的入站請求都要先匹配網域名稱和路徑。

      • 服務:選擇服務的名稱和對應連接埠。

      • 開啟TLS:配置安全的路由服務。

      本例中使用測試網域名稱foo.bar.com,設定服務為nginx-svc。

      灰階發布

      開啟灰階發布開關。此處建議選擇社區版,阿里雲版灰階發布已不再維護更新。

      Ingress Class

      自訂Ingress的類。

      註解

      您可以自訂註解名稱和值,也可以根據名稱選擇或搜尋需要配置的註解。單擊添加按鈕,輸入註解名稱和值,即Ingress的Annotation索引值對。關於Ingress的註解,請參見Annotations

      標籤

      單擊+添加,輸入標籤的名稱和值,為Ingress添加對應的標籤,標識該Ingress的特點。

  2. (可選)在伸縮配置地區,配置是否開啟指標伸縮,從而滿足應用在不同負載下的需求。

    • 容器計算服務支援容器組的指標伸縮,即根據容器的CPU和記憶體資源的佔用情況自動調整容器組的數量。

      說明

      若要啟用自動調整,您必須為容器設定所需資源,否則容器自動調整無法生效。

      配置項

      說明

      指標

      支援CPU和記憶體,需要和設定的所需資源類型相同。

      觸發條件

      資源使用率的百分比,超過該使用量,容器開始擴容。

      最大副本數

      該負載類型可擴容的容器數量上限。

      最小副本數

      該負載類型可縮容的容器數量下限。

    • 容器計算服務支援容器組的定時伸縮,即定時地對容器計算服務Kubernetes叢集進行擴/縮容。開啟定時伸縮前,需要先安裝ack-kubernetes-cronhpa-controller組件。關於定時伸縮的詳細說明,請參見容器定時伸縮(CronHPA)

  1. (可選)在標籤和註解地區,單擊添加設定容器組的標籤和註解。

  2. 單擊建立

步驟四:查看應用資訊

建立成功後,預設進入建立完成頁面,單擊查看應用詳情可以跳轉到該Deployment的詳情頁面。

您也可以在無狀態頁面查看該Deployment的資訊,單擊目標Deployment的名稱或對應操作列下的詳情可以進入應用詳情頁面。

使用YAML建立

在ACS模板編排中,您需要自己定義一個應用運行所需的資來源物件,通過標籤選取器等機制,將資來源物件組合成一個完整的應用。

本例示範如何通過一個編排模板建立Nginx應用,包含一個Deployment和Service,後端Deployment會建立Pod資來源物件,Service會綁定到後端Pod上,形成一個完整的Nginx應用。

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面,單擊右上方的使用YAML建立資源

  4. 建立頁面,對模板進行相關配置,然後單擊建立

    • 樣本模板:ACS提供了多種資源類型的Kubernetes YAML樣本模板,讓您快速部署資來源物件。您可以根據Kubernetes YAML編排的格式要求自主編寫,來描述您想定義的資源類型。

    • 添加工作負載:您可以通過此功能快速定義一個YAML模板。

    • 使用已有模板:您可以將已有編排模板匯入到模板配置頁面。

    • 儲存模板:您可以儲存設定好的編排模板。

    下面是一個Nginx應用的樣本YAML。通過此樣本,可快速建立一個屬於Nginx應用的Deployment。預設建立CLB類型負載平衡。

    說明
    • ACS支援Kubernetes YAML編排,支援通過---符號將資來源物件分隔,以便通過一個模板建立多個資來源物件。

    • (可選)在應用中通過Volume方式掛載儲存卷時,預設情況下掛載目錄下的檔案在掛載後將會被覆蓋。若要不影響掛載目錄下的其他檔案,您可以配置subPath參數。

    展開查看Nginx YAML

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
        name: nginx-deployment-basic
        labels:
          app: nginx
    spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
              alibabacloud.com/compute-class: general-purpose 
              alibabacloud.com/compute-qos: default
          spec:
            containers:
            - name: nginx
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest #replace it with your exactly <image_name:tags>
              ports:
              - containerPort: 80
              volumeMounts:
              - name: nginx-config
                mountPath: /etc/nginx/nginx.conf 
                subPath: nginx.conf   #設定subPath。    
            volumes:
            - name: nginx-config
              configMap:
                name: nginx-conf
    ---
    apiVersion: v1     
    kind: Service
    metadata:
       name: my-service1        #to specify your service name
       labels:
         app: nginx
    spec:
       selector:
         app: nginx             #change label selector to match your backend pod
       ports:
       - protocol: TCP
         name: http
         port: 30080          
         targetPort: 80
       type: LoadBalancer       
    ---
    #儲存卷的配置項
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx-conf
      namespace: default
    data:
      nginx.conf: |-
       user  nginx;
       worker_processes  1;
       error_log  /var/log/nginx/error.log warn;
       pid        /var/run/nginx.pid;
       events {
            worker_connections  1024;
        }
        http {
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                              '$status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent" "$http_x_forwarded_for"';
            access_log  /var/log/nginx/access.log  main;
            sendfile        on;
            #tcp_nopush     on;
            keepalive_timeout  65;
            #gzip  on;
            include /etc/nginx/conf.d/*.conf;
        } 
  5. 單擊建立後。會提示部署狀態資訊。

kubectl

您可以通過kubectl命令建立和查看應用。

  1. 串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集在CloudShell上通過kubectl管理Kubernetes叢集

  2. 執行以下命令,啟動容器(本樣本中為Nginx Web伺服器)。

     kubectl create deployment nginx --image=registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
  3. 執行以下命令,為該容器建立一個服務入口,指定--type=LoadBalancer將會為您建立一個阿里雲負載平衡路由到該Nginx容器。

    kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
  4. 執行以下命令,列出正在啟動並執行nginx容器。

    kubectl get pod |grep nginx

    預期輸出:

    NAME                                   READY     STATUS    RESTARTS   AGE
    nginx-2721357637-d****                 1/1       Running   1          9h