污点Taints和Deployment

POD和NODE的污点容忍度

在 Kubernetes 中,节点的污点(taints)和 Pod 的容忍度(tolerations)是控制 Pod 调度的重要机制。它们用于确保 Pod 在满足特定条件的节点上运行,或者避免在不适合的节点上运行。

1.节点的污点(Taints)

污点是附加到节点上的一组键值对,用于指示节点的一些特性或者状态。污点可以防止不符合条件的 Pod 被调度到该节点上。

语法

污点的格式为 key=value:effect,其中:

  • key:污点的键。
  • value:污点的值(可选)。
  • effect:污点的效果,可以是 NoSchedulePreferNoScheduleNoExecute

污点的类型

  1. NoSchedule:该节点不能调度新的 Pod,如果 Pod 不具有对应的容忍度。
  2. PreferNoSchedule:该节点尽量不调度新的 Pod,但如果没有其他合适的节点,也可以调度。
  3. NoExecute:该节点上已经运行的 Pod 将被驱逐,新的 Pod 不能调度到该节点上,除非 Pod 具有对应的容忍度。

示例

kubectl taint nodes node1 key=value:NoSchedule

这个命令为名为 node1 的节点添加了一个污点,表示如果 Pod 没有对应的容忍度,将不能被调度到该节点。

标记污点

kubectl taint node node1 disk-type=IDE:NoSchedule

查看污点

kubectl describe node node1 | grep Taints

删除污点

kubectl taint node node1 disk-type=IDE:NoSchedule-

在这里插入图片描述

2.Pod 的容忍度(Tolerations)

容忍度是附加到 Pod 上的一组规则,用于指示 Pod 可以容忍哪些污点。这允许 Pod 在特定污点的节点上运行。

语法

容忍度的格式如下:

tolerations:
- key: "<key>"
  operator: "<operator>"
  value: "<value>"
  effect: "<effect>"
  tolerationSeconds: <seconds>
  • key:与节点污点的键匹配。
  • operator:操作符,通常是 EqualExists
  • value:与节点污点的值匹配(可选)。
  • effect:污点的效果,可以是 NoSchedulePreferNoScheduleNoExecute
  • tolerationSeconds:适用于 NoExecute,指定 Pod 可以容忍污点的时间(秒),超时后将被驱逐(可选)。

示例

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"

在这个例子中,Pod my-pod 将容忍键为 key 且值为 value 的污点,且效果是 NoSchedule。这意味着即使节点上有这样的污点,Pod 仍然可以调度到该节点上。

3.总结

  • 节点污点(Taints):用于标记节点的特殊条件,防止不符合条件的 Pod 被调度到节点上。
  • Pod 容忍度(Tolerations):用于标记 Pod 可以容忍哪些污点,从而允许 Pod 在具有这些污点的节点上运行。

示例:

node节点污点

root@master:/opt/zxy# vim replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      nodeSelector:
        nodemaster: "yes"
      containers:
       - name: mycontainer
         image: harbor.hiuiu.com/nginx/nginx:1.21.5
         imagePullPolicy: Never
         ports:
         - containerPort: 80
      tolerations:
        - key: "disk-type"
          operator: "Equal"
          value: "IDE"
          effect: "NoSchedule"

kubectl taint node node1 disk-type=IDE:NoSchedule
kubectl taint node node2 disk-type=IDE:NoExecute
kubectl describe node node1 | grep Taints
kubectl describe node node2 | grep Taints
kubectl apply -f replicaset.yaml
kubectl get pod -o wide

在这里插入图片描述

在这里插入图片描述

Deployment

Kubernetes 的 Deployment 是一种高层次的 API 对象,用于声明式地管理 Pod 的副本、升级、回滚等操作。它为应用的部署和维护提供了强大的功能。下面是 Deployment 资源对象的详细介绍,包括其字段及其功能。

Deployment是Replicat的一个升级版本,具备动态升级和回滚功能。
Deployment是kubernetes中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源.

1.Deployment资源对象结构

Deployment 资源对象通常包括以下几个主要部分:

  1. apiVersion
  2. kind
  3. metadata
  4. spec

apiVersion

指定 API 的版本。对于 Deployment,通常使用 apps/v1

apiVersion: apps/v1

kind

指定资源的类型。对于 Deployment,这个字段的值为 Deployment

kind: Deployment

metadata

包含 Deployment 对象的元数据,如名称、命名空间、标签和注释等。

  • name: Deployment 的名称(必须唯一)。
  • namespace: Deployment 所在的命名空间(默认为 default)。
  • labels: 用于标记 Deployment 的键值对,方便后续的选择器和过滤。
  • annotations: 用于存储附加的信息和注释。
metadata:
  name: my-deployment
  namespace: default
  labels:
    app: my-app

spec

