如何更好的用好Deployment?本文尝试从Deployment的使用、控制器实现原理及使用规范3方面进行阐述。希望对您有所帮助!
Kubernetes Deployment 是一种高级资源对象,用于声明和管理 Pod 和 ReplicaSet。它提供了声明式更新方式,确保系统中的应用程序处于期望的状态。以下是 Kubernetes Deployment 的详细使用说明。
以下是一个简单的 Deployment 示例 YAML 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
这个 YAML 文件定义了一个名为 nginx-deployment
的 Deployment,对应三个副本的 Pod,每个 Pod 运行一个 Nginx 容器,监听 80 端口。
使用 kubectl
命令创建 Deployment:
kubectl apply -f nginx-deployment.yaml
查看 Deployment 详情:
kubectl get deployments
kubectl describe deployment nginx-deployment
查看 Pod 状态:
kubectl get pods
修改 YAML 文件,将 Nginx 镜像版本更新为 1.16.0:
spec:
template:
spec:
containers:
- name: nginx
image: nginx:1.16.0
应用更新:
kubectl apply -f nginx-deployment.yaml
查看滚动更新状态:
kubectl rollout status deployment/nginx-deployment
如果更新出现问题,可以回滚到之前的版本:
查看更新历史记录:
kubectl rollout history deployment/nginx-deployment
执行回滚:
kubectl rollout undo deployment/nginx-deployment
回滚到指定版本:
kubectl rollout undo deployment/nginx-deployment --to-revision=2
将副本数增加到 5:
kubectl scale deployment nginx-deployment --replicas=5
将副本数减少到 2:
kubectl scale deployment nginx-deployment --replicas=2
删除 Deployment 及其相关的 Pod:
kubectl delete deployment nginx-deployment
可以在 Deployment 中定义滚动更新策略,以控制更新时的行为:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
maxUnavailable
:更新过程中允许不可用的 Pod 数量或百分比。maxSurge
:更新过程中允许超出期望 Pod 数量的 Pod 数量或百分比。在 Deployment 中可以设置环境变量供容器使用:
spec:
template:
spec:
containers:
- name: nginx
image: nginx:1.14.2
env:
- name: ENVIRONMENT
value: "production"
使用持久化卷(Persistent Volume)挂载存储:
spec:
template:
spec:
containers:
- name: nginx
image: nginx:1.14.2
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-storage
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: nginx-pvc
以下是一个更完整的 Deployment 示例,包含滚动更新策略、环境变量和持久化存储:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
env:
- name: ENVIRONMENT
value: "production"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-storage
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: nginx-pvc
Kubernetes Deployment 提供了一种声明式的方法来管理应用程序的副本,支持自动滚动更新、回滚、扩展和缩减。通过合理使用 Deployment,可以实现高可用性和可扩展的应用部署管理。
理解和掌握 Kubernetes Deployment 的使用,对于高效管理和运维容器化应用至关重要。
二、Deployment控制器
Kubernetes Deployment 控制器负责管理 Pod 和 ReplicaSet,以确保应用程序始终处于用户期望的状态。它通过声明式的方式定义所需的 Pod 副本数、Pod 模板和滚动更新策略,并自动执行相应的操作来维持这种状态。以下是 Kubernetes Deployment 控制器的实现原理和逻辑示意图。
以下是 Deployment 控制器的逻辑示意图:
+-----------------------+
| User/Client |
+-----------------------+
|
v
+-----------------------+
| Kubernetes API Server|
+-----------------------+
|
v
+-------------------------------+
| Deployment Controller |
| (in Controller Manager) |
+-------------------------------+
|
v
+-------------------------------+
| ReplicaSet Controller |
+-------------------------------+
|
v
+-------------------------------+
| ReplicaSet |
+-------------------------------+
|
v
+-------------------------------+
| Pod |
+-------------------------------+
kubectl apply -f deployment.yaml
提交一个 Deployment 资源。当用户更新 Deployment 资源(例如,更新镜像版本)时,Deployment 控制器会触发滚动更新过程:
maxUnavailable
和 maxSurge
),逐步替换旧的 Pod 为新的 Pod。以下是一个包含滚动更新策略的 Deployment 示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Kubernetes Deployment 控制器通过声明式管理应用程序的副本数和版本控制,实现了自动化和高效的应用部署和更新。理解其工作原理和控制流程,有助于更好地利用 Kubernetes 进行应用的持续部署和管理。
为了在生产环境中高效和可靠地使用 Deployment,以下是一些最佳实践和使用规范。
app-name-env-deployment
,例如 nginx-prod-deployment
。app: nginx
和 env: production
标签。maxUnavailable
:定义更新过程中允许不可用的 Pod 数量或百分比。maxSurge
:定义更新过程中允许超出期望 Pod 数量的 Pod 数量或百分比。示例:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
livenessProbe
和 readinessProbe
,确保 Pod 的健康状态。livenessProbe
:用于检测并重启失败的容器。readinessProbe
:用于检测容器是否已准备好接受流量。示例:
readinessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 20
示例:
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
示例:
envFrom:
- configMapRef:
name: my-config
- secretRef:
name: my-secret
示例:
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: nginx-pvc
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-storage
示例:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
kubectl rollout undo
命令快速回滚。一个综合了以上规范的 Deployment 示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
env: production
spec:
replicas: 3
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.0
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
envFrom:
- configMapRef:
name: nginx-config
readinessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 20
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-storage
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: nginx-pvc
通过遵循以上最佳实践和使用规范,可以提高 Kubernetes Deployment 的可管理性、安全性和可靠性,确保应用程序在生产环境中的稳定运行。