POD和Deployment
POD和NODE的污点容忍度
在 Kubernetes 中,节点的污点(taints)和 Pod 的容忍度(tolerations)是控制 Pod 调度的重要机制。它们用于确保 Pod 在满足特定条件的节点上运行,或者避免在不适合的节点上运行。
1.节点的污点(Taints)
污点是附加到节点上的一组键值对,用于指示节点的一些特性或者状态。污点可以防止不符合条件的 Pod 被调度到该节点上。
语法
污点的格式为 key=value:effect
,其中:
- key:污点的键。
- value:污点的值(可选)。
- effect:污点的效果,可以是
NoSchedule
、PreferNoSchedule
或NoExecute
。
污点的类型
NoSchedule
:该节点不能调度新的 Pod,如果 Pod 不具有对应的容忍度。PreferNoSchedule
:该节点尽量不调度新的 Pod,但如果没有其他合适的节点,也可以调度。NoExecute
:该节点上已经运行的 Pod 将被驱逐,新的 Pod 不能调度到该节点上,除非 Pod 具有对应的容忍度。
示例
kubectl taint nodes node1 key=value:NoSchedule
这个命令为名为 node1
的节点添加了一个污点,表示如果 Pod 没有对应的容忍度,将不能被调度到该节点。
标记污点
kubectl taint node node01 disk-type=IDE:NoSchedule
查看污点
kubectl describe node node01 | grep Taints
删除污点
kubectl taint node node01 disk-type=IDE:NoSchedule-
2.Pod 的容忍度(Tolerations)
容忍度是附加到 Pod 上的一组规则,用于指示 Pod 可以容忍哪些污点。这允许 Pod 在特定污点的节点上运行。
语法
容忍度的格式如下:
tolerations:
- key: "<key>"
operator: "<operator>"
value: "<value>"
effect: "<effect>"
tolerationSeconds: <seconds>
- key:与节点污点的键匹配。
- operator:操作符,通常是
Equal
或Exists
。 - value:与节点污点的值匹配(可选)。
- effect:污点的效果,可以是
NoSchedule
、PreferNoSchedule
或NoExecute
。 - 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:~# 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 node01 disk-type=IDE:NoSchedule
kubectl taint node node02 disk-type=IDE:NoExecute
kubectl describe node node01 | grep Taints
kubectl describe node node02 | grep Taints
kubectl apply -f test.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
资源对象通常包括以下几个主要部分:
apiVersion
kind
metadata
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
: 更新策略类型。常用的有RollingUpdate
和Recreate
。strategy: type: RollingUpdate
-
rollingUpdate
: 这是一个RollingUpdateDeployment
类型的字段,仅在type
设置为RollingUpdate
时出现。它定义了滚动更新的配置参数。maxSurge
: 更新期间可以创建的额外 Pod 数量或百分比。maxUnavailable
: 更新期间允许不可用的 Pod 数量或百分比。
默认值:
- 如果没有指定
type
,默认使用"RollingUpdate"
策略。
rollingUpdate: maxSurge: 1 maxUnavailable: 1
-
-
minReadySeconds
: Pod 在被认为可用之前必须在 Ready 状态下等待的最小秒数(可选)。minReadySeconds: 10
-
revisionHistoryLimit
: 保留的历史版本数量,默认是 10 个(可选)。功能说明:
- 回滚: 当你更新
Deployment
的配置时,Kubernetes 会创建一个新的ReplicaSet
并逐步替换掉旧的ReplicaSet
。revisionHistoryLimit
用于控制保留多少个历史的ReplicaSet
,这样你可以在需要时将应用程序回滚到之前的版本。 - 默认值: 如果没有显式设置这个字段,Kubernetes 默认会保留 10 个历史
ReplicaSet
。 - 指针: 这个字段是一个指针,意味着可以将其设置为
0
(表示不保留任何历史ReplicaSet
),或者将其留空以使用默认值 10
revisionHistoryLimit: 5
- 回滚: 当你更新
2.Deployment 的主要功能
- 滚动更新(Rolling Update):允许逐步替换旧版本的 Pod,以便在不停止服务的情况下部署新的版本。
- 回滚(Rollback):支持回滚到先前的版本,以便在新版本出现问题时快速恢复。
- 副本管理(Replica Management):自动创建、删除或更新 Pod 副本以保持所需的副本数量。
- 声明式配置:通过 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.22a
方法二:
修改配置文件
kubectl edit deployment/nginx-deployment
方法一:
命令形式升级
kubectl set image deployment.v1.apps/nginx-deployment nginx=harbor.hiuiu.com/nginx/nginx:1.22a
方法二:
修改配置文件
kubectl edit deployment/nginx-deployment
4.总结
Deployment
资源对象通过声明式的方法管理 Pod 的副本和生命周期,支持滚动更新、回滚以及副本管理等功能,帮助你有效地维护应用程序的稳定性和可用性。通过 Deployment
,可以轻松地进行应用程序的升级、扩展和维护,确保系统的高可用性和可靠性。