Deployment 是什么?
Deployment 为 Pod 和 Replica Set(下一代 Replication Controller)提供声明式更新。你只需要在 Deployment 中描述你想要的目标状态是什么,Deployment controller 就会帮你将 Pod Replica Set 的实际状态改变到你的目标状态。你可以定义一个全新的Deployment,也可以创建一个新的替换旧的 Deployment。
一个典型的用例如下:
- 使用 Deployment 来创建 ReplicaSet。ReplicaSet 在后台创建 pod。检查启动状态,看它是成功还是失败。
- 然后,通过更新 Deployment 的 PodTemplateSpec 字段来声明 Pod 的新状态。这会创建一个新的 ReplicaSet,Deployment 会按照控制的速率将 pod 从旧的ReplicaSet 移动到新的 ReplicaSet 中。
- 如果当前状态不稳定,回滚到之前的 Deployment revision。每次回滚都会更新Deployment 的 revision。扩容 Deployment 以满足更高的负载。
- 暂停 Deployment 来应用 PodTemplateSpec 的多个修复,然后恢复上线。
- 根据 Deployment 的状态判断上线是否 hang 住了。
- 清除旧的不必要的 ReplicaSet。
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义 (declarative) 方法,用来替代以前的 ReplicationController 来方便的管理应用。
简单的Nginx.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 #3个副本
template:
metadata:
lables:
app: nginx
spec:
containers:
- name: nginx
image:nginx:1.8
ports:
- containerPort: 80
扩容、修改副本数量:
kubectl scale deployment nginx-deployment --replicas 10
如果集群支持 horizontal pod autoscaling 的话,还可以为 Deployment 设置自动扩展:
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu
-percent=80
更新镜像:
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
回滚:
kubectl rollout undo deployment/nginx-deployment
创建Deployment示例:
kubectl create -f tomcat-deployment.yaml --record #创建deployment
deployment "nginx-deployment" created
[root@master yaml]# kubectl get deployments #查看详情
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
myapp-deploy 2 2 2 2 17d
tomcat-deploy 2 2 2 2 17d
将 kubectl 的 —record 的 flag 设置为 true 可以在 annotation 中记录当前命令创建或者升级了该资源。这在未来会很有用,例如,查看在每个 Deployment revision 中执行了哪些命令。
[root@master yaml]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-deploy-55c6785644-57t85 1/1 Running 0 17d app=myapp,pod-template-hash=1172341200,release=canary
myapp-deploy-55c6785644-rn7x6 1/1 Running 0 17d app=myapp,pod-template-hash=1172341200,release=canary
mytomcat 1/1 Running 2 98d name=mytomcat
nginx-pod 1/1 Running 0 3d app=nginx
tomcat-deploy-58488bcdcd-9xbgz 1/1 Running 0 17d app=tomcat,pod-template-hash=1404467878,release=canary
tomcat-deploy-58488bcdcd-gnm84 1/1 Running 0 17d app=tomcat,pod-template-hash=1404467878,release=canary
webapp-f8h5v 1/1 Running 2 104d app=webapp
webapp-flpqz 1/1 Running 2 96d app=webapp
注意: 你必须在 Deployment 中的 selector 指定正确 pod template label(在该示例中是 app = myapp ),不要跟其他的 controller 搞混了(包括 Deployment、ReplicaSet、Replication Controller 等)。Kubernetes 本身不会阻止你这么做 ,如果你真的这么做了,这些 controller 之间会相互打架,并可能导致不正确的行为。
[root@master yaml]# kubectl describe deployments
Name: myapp-deploy
Namespace: default
CreationTimestamp: Mon, 02 Aug 2021 07:36:29 +0000
Labels: app=myapp
release=canary
Annotations: deployment.kubernetes.io/revision=1
kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"myapp-deploy","namespace":"default"},"spec":{"replicas":2,"selector":{...
Selector: app=myapp,release=canary
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=myapp
release=canary
Containers:
myapp:
Image: ikubernetes/myapp:v2
Port: 80/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: myapp-deploy-55c6785644 (2/2 replicas created)
Events: <none>
Name: tomcat-deploy
Namespace: default
CreationTimestamp: Mon, 02 Aug 2021 07:49:00 +0000
Labels: app=tomcat
release=canary
Annotations: deployment.kubernetes.io/revision=1
kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"tomcat-deploy","namespace":"default"},"spec":{"replicas":2,"selector":...
Selector: app=tomcat,release=canary
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=tomcat
release=canary
Containers:
tomcat:
Image: tomcat:7-alpine
Ports: 8080/TCP, 8009/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: tomcat-deploy-58488bcdcd (2/2 replicas created)
Events: <none>
[root@master yaml]# kubectl describe myapp
the server doesn't have a resource type "myapp"
[root@master yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-55c6785644 2 2 2 17d
tomcat-deploy-58488bcdcd 2 2 2 17d
[root@master yaml]# kubectl describe myapp-deploy
the server doesn't have a resource type "myapp-deploy"
[root@master yaml]# kubectl describe deployments
Name: myapp-deploy
Namespace: default
CreationTimestamp: Mon, 02 Aug 2021 07:36:29 +0000
Labels: app=myapp
release=canary
Annotations: deployment.kubernetes.io/revision=1
kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"myapp-deploy","namespace":"default"},"spec":{"replicas":2,"selector":{...
Selector: app=myapp,release=canary
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=myapp
release=canary
Containers:
myapp:
Image: ikubernetes/myapp:v2
Port: 80/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: myapp-deploy-55c6785644 (2/2 replicas created)
Events: <none>
Name: tomcat-deploy
Namespace: default
CreationTimestamp: Mon, 02 Aug 2021 07:49:00 +0000
Labels: app=tomcat
release=canary
Annotations: deployment.kubernetes.io/revision=1
kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"tomcat-deploy","namespace":"default"},"spec":{"replicas":2,"selector":...
Selector: app=tomcat,release=canary
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=tomcat
release=canary
Containers:
tomcat:
Image: tomcat:7-alpine
Ports: 8080/TCP, 8009/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: tomcat-deploy-58488bcdcd (2/2 replicas created)
Events: <none>