部署应用

DaemonSetDeployment 是 Kubernetes 中用于管理容器化应用的两种不同的资源控制器。

  • DaemonSet 用于确保集群中的每个节点上都运行一个实例(Pod)副本。这对于在整个集群中的每个节点上运行系统级别的服务或网络代理等任务非常有用。适合用于日志收集器或监控代理。
  • Deployment 用于在集群中创建可扩展的副本集,以确保应用的高可用性。它允许你定义、更新和扩展应用的副本数量,并在发生故障时进行自动修复。当你想要确保在集群中运行指定数量的 Pod 副本,并且需要在应用版本更新时进行滚动更新时,使用 Deployment 是一个常见的选择。

deployment 部署无状态应用

创建应用实例后,Kubernetes Deployment 控制器会持续监视这些实例。 如果托管实例的节点关闭或被删除,则 Deployment 控制器会将该实例替换为集群中另一个节点上的实例。 这提供了一种自我修复机制来解决机器故障维护问题

创建nginx deployment服务模版

通过创建模版生成yaml文件

kubectl create deployment nginx --image=nginx:1.7.9 -o yaml --dry-run=client > nginx-deployment.yaml

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.7.9
        name: nginx
        resources: {}
status: {}

部署deployment

kubectl apply -f nginx-deployment.yaml

创建 nginx svc

kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort -o yaml --dry-run=client > nginx-svc.yaml

nginx-svc.yaml

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
status:
  loadBalancer: {}

部署svc

kubectl apply -f nginx-svc.yaml

Deployment 滚动更新

在 Kubernetes 中,Deployment 资源提供了一种机制,可以通过滚动更新(Rolling Updates)的方式来升级应用程序。这确保了在更新期间始终有一定数量的 Pod 处于运行状态,从而实现了应用程序的零宕机升级。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-container
        image: example/image:tag
  strategy: # 滚动更新
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1   # 最多允许一个 Pod 不可用
      maxSurge: 1          # 在更新期间最多可以多出一个 Pod

执行更新

kubectl app -f example-deployment.yaml

监视更新状态

kubectl rollout status deployment example-deployment

deployment-rollout

deployment 执行回滚

列出 deployment 的所有版本:

kubectl rollout history deployment <deployment-name>
## 例如
kubectl rollout history deployment nginx-deployment -n devops

返回参数

deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

查看指定版本的详细信息

kubectl rollout history deployment <deployment-name> --revision=1
## 例如
kubectl rollout history deployment nginx-deployment --revision=1 -n devops

回滚到指定版本

# 在 --to-revision 中指定你从步骤 1 中获取的修订版本
kubectl rollout undo deployment <deployment-name> --to-revision=<revision>
## 例如
kubectl rollout undo deployment nginx-deployment --to-revision=1 -n devops

监视 deployment 回滚进度

kubectl rollout status deployment <deployment-name>
## 例如
kubectl rollout status deployment nginx-deployment -n devops

DaemonSet 滚动更新

DaemonSet 有两种更新策略:

  • OnDelete:使用 OnDelete 更新策略时,在更新 DaemonSet 模板后,只有当你手动删除老的 DaemonSet Pod 之后,新的 DaemonSet Pod 才会被自动创建。跟 Kubernetes 1.6 以前的版本类似。
  • RollingUpdate:这是默认的更新策略。使用 RollingUpdate 更新策略时,在更新 DaemonSet 模板后, 老的 DaemonSet Pod 将被终止,并且将以受控方式自动创建新的 DaemonSet Pod。 更新期间,最多只能有 DaemonSet 的一个 Pod 运行于每个节点上。

执行滚动更新

要启用 DaemonSet 的滚动更新功能,必须设置 .spec.updateStrategy.type 为 RollingUpdate。

你可能想设置 .spec.updateStrategy.rollingUpdate.maxUnavailable(默认为 1)、 .spec.minReadySeconds(默认为 0)和 .spec.updateStrategy.rollingUpdate.maxSurge (默认为 0)。
创建带有 RollingUpdate 更新策略的 DaemonSet:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  updateStrategy: #滚动更新设置
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      # 这些容忍度设置是为了让该守护进程集在控制平面节点上运行
      # 如果你不希望自己的控制平面节点运行 Pod,可以删除它们
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        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

执行更新

kubectl app -f fluentd-elasticsearch.yaml

监视更新状态

kubectl rollout status daemonset fluentd-elasticsearch -n kube-system

daemonset 执行回滚

列出 daemonset 的所有版本:

kubectl rollout history daemonset <daemonset-name>
## 例如
kubectl rollout history daemonset nginx-daemonset -n devops

返回参数

daemonset.apps/nginx-daemonset
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

查看指定版本的详细信息

kubectl rollout history daemonset <daemonset-name> --revision=1
## 例如
kubectl rollout history daemonset nginx-daemonset --revision=1 -n devops

回滚到指定版本

# 在 --to-revision 中指定你从步骤 1 中获取的修订版本
kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
## 例如
kubectl rollout undo ddaemonset nginx-daemonset --to-revision=1 -n devops

监视 daemonset 回滚进度

kubectl rollout status daemonset <daemonset-name>
## 例如
kubectl rollout status daemonset nginx-daemonset -n devops

滚动更新到latest

kubectl rollout restart deployment nginx-deployment -n devops
kubectl rollout status deployment nginx-deployment -n devops
Last Updated:
Contributors: jobcher