Deployment是Kubernetes中最常使用的工作負載類型之一,也被稱為“無狀態工作負載”,它的目標是保證叢集中始終有固定數量的Pod以您指定的狀態持續運行。本文介紹如何在ACK叢集中通過控制台及kubectl建立無狀態應用。
閱讀前提示
在建立工作負載前,建議您閱讀工作負載,瞭解工作負載的基礎知識和注意事項。本文主要分為以下兩部分內容:
建立Deployment:提供控制台和kubectl兩種建立方式的快速建立流程。
配置項說明:提供控制台配置項的相關文檔以及使用kubectl時的YAML樣本。
建立Deployment
通過控制台建立
以下是一個簡化的工作負載建立流程。您可以參考該流程快速部署並驗證工作負載。熟悉基本操作後,您可以參考配置項說明自訂您的工作負載。
配置應用基本資料
登入Container Service管理控制,在左側導覽列選擇叢集列表。在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。在無狀態頁面,單擊使用鏡像建立。
在應用基本資料設定精靈頁面,設定應用的基本資料。然後單擊下一步,進入容器配置嚮導頁面。
配置容器
在容器配置地區,完成容器的鏡像名稱和連接埠基本配置。其餘設定均為可選設定,保持預設即可。然後單擊下一步,進入進階配置嚮導頁面。鏡像地址如下所示。
重要拉取此鏡像前,您需要為叢集開啟公網訪問能力。如果您在建立叢集時,為專用網路配置SNAT選擇保持預設勾選,則叢集已擁有公網訪問能力。如果未選擇,請參見為已有叢集開啟公網訪問能力。
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
完成進階配置
在進階配置嚮導頁面中設定訪問、伸縮、調度和標籤註解。在訪問設定地區,設定暴露後端Pod的方式,單擊確定,然後單擊最下方的建立。
重要此步驟會建立一個LoadBalancer類型的Service用於暴露工作負載,其使用的CLB執行個體會產生一定的費用,詳細計費項目請參見隨用隨付。如果您後續不計劃使用此CLB,請及時釋放。
查看應用
在建立完成設定精靈頁面中查看應用任務。在建立應用任務已提交面板,單擊查看應用詳情。單擊訪問方式頁簽,找到新建立的服務(即nginx-test-svc),單擊外部端點列的連結即可訪問。
您可通過控制台對已建立的工作負載進行查看、編輯、重新部署等操作。
通過kubectl建立
建立工作負載前,請確保已通過kubectl串連到叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
執行以下命令建立工作負載。以下命令指定了容器鏡像,而其他配置保持預設。
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
執行以下命令,建立一個
LoadBalancer
類型的Service,使用Server Load Balancer執行個體對外暴露工作負載。kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
執行以下命令,查看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
在瀏覽器中輸入nginx的公網IP(
106.14.**.***
),即可訪問工作負載所屬的Nginx容器。
配置項說明
控制台配置項說明
應用基本資料
配置項 | 說明 |
應用程式名稱 | 工作負載的名稱,工作負載所屬的Pod的名稱會以此產生。 |
副本數量 | 工作負載包含的Pod數量,預設數量為2。 |
類型 | 工作負載的類型,本文中選擇無狀態(Deployment)。工作負載的選型請參見建立工作負載。 |
標籤 | 工作負載的標籤。 |
註解 | 工作負載的註解(Annotation)。 |
時區同步 | 容器與所在節點是否使用相同的時區。 |
容器配置
進階配置
配置卡片 | 配置項 | 說明 |
訪問設定 | 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的機制。
|
| 親和性、反親和性、容忍等配置用於調度,即使Pod運行在特定節點上。調度的操作較為複雜,需要您提前按照需求進行規劃。詳細操作,請參見調度。 | |
標籤和註解 | Pod標籤 | 為該工作負載所屬的每個Pod添加標籤(Label)。叢集中包括工作負載、Service在內的各種資源會通過標籤與Pod進行匹配。ACK為Pod預設添加格式為 |
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 名稱
相關文檔
對於資料庫等需要使用穩定的持久化儲存的應用,請使用StatefulSet。具體操作,請參見建立有狀態工作負載StatefulSet。
若建立工作負載時出現問題,請參見工作負載FAQ。
若Pod出現異常問題,請參見Pod異常問題排查。