K8S中的Deployment是用于管理应用程序的一种资源对象。Deployment可以定义应用程序的副本数量,并确保指定数量的副本一直在运行并可用。
Deployment通过使用ReplicaSet对象来创建和管理指定数量的Pod副本。它允许您声明所需的副本数量、容器镜像版本和其他配置选项,并根据需要自动进行滚动更新。
当您创建一个Deployment时,Kubernetes会创建一个ReplicaSet并监控其状态是否与所需副本数匹配。如果Pod的数量少于所需的副本数,Kubernetes会创建新的Pod以补充不足的副本数量。如果Pod的数量多于所需的副本数,则Kubernetes会删除多余的Pod。通过这种方式,Deployment确保应用程序的副本数量始终保持在所需的水平上。
此外,Deployment还提供了滚动更新功能,即在更新应用程序时逐步替换旧的Pod副本。这样可以确保应用程序的持续可用性,减少因更新导致的中断时间。
总之,K8S的Deployment用于简化应用程序的部署和管理,并提供了灵活的扩展和更新能力。
一:同通过deployment资源对象创建pod,了解deployment的基本语法
#通过deployment创建一个nginx的pod
#kubectl create deployment 名字 ---这个是创建deployment的基础命令 --image=nginx:1.9.1 --namespace=app --image是指定pod的镜像名称及版本号 --namespace是指定deployment创建在哪个指定的命名空间下,不指定的话默认创建在default命名空间下
[root@k8s-master1 ~]# kubectl create deployment tomcat-deployment --image=nginx:1.9.1 --namespace=app
deployment.apps/tomcat-deployment created
[root@k8s-master1 ~]# kubectl get pods -n app -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-deployment-76cdf747f5-phjbj 1/1 Running 0 49s 10.10.135.211 k8s-master3 <none> <none>
#查看某个命名空间下的所有的deployment
[root@k8s-master1 ~]# kubectl get deployment -n app
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat-deployment 1/1 1 1 4m24s
#查看deployment的详细信息
[root@k8s-master1 ~]# kubectl describe deployment tomcat-deployment -n app
Name: tomcat-deployment
Namespace: app
CreationTimestamp: Wed, 29 Nov 2023 20:45:05 +0800
Labels: app=tomcat-deployment
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=tomcat-deployment
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=tomcat-deployment
Containers:
nginx:
Image: nginx:1.9.1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: tomcat-deployment-76cdf747f5 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 5m24s deployment-controller Scaled up replica set tomcat-deployment-76cdf747f5 to 1
#用来获取 Kubernetes 集群中指定名称的 Deployment 对象的详细信息,并以 YAML 格式输出
[root@k8s-master1 ~]# kubectl get deployment tomcat-deployment -n app -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2023-11-29T12:45:05Z"
generation: 1
labels:
app: tomcat-deployment
name: tomcat-deployment
namespace: app
resourceVersion: "399220"
uid: 084d01f0-3a19-43e8-a000-c286657cd9ae
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: tomcat-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: tomcat-deployment
spec:
containers:
- image: nginx:1.9.1
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2023-11-29T12:45:07Z"
lastUpdateTime: "2023-11-29T12:45:07Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2023-11-29T12:45:05Z"
lastUpdateTime: "2023-11-29T12:45:07Z"
message: ReplicaSet "tomcat-deployment-76cdf747f5" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 1
replicas: 1
updatedReplicas: 1
二:Deployment弹性伸缩
[root@k8s-master1 ~]# kubectl get deployment -n app
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat-deployment 1/1 1 1 8m32s
# kubectl scale deployment name replicas=2(扩容的个数)
[root@k8s-master1 ~]# kubectl scale deployment tomcat-deployment --replicas=2 -n app
deployment.apps/tomcat-deployment scaled
[root@k8s-master1 ~]# kubectl get deployment -n app
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat-deployment 2/2 2 2 10m
[root@k8s-master1 ~]# kubectl get pods -n app -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-deployment-76cdf747f5-pbcjq 1/1 Running 0 55s 10.10.36.85 k8s-node1 <none> <none>
tomcat-deployment-76cdf747f5-phjbj 1/1 Running 0 10m 10.10.135.211 k8s-master3 <none> <none>
#除了kubectl scale deployment这个命令可以弹性伸缩容器的个数以外,咱们还可以通过编辑deployment文件来修改
kubectl edit deployment tomcat-deployment -n app
replicas: 2 #编辑deployment文件中的replicas参数的个数即可
``
三:Deployment升级软件版本
```bash
#kubectl rollout history deployment 是一个用于查看特定部署的历史记录的命令,当前nginx-deployment这个deployment的历史纪录就一次
[root@k8s-master1 ~]# kubectl rollout history deployment nginx-deployment -n app
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
#当前容器的nginx镜像是1.9.1版本的,咱们修改一下
[root@k8s-master1 ~]# kubectl describe deployment nginx-deployment -n app |grep Image
Image: nginx:1.9.1
[root@k8s-master1 ~]# kubectl edit deployment nginx-deployment -n app
deployment.apps/nginx-deployment edited
You have new mail in /var/spool/mail/root
#容器的deployment发生变更时,容器会分批重启变更
[root@k8s-master1 ~]# kubectl get pods -n app
NAME READY STATUS RESTARTS AGE
nginx-deployment-5db98cdb94-lfnz2 0/1 ContainerCreating 0 7s
nginx-deployment-6c4c55bc9-csdl5 1/1 Running 0 4m39s
nginx-deployment-6c4c55bc9-z6kl9 1/1 Running 0 5m37s
#现在查看部署的历史记录就变成两个了
[root@k8s-master1 ~]# kubectl rollout history deployment nginx-deployment -n app
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
#容器的进行概念股版本号变成1.9.2
[root@k8s-master1 ~]# kubectl describe deployment nginx-deployment -n app |grep Image
Image: nginx:1.9.2
#查看名为nginx-deployment的部署从版本1开始的更新历史记录
[root@k8s-master1 ~]# kubectl rollout history deployment nginx-deployment --revision=1 -n app
deployment.apps/nginx-deployment with revision #1
Pod Template:
Labels: app=nginx-deployment
pod-template-hash=6c4c55bc9
Containers:
nginx:
Image: nginx:1.9.1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
#kubectl rollout undo deployment nginx-deployment --to-revision=1 将名为nginx-deployment的部署回滚到版本1
[root@k8s-master1 ~]# kubectl rollout undo deployment nginx-deployment --to-revision=1 -n app
deployment.apps/nginx-deployment rolled back
[root@k8s-master1 ~]# kubectl get pods -n app
NAME READY STATUS RESTARTS AGE
nginx-deployment-6c4c55bc9-fnl7k 1/1 Running 0 6s
nginx-deployment-6c4c55bc9-nkk6c 1/1 Running 0 4s
[root@k8s-master1 ~]# kubectl describe deployment nginx-deployment -n app |grep Image
Image: nginx:1.9.1
[root@k8s-master1 ~]#