容器計算服務 ACS(Container Compute Service)支持通過容器鏡像、編排YAML模板和kubectl命令行的方式創建無狀態應用。本文以Nginx應用為例,介紹如何在ACS集群中創建無狀態應用。
控制臺
使用鏡像創建
步驟一:配置應用基本信息
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇
。在無狀態頁面,單擊使用鏡像創建。
在應用基本信息配置向導中,設置應用的基本信息。
配置項
說明
應用名稱
輸入應用的名稱。
副本數量
應用包含的Pod數量,默認數量為2。
工作負載
選擇無狀態(Deployment)。
標簽
為該應用添加一個標簽,標識該應用。
注解
為該應用添加一個注解(Annotation)。
實例類型
選擇實例類型。關于實例類型的說明,請參見ACS Pod實例概述。
QoS類型
選擇QoS類型。更多信息,請參見算力質量定義。
通用型實例支持default和best-effort。
性能型實例僅支持default。
單擊下一步,進入容器配置向導頁面。
步驟二:配置容器
在容器配置向導頁面中,配置容器的鏡像、資源、端口、環境變量、健康檢查、生命周期、數據卷和日志等信息。
在容器1頁簽右側,單擊添加容器,可以為應用的Pod設置多個容器。
在基本配置區域,完成容器的基本配置。
配置項
說明
鏡像名稱
選擇鏡像
單擊選擇鏡像,選擇所需的鏡像。
容器鏡像服務企業版:可以選擇托管在容器鏡像服務ACR中的企業版鏡像。需要選擇鏡像所屬地域,以及鏡像服務實例。關于ACR的更多信息,請參見什么是容器鏡像服務ACR。
容器鏡像服務個人版(需要提前開通):可以選擇托管在容器鏡像服務ACR中的個人版鏡像。需要選擇鏡像所屬地域,以及鏡像服務實例。
制品中心:包含應用容器化基礎OS鏡像、基礎語言鏡像、AI/大數據相關鏡像,本示例以制品中心的Nginx鏡像為例說明。關于制品中心的更多信息,請參見制品中心。
(可選)設置鏡像拉取策略
在鏡像拉取策略的下拉列表中選擇鏡像拉取策略。默認情況下不設置,采用Kubernetes默認的IfNotPresent。
優先使用本地鏡像(IfNotPresent):如果本地已經存在該鏡像(之前拉取過該鏡像至宿主機中),則不會再次拉取,如果本地不存在該鏡像,則會拉取該鏡像。
總是拉取鏡像(Always):表示每次部署或擴容都會重新拉取鏡像,而不會使用本地鏡像。
僅使用本地鏡像(Never):僅使用本地鏡像。
(可選)設置鏡像密鑰
單擊設置鏡像密鑰,為私有鏡像設置密鑰以確保安全。
所需資源
為容器設置資源額度。
容器啟動項
(可選)設置容器啟動項。
stdin:將控制臺輸入發送到容器。
tty:將標準輸入控制臺作為容器的控制臺輸入。
說明通常會同時選中stdin和tty,表示將終端(tty)綁定到容器的標準輸入(stdin)上。例如,一個交互式的程序從用戶獲取標準輸入,并顯示到終端中。
初始化容器
(可選)選擇該選項,表示創建一個初始化容器。
初始化容器提供了一種機制來阻塞或延遲應用容器的啟動,初始化容器執行成功后,Pod內的應用容器會并行啟動。例如,檢測依賴服務的可用性。初始化容器可以包括一些應用鏡像中不存在的實用工具和安裝腳本,用來初始化應用容器的運行環境,例如設置內核參數、生成配置文件。更多信息,請參見Init Container。
(可選)在端口設置區域,單擊新增設置容器的端口。
配置項
說明
名稱
設置容器端口名稱。
容器端口
設置暴露的容器訪問端口,端口號必須介于1~65535。
協議
支持TCP和UDP。
(可選)在環境變量區域,單擊新增設置環境變量。
支持通過鍵值對的形式為Pod配置環境變量,用于給Pod添加環境標志或傳遞配置等。更多信息,請參見Pod Environment Variables。
配置項
說明
類型
設置環境變量的類型:
自定義
配置項
保密字典
變量/變量引用
資源引用
配置項、保密字典支持全部文件的引用。
本示例以保密字典為例。選擇保密字典類型,只選擇目標保密字典,則默認引用全部文件。
對應的YAML,也引用了整個密鑰(Secret)。
變量名稱
設置環境變量名稱。
變量/變量引用
設置變量引用的值。
(可選)在健康檢查區域,根據需要開啟存活檢查、就緒檢查及啟動探測。
存活檢查(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。
(可選)在生命周期區域,設置容器的生命周期。
您可以為容器的生命周期配置啟動執行、啟動后處理和停止前處理。具體操作,請參見配置生命周期。
配置項
說明
啟動執行
為容器設置預啟動命令和參數。
啟動后處理
為容器設置啟動后的命令。
停止前處理
為容器設置預終止命令。
(可選)在數據卷區域,為容器掛載數據卷。
(可選)在日志配置區域,進行采集配置和自定義Tag設置。
配置項
說明
采集配置
日志庫:即在日志服務中生成一個對應的Logstore,用于存儲采集日志。
容器內日志路徑:支持Stdout和文本日志。
Stdout:表示采集容器的標準輸出日志。
文本日志:表示收集容器內指定路徑的日志本例中表示
/var/log/nginx
下所有的文本日志,也支持通配符的方式。
自定義Tag
您還可以設置自定義Tag,設置Tag后,會將該Tag一起采集到容器的日志輸出中。自定義Tag可以幫助您給容器日志打上Tag,方便進行日志統計和過濾等分析操作。
單擊下一步,進入高級配置配置向導頁面。
步驟三:完成高級配置
在高級配置向導頁面中設置訪問、伸縮、調度和標簽注解。
在訪問設置區域,設置暴露后端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,但存在以下限制:
使用已有的負載均衡實例會強制覆蓋已有的監聽。
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的特點。
(可選)在伸縮配置區域,配置是否開啟指標伸縮,從而滿足應用在不同負載下的需求。
容器計算服務支持容器組的指標伸縮,即根據容器的CPU和內存資源的占用情況自動調整容器組的數量。
說明若要啟用自動伸縮,您必須為容器設置所需資源,否則容器自動伸縮無法生效。
配置項
說明
指標
支持CPU和內存,需要和設置的所需資源類型相同。
觸發條件
資源使用率的百分比,超過該使用量,容器開始擴容。
最大副本數
該負載類型可擴容的容器數量上限。
最小副本數
該負載類型可縮容的容器數量下限。
容器計算服務支持容器組的定時伸縮,即定時地對容器計算服務Kubernetes集群進行擴/縮容。開啟定時伸縮前,需要先安裝ack-kubernetes-cronhpa-controller組件。關于定時伸縮的詳細說明,請參見容器定時伸縮(CronHPA)。
(可選)在標簽和注解區域,單擊添加設置容器組的標簽和注解。
單擊創建。
步驟四:查看應用信息
創建成功后,默認進入創建完成頁面,單擊查看應用詳情可以跳轉到該Deployment的詳情頁面。
您也可以在無狀態頁面查看該Deployment的信息,單擊目標Deployment的名稱或對應操作列下的詳情可以進入應用詳情頁面。
使用YAML創建
在ACS模板編排中,您需要自己定義一個應用運行所需的資源對象,通過標簽選擇器等機制,將資源對象組合成一個完整的應用。
本例演示如何通過一個編排模板創建Nginx應用,包含一個Deployment和Service,后端Deployment會創建Pod資源對象,Service會綁定到后端Pod上,形成一個完整的Nginx應用。
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇
。在無狀態頁面,單擊右上角的使用YAML創建資源。
在創建頁面,對模板進行相關配置,然后單擊創建。
示例模板:ACS提供了多種資源類型的Kubernetes YAML示例模板,讓您快速部署資源對象。您可以根據Kubernetes YAML編排的格式要求自主編寫,來描述您想定義的資源類型。
添加工作負載:您可以通過此功能快速定義一個YAML模板。
使用已有模板:您可以將已有編排模板導入到模板配置頁面。
保存模板:您可以保存設置好的編排模板。
下面是一個Nginx應用的示例YAML。通過此示例,可快速創建一個屬于Nginx應用的Deployment。默認創建CLB類型負載均衡。
說明ACS支持Kubernetes YAML編排,支持通過
---
符號將資源對象分隔,以便通過一個模板創建多個資源對象。(可選)在應用中通過Volume方式掛載存儲卷時,默認情況下掛載目錄下的文件在掛載后將會被覆蓋。若要不影響掛載目錄下的其他文件,您可以配置
subPath
參數。
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; }
單擊創建后。會提示部署狀態信息。
kubectl
您可以通過kubectl命令創建和查看應用。
連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群或在CloudShell上通過kubectl管理Kubernetes集群。
執行以下命令,啟動容器(本示例中為Nginx Web服務器)。
kubectl create deployment nginx --image=registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
執行以下命令,為該容器創建一個服務入口,指定
--type=LoadBalancer
將會為您創建一個阿里云負載均衡路由到該Nginx容器。kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
執行以下命令,列出正在運行的nginx容器。
kubectl get pod |grep nginx
預期輸出:
NAME READY STATUS RESTARTS AGE nginx-2721357637-d**** 1/1 Running 1 9h