Kubernetes学习笔记之Deployment实践操作

简介

Deployment 为 Pod 和 Replica Set(升级版的 Replication Controller)提供声明式更新。你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和 ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。

典型用例

1. 使用 Deployment 来创建 ReplicaSet。ReplicaSet 在后台创建 Pod。检查启动状态,看它是成功还是失败。
2. 通过更新 Deployment 的 PodTemplateSpec 字段来声明 Pod 的新状态。这会创建一个新的 ReplicaSet,Deployment 会按照控制的速率将 Pod 从旧的 ReplicaSet 移动到新的 ReplicaSet 中。
3. 如果当前状态不稳定,回滚到之前的 Deployment revision。每次回滚都会更新 Deployment 的 revision。
4. 扩容 Deployment 以满足更高的负载。
5. 暂停 Deployment 来应用 PodTemplateSpec 的多个修复,然后恢复上线。
6. 根据 Deployment 的状态判断上线是否 hang 住了。
7. 清除旧的不必要的 ReplicaSet。

试验环境

当前测试集群的信息如下,可以看到当前使用的 K8S 版本为 1.14,docker 版本为 18.9.3。

# kubectl get nodes -o wide
NAME     STATUS   ROLES    AGE     VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
test01   Ready    master   7h26m   v1.14.0   192.168.127.133   <none>        CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.9.3
test02   Ready             7h20m   v1.14.0   192.168.127.135   <none>        CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.9.3

实践操作

1. 接下来创建一个 deployment 对象,名称为 deploy-nginx,镜像使用 nginx。

# kubectl create deployment deploy-nginx --image=nginx:1.14
deployment.apps/deploy-nginx created
# kubectl get deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   1/1     1            1           14s

2. 查看刚创建的 deployment 对象的详细信息。

