1.1Deployment 概述
Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得您能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集).
1.2 创建Deployment
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80
kubectl apply -f nginx-dep.yml
执行命令 kubectl get deployments` 检查 Deployment 的创建情况。
root@k8s-master ~]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx 2/2 2 2 4d23h
字段含义
字段名称 | 说明 |
---|---|
NAME | Deployment name |
DESIRED | Deployment 期望的 Pod 副本数,即 Deployment 中 .spec.replicas 字段指定的数值。该数值是“期望”值 |
CURRENT | 当前有多少个 Pod 副本数在运行 |
UP-TO-DATE | Deployment 中,符合当前 Pod Template 定义的 Pod 数量 |
AVAILABLE | 当前对用户可用的 Pod 副本数 |
AGE | Deployment 部署以来到现在的时长1.3更新Deployment |
查看 Deployment 的发布状态(rollout status)
[root@k8s-master ~]# kubectl rollout status deployment nginx deployment "nginx" successfully rolled out
1.3更新Deployment
1.执行以下命令,将容器镜像从 nginx:1.7.9 更新到 nginx:1.9.1
[root@k8s-master k8s]# kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 Flag --record has been deprecated, --record will be removed in the future deployment.apps/nginx-deployment image updated deployment.apps/nginx-deployment image updated
2.使用edit
该 Deployment,并将 .spec.template.spec.containers[0].image
从 nginx:1.7.9
修改为 nginx:1.9.1
kubectl edit deployment.v1.apps/nginx-deployment deployment.apps/nginx-deployment edited
3.查看发布更新(rollout)的状态,执行命令
[root@k8s-master k8s]# kubectl rollout status deployment.v1.apps/nginx-deployment
1.4回滚Deployment
某些情况下,您可能想要回滚(rollback)Deployment,例如:Deployment 不稳定(可能是不断地崩溃)。默认情况下,kubernetes 将保存 Deployment 的所有更新(rollout)历史。您可以设定 revision history limit 来确定保存的历史版本数量 。
假设您在更新 Deployment 的时候,犯了一个拼写错误,将 nginx:1.9.1
写成了 nginx:1.91
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true 输出结果: deployment.apps/nginx-deployment image updated
该更新将卡住,您可以执行命令 kubectl rollout status deployment.v1.apps/nginx-deployment
检查其状态,输出结果如下所示:
aiting for rollout to finish: 1 out of 3 new replicas have been updated...
执行命令 kubectl get rs
您将看到两个旧的 ReplicaSet(nginx-deployment-1564180365 and nginx-deployment-2035384211)和一个新的 ReplicaSet (nginx-deployment-3066724191) 。如下所示:
NAME DESIRED CURRENT READY AGE nginx-deployment-1564180365 3 3 3 25s nginx-deployment-2035384211 0 0 0 36s nginx-deployment-3066724191 1 1 0 6s
执行命令 kubectl get pods
,您将看到 1 个由新 ReplicaSet 创建的 Pod 卡在抓取 image 的死循环里
NAME READY STATUS RESTARTS AGE nginx-deployment-1564180365-70iae 1/1 Running 0 25s nginx-deployment-1564180365-jbqqo 1/1 Running 0 25s nginx-deployment-1564180365-hysrc 1/1 Running 0 25s nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s
检查 Deployment 的更新历史
kubectl rollout history deployment.v1.apps/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true 2 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true 3 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
执行命令 kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2
,查看 revision(版本)的详细信息,输出结果如下所示:
deployments "nginx-deployment" revision 2 Labels: app=nginx pod-template-hash=1159050644 Annotations: kubernetes.io/change-cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP QoS Tier: cpu: BestEffort memory: BestEffort Environment Variables:No volumes.
回滚到前一个 revision(版本)
执行命令 kubectl rollout undo deployment.v1.apps/nginx-deployment
将当前版本回滚到前一个版本,输出结果如下所示:
deployment.apps/nginx-deployment
或者,您也可以使用 --to-revision
选项回滚到前面的某一个指定版本,执行如下命令
kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2
输出结果如下:
deployment.apps/nginx-deployment
1.5伸缩Deployment
执行命令 kubectl scale deployment.v1.apps/nginx-deployment --replicas=10
,可以伸缩 Deployment,输出结果如下所示:
deployment.apps/nginx-deployment scaled
如果您的集群启用了自动伸缩(horizontal Pod autoscaling (opens new window)),执行以下命令,您就可以基于 CPU 的利用率在一个最大和最小的区间自动伸缩您的 Deployment
kubectl autoscale deployment.v1.apps/nginx-deployment --min=10 --max=15 --cpu-percent=80
输出结果如下所示:
deployment.apps/nginx-deployment scaled
1.6暂停和继续Deployment
执行命令 kubectl rollout pause deployment.v1.apps/nginx-deployment deployment.apps/nginx-deployment paused
执行命令 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
,更新 Deployment 的容器镜像,输出结果如下所示:
deployment.apps/nginx-deployment image updated
执行命令 kubectl rollout history deployment.v1.apps/nginx-deployment
,可查看到尚未生成新的 Deployment 版本(revision),输出结果如下所示
deployments "nginx" REVISION CHANGE-CAUSE 1
执行命令 kubectl get rs
可查看到没有新的滚动更新开始执行,输出结果如下所示
NAME DESIRED CURRENT READY AGE nginx-2142116321 3 3 3 2m
如果需要的话,您可以针对 Deployment 执行更多的修改,例如,执行命令 kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
更新其 resource 限制,输出结果如下所示:
kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi deployment.apps/nginx-deployment resource requirements updated
执行命令 kubectl describe deployment nginx-deployment
,确保 Deployment 的信息已被正确修改
最后,执行命令 kubectl rollout resume deployment.v1.apps/nginx-deployment
,继续(resume)该 Deployment,可使前面所有的变更一次性生效,输出结果如下所示:
kubectl rollout resume deployment.v1.apps/nginx-deployment deployment.apps/nginx-deployment resumed
执行命令 kubectl get rs -w
观察滚动更新的进展,输出结果如下所示:
1.7查看Deployment状态
命令:kubectl rollout status deployment.v1.apps/nginx-deployment
执行命令 :kubectl get deployment nginx-deployment -o yaml查看yaml文件
2.1statefulset
StatefulSet 顾名思义,用于管理 Stateful(有状态)的应用程序。
与 Deployment 相似,StatefulSet 基于一个 Pod 模板管理其 Pod。与 Deployment 最大的不同在于 StatefulSet 始终将一系列不变的名字分配给其 Pod。这些 Pod 从同一个模板创建,但是并不能相互替换:每个 Pod 都对应一个特有的持久化存储标识。
StatefulSet 使用场景
稳定、唯一的网络标识(dnsname) 每个Pod始终对应各自的存储路径(PersistantVolumeClaimTemplate) 按顺序地增加副本、减少副本,并在减少副本时执行清理 按顺序自动地执行滚动更新
2.2创建StatefulSet
下面是一个 StatefulSet 的例子,由如下内容组成:
一个名为 nginx 的 Headless Service (opens new window),用于控制网络域
一个名为 web 的StatefulSet,副本数为 3
volumeClaimTemplates 提供稳定的存储(每一个 Pod ID 对应自己的存储卷,且 Pod 重建后,仍然能找到对应的存储卷)
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx # has to match .spec.template.metadata.labels serviceName: "nginx" replicas: 3 # by default is 1 template: metadata: labels: app: nginx # has to match .spec.selector.matchLabels spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "my-storage-class" resources: requests: storage: 1Gi
pod的标识
StatefulSet 中的 Pod 具备一个唯一标识,该标识由以下几部分组成:
序号
稳定的网络标识
稳定的存储
该标识始终与 Pod 绑定,无论该 Pod 被调度(重新调度)到哪一个节点上。
DaemonSet 控制器确保所有(或一部分)的节点都运行了一个指定的 Pod 副本
1.每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上 2.当节点从集群中移除时,Pod 也就被垃圾回收了 3.删除一个 DaemonSet 可以清理所有由其创建的 Pod
DaemonSet 的典型使用场景有
1.在每个节点上运行集群的存储守护进程,例如 glusterd、ceph 2.在每个节点上运行日志收集守护进程,例如 fluentd、logstash 3.在每个节点上运行监控守护进程
创建DaemonSet
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-elasticsearch namespace: kube-system labels: k8s-app: fluentd-logging spec: selector: matchLabels: name: fluentd-elasticsearch template: metadata: labels: name: fluentd-elasticsearch spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd-elasticsearch image: fluent/fluentd-kubernetes-daemonset:v1.7.1-debian-syslog-1.0 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers
执行如下命令可创建该 DaemonSet:
kubectl apply -f ./daemonset.yaml
与 DaemonSet 容器组通信的模式有:
Push: DaemonSet 容器组用来向另一个服务推送信息,例如数据库的统计信息。这种情况下 DaemonSet 容器组没有客户端 NodeIP + Port: DaemonSet 容器组可以使用 hostPort,此时可通过节点的 IP 地址直接访问该容器组。客户端需要知道节点的 IP 地址,以及 DaemonSet 容器组的 端口号 DNS: 创建一个 headless service (opens new window),且该 Service 与 DaemonSet 有相同的 Pod Selector。此时,客户端可通过该 Service 的 DNS 解析到 DaemonSet 的 IP 地址 Service: 创建一个 Service,且该 Service 与 DaemonSet 有相同的 Pod Selector,客户端通过该 Service,可随机访问到某一个节点上的 DaemonSet 容器组
Kubernetes中的 Job 对象将创建一个或多个 Pod,并确保指定数量的 Pod 可以成功执行到进程正常结束:
当 Job 创建的 Pod 执行成功并正常结束时,Job 将记录成功结束的 Pod 数量
当成功结束的 Pod 达到指定的数量时,Job 将完成执行
删除 Job 对象时,将清理掉由 Job 创建的 Pod
运行一个Job的例子
apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: spec: containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never backoffLimit: 4
执行如下命令创建该对象:
kubectl apply -f https://kuboard.cn/statics/learning/job/job.yaml
执行命令查看创建结果
kubectl describe jobs/pi
执行以下命令可查看所有结束的 Pod
kubectl get pods
执行以下命令可获得该 Job 所有 Pod 的名字:
pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath='{.items[*].metadata.name}') echo $pods
输出结果如下
pi-aiw0a
CronJob 按照预定的时间计划(schedule)创建 Job。一个 CronJob 对象类似于 crontab (cron table) 文件中的一行记录。该对象根据 Cron (opens new window)格式定义的时间计划,周期性地创建 Job 对象。