定义了 Deployment 的详细规格,包括副本数量、Pod 模板、选择器和更新策略等。

  • replicas: 指定 Pod 的副本数量。这决定了有多少个 Pod 应该同时运行。

    replicas: 3
    
  • selector: 定义一个标签选择器,用于选择和管理 Pod。

    • matchLabels: 定义要匹配的标签键值对,用于选择与 Deployment 相关的 Pod。
    selector:
      matchLabels:
        app: my-app
    
  • template: 定义 Pod 的模板。所有根据 Deployment 创建的 Pod 都会基于这个模板。

    • metadata: Pod 的标签,通常与 selector 中的标签匹配。

      metadata:
        labels:
          app: my-app
      
    • spec: Pod 的规格,包括容器配置、卷、环境变量等。

      • containers: 容器列表,定义 Pod 中的容器。
        • name: 容器的名称。
        • image: 容器的镜像。
        • ports: 容器暴露的端口。
        • env: 环境变量配置。
        • resources: 资源请求和限制。
      spec:
        containers:
        - name: my-container
          image: my-image:latest
          ports:
          - containerPort: 80
      
    • volumes: 定义 Pod 使用的卷(可选)。

      volumes:
      - name: my-volume
        emptyDir: {}
      
  • strategy: 定义滚动更新的策略。

    • type: 更新策略类型。常用的有 RollingUpdateRecreate

      strategy:
        type: RollingUpdate
      
    • rollingUpdate: 如果 typeRollingUpdate,可以指定详细的滚动更新配置。

      • maxSurge: 更新期间可以创建的额外 Pod 数量或百分比。
      • maxUnavailable: 更新期间允许不可用的 Pod 数量或百分比。
      rollingUpdate:
        maxSurge: 1
        maxUnavailable: 1
      
  • minReadySeconds: Pod 在被认为可用之前必须在 Ready 状态下等待的最小秒数(可选)。

    minReadySeconds: 10
    
  • revisionHistoryLimit: 保留的历史版本数量,默认是 10 个(可选)。

    revisionHistoryLimit: 5
    

2.Deployment 的主要功能

  1. 滚动更新(Rolling Update):允许逐步替换旧版本的 Pod,以便在不停止服务的情况下部署新的版本。
  2. 回滚(Rollback):支持回滚到先前的版本,以便在新版本出现问题时快速恢复。
  3. 副本管理(Replica Management):自动创建、删除或更新 Pod 副本以保持所需的副本数量。
  4. 声明式配置:通过 YAML 文件定义 Pod 的期望状态,Kubernetes 会自动确保实际状态符合期望。

3.常用命令

创建 Deployment

kubectl apply -f deployment.yaml

查看 Deployment 状态

kubectl get deployments
kubectl describe deployment <deployment-name>

更新 Deployment

kubectl apply -f deployment.yaml

删除 Deployment

kubectl delete deployment <deployment-name>

升级版本管理
查看升级历史

kubectl rollout history deployment/nginx-deployment

请添加图片描述

回滚到指定版本

kubectl rollout undo deployment/nginx-deployment --to-revision=5

动态缩放

kubectl scale deployment/nginx-deployment --replicas=10

锁定当前版本

kubectl rollout pause deployment/nginx-deployment

接触锁定

kubectl rollout resume deployment/nginx-deployment

示例 Deployment YAML 文件

以下是一个 Deployment 示例 YAML 文件:

查看配置

kubectl explain deployment
kubectl describe deployments.apps nginx-deployment

在这里插入图片描述
在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        ports:
        - containerPort: 80
kubectl apply -f Deployment.yaml
kubectl get pod -o wide
#查看当前命名空间下的deployment对象资源
kubectl get deployment.app
kubectl get rs        
kubectl get pod
# 查看deployment状态
kubectl rollout status deployment/nginx-deployment                

在这里插入图片描述
在这里插入图片描述

使用deployment升级pod

修改配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.22a
        ports:
        - containerPort: 80
 kubectl apply -f Deployment.yaml 

在这里插入图片描述
在这里插入图片描述

升级回滚

方法一:

kubectl set image deployment.v1.apps/nginx-deployment nginx=harbor.hiuiu.com/nginx/nginx:1.21.5

在这里插入图片描述
在这里插入图片描述

方法二:

修改配置文件

kubectl edit deployment/nginx-deployment	

在这里插入图片描述

在这里插入图片描述
定义滚动更新的策略

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-dep
spec:
  replicas: 10
  revisionHistoryLimit: 20
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        ports:
        - containerPort: 80
  strategy:
    rollingUpdate:
      maxSurge: 50%
      maxUnavailable: 50%

4.总结

Deployment 资源对象通过声明式的方法管理 Pod 的副本和生命周期,支持滚动更新、回滚以及副本管理等功能,帮助你有效地维护应用程序的稳定性和可用性。通过 Deployment,可以轻松地进行应用程序的升级、扩展和维护,确保系统的高可用性和可靠性。

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值