# kubectl describe deploy deploy-nginx
Name:                   deploy-nginx
Namespace:              default
CreationTimestamp:      Sun, 12 May 2019 21:46:14 +0800
Labels:                 app=deploy-nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=deploy-nginx
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=deploy-nginx
  Containers:
   nginx:
    Image:        nginx:1.14
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deploy-nginx-6b666c68f8 (1/1 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  4m37s  deployment-controller  Scaled up replica set deploy-nginx-6b666c68f8 to 1

3. 从上面 deployment describe 信息中可以看到默认创建了一个 pod 的副本。如果想通过 deployment 创建或者扩容多个副本以及定义更多选项,可以使用 kubectl scale 命令更改 pod 副本数量或者写 deployment 描述文件也就是 yaml 格式的文件。deployment 的 yaml 文件除了手写外,还可以通过 kubectl create deployment 命令或 kubectl get deployment 命令生成 yaml 格式的内容然后保存到文件中。命令示例分别如下:

# kubectl create deployment deploy-nginx --image=nginx:1.14 --dry-run -o=yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: deploy-nginx
  name: deploy-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deploy-nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: deploy-nginx
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        resources: {}
status: {}
# kubectl get deployment/deploy-nginx -o=yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
  creationTimestamp: "2019-05-12T13:46:14Z"
  generation: 3
  labels:
    app: deploy-nginx
  name: deploy-nginx
  namespace: default
  resourceVersion: "38468"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/deploy-nginx
  uid: 4f1fca52-74bc-11e9-aaf2-000c295ab742
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: deploy-nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: deploy-nginx
    spec:
      containers:
      - image: nginx:1.14
        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: "2019-05-12T13:46:21Z"
    lastUpdateTime: "2019-05-12T13:46:21Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2019-05-12T13:46:14Z"
    lastUpdateTime: "2019-05-12T14:08:27Z"
    message: ReplicaSet "deploy-nginx-6b666c68f8" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 3
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

4. 继续将刚创建的 deployment 对象的资源暴露为对外可提供访问的服务,服务名为 nginx-service,类型设置为 NodePort 可对集群外提供访问,target-port 是容器的端口,port 是定义访问服务的端口。

# kubectl expose deployment deploy-nginx --port=8080 --type=NodePort --target-port=80 --name=nginx-service
service/nginx-service exposed

5. 查看服务信息和端口信息。从下面的命令输出中可以看到 8080 端口和 32447 端口,其中 8080 端口就是定义的服务端口,32447 端口则监听在系统中,它是设置了 NodePort 后分配的可用端口。这里就可以使用 service ip + service port 或者 node ip + node port 来访问 pod 中容器提供的服务,区别是 service 的访问方式只能在当前集群中使用,集群外则可以使用 node 的 ip + port 来访问 pod 中容器的服务。

# kubectl get service -o wide
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE     SELECTOR
kubernetes      ClusterIP   10.1.0.1       <none>        443/TCP          7h42m   <none>
nginx-service   NodePort    10.1.156.123   <none>        8080:32447/TCP   4m25s   app=deploy-nginx
# lsof -i:32447
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
kube-prox 19540 root   11u  IPv6 984759      0t0  TCP *:32447 (LISTEN)

6. 使用上面查看到的服务地址和服务端口通过 curl 命令访问 nginx,可以看到 nginx 服务器的版本为 1.14。

# curl  -I http://10.1.156.123:8080
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 12 May 2019 13:58:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 04 Dec 2018 14:44:49 GMT
Connection: keep-alive
ETag: "5c0692e1-264"
Accept-Ranges: bytes

7. 再次确认一下,目前的 deployment 使用的镜像是 1.14。

# kubectl get deploy -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES       SELECTOR
deploy-nginx   1/1     1            1           16m   nginx        nginx:1.14   app=deploy-nginx

8. 通过 kubectl set image 命令为 deployment 更新镜像,然后再次查看更新后的 deploy 信息,可以看到 nginx 镜像从刚才的 1.14 更新到 1.15。

# kubectl set image deployment/deploy-nginx nginx=nginx:1.15
deployment.extensions/deploy-nginx image updated
# kubectl get deploy -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES       SELECTOR
deploy-nginx   1/1     1            1           17m   nginx        nginx:1.15   app=deploy-nginx

9. 更新 nginx 镜像后,deployment 会自动替换并重新生成新的 pod,访问验证能看到 nginx 版本变为 1.15。

# curl  -I  http://10.1.156.123:8080
HTTP/1.1 200 OK
Server: nginx/1.15.12
Date: Sun, 12 May 2019 14:05:16 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT
Connection: keep-alive
ETag: "5cb5d3c3-264"
Accept-Ranges: bytes

10. 使用 kubectl rollout history 命令查看 deploy-nginx 的历史版本。

# kubectl rollout history deployment/deploy-nginx 
deployment.extensions/deploy-nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

11. 查看指定历史版本的详细信息,例如选择版本 2 进行查看。

# kubectl rollout history deployment/deploy-nginx  --revision=2
deployment.extensions/deploy-nginx with revision #2
Pod Template:
  Labels:	app=deploy-nginx
	pod-template-hash=684b85cd79
  Containers:
   nginx:
    Image:	nginx:1.15
    Port:	<none>
    Host Port:	<none>
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>

12. 回滚到上一次的版本,这里可以加选项 –to-revision 来指定回滚到指定版本,如果不指定版本号,则默认就是回滚到最近上一次的版本。

# kubectl rollout undo deployment/deploy-nginx
deployment.extensions/deploy-nginx rolled back

13. 确认回滚状态,可以看到回滚成功。

# kubectl rollout status deployment/deploy-nginx
deployment "deploy-nginx" successfully rolled out

14. 再次访问验证,可以看到响应的 nginx 服务器版本变回到了 1.14,确认回滚成功

# curl  -I http://10.1.156.123:8080
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 12 May 2019 14:09:56 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 04 Dec 2018 14:44:49 GMT
Connection: keep-alive
ETag: "5c0692e1-264"
Accept-Ranges: bytes
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注