Deployment是Kubernetes中最常使用的工作负载类型之一,也被称为“无状态工作负载”,它的目标是保证集群中始终有固定数量的Pod以您指定的状态持续运行。本文介绍如何在ACK集群中通过控制台及kubectl创建无状态应用。
阅读前提示
在创建工作负载前,建议您阅读工作负载,了解工作负载的基础知识和注意事项。本文主要分为以下两部分内容:
创建Deployment:提供控制台和kubectl两种创建方式的快速创建流程。
配置项说明:提供控制台配置项的相关文档以及使用kubectl时的YAML示例。
创建Deployment
通过控制台创建
以下是一个简化的工作负载创建流程。您可以参考该流程快速部署并验证工作负载。熟悉基本操作后,您可以参考配置项说明自定义您的工作负载。
配置应用基本信息
登录容器服务管理控制,在左侧导航栏选择集群列表。在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。在无状态页面,单击使用镜像创建。
在应用基本信息配置向导页面,设置应用的基本信息。然后单击下一步,进入容器配置向导页面。
配置容器
在容器配置区域,完成容器的镜像名称和端口基本配置。其余设置均为可选设置,保持默认即可。然后单击下一步,进入高级配置向导页面。镜像地址如下所示。
重要拉取此镜像前,您需要为集群开启公网访问能力。如果您在创建集群时,为专有网络配置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,使用负载均衡实例对外暴露工作负载。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异常问题排查。