Pod控制器,又称为工作负载(workload),是Kubernetes中用于实现管理Pod的中间层,它确保Pod资源符合预期的状态。当Pod资源出现故障时,Pod控制器会尝试进行重启,若根据重启策略无效,则会重新新建Pod资源。以下是Pod控制器的详细介绍:
Pod控制器代用户创建指定数量的Pod副本,并确保这些副本数量符合预期状态。
当Pod资源出现故障时,控制器会根据定义的策略重新编排Pod,确保应用的持续运行。
支持滚动式自动扩容和缩容功能,根据应用需求调整Pod数量。
对于某些控制器(如Deployment),支持应用的滚动更新和版本回退。
作用:用于保证Pod的副本数量维持在用户指定的数量。它支持Pod数量的扩缩Pod模板的更新,但不涉及应用状态的管理。
组件:主要由用户期望的Pod副本数量、标签选择器(用于判断哪个Pod归自理)和Pod资源模板组成。
特点:帮助用户管理无状态的Pod资源,精确反应用户定义的目标数量ReplicaSet不是直接使用的控制器,而是通常通过Deployment来间接管理。
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-demo
spec: # rc期望
replicas: 3 # 定义当前pod副本数量
selector: # pod选择器
app: rc-demo # 选择符合选择器标签的pod
template: # 模版
metadata:
labels:
app: rc-demo
spec: # 容器期望
containers:
- name: rc-demo-container
image: wangyanglinux/myapp:v1.0
env: #环境变量
- name: GET_HOSTS_FROM
value: dns
- name: zhangsan
value: "123"
ports:
- containerPort: 80
[root@master 5]# kubectl get rc
NAME DESIRED CURRENT READY AGE
rc-demo 3 3 3 25s
[root@master 5]# kubectl get pod
NAME READY STATUS RESTARTS AGE
rc-demo-9rw48 1/1 Running 0 21s
rc-demo-hxtj8 1/1 Running 0 21s
rc-demo-v687d 1/1 Running 0 21s
[root@master 5]# kubectl label pod rc-demo-nrkvf version=v1
pod/rc-demo-nrkvf labeled
[root@master 5]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
rc-demo-9rw48 1/1 Running 0 5m38s app=rc-demo
rc-demo-hxtj8 1/1 Running 0 5m38s app=rc-demo
rc-demo-nrkvf 1/1 Running 0 4m17s app=rc-demo,version=v1
[root@master 5]# kubectl label pod rc-demo-nrkvf app=test --overwrite
pod/rc-demo-nrkvf labeled
[root@master 5]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
rc-demo-9rw48 1/1 Running 0 6m35s app=rc-demo
rc-demo-hxtj8 1/1 Running 0 6m35s app=rc-demo
rc-demo-nrkvf 1/1 Running 0 5m14s app=test,version=v1
rc-demo-sbhb2 1/1 Running 0 9s app=rc-demo
# 调整副本数量
[root@master 5]# kubectl scale rc rc-demo --replicas=10
replicationcontroller/rc-demo scaled
[root@master 5]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
rc-demo-98w2k 1/1 Running 0 10s app=rc-demo
rc-demo-9rw48 1/1 Running 0 13m app=rc-demo
rc-demo-cdvrq 1/1 Running 0 10s app=rc-demo
rc-demo-cf42f 1/1 Running 0 10s app=rc-demo
rc-demo-dgj5p 1/1 Running 0 10s app=rc-demo
rc-demo-f2g6k 1/1 Running 0 10s app=rc-demo
rc-demo-hxtj8 1/1 Running 0 13m app=rc-demo
rc-demo-n2fp8 1/1 Running 0 10s app=rc-demo
rc-demo-nrkvf 1/1 Running 0 12m app=test,version=v1
rc-demo-nw2h9 1/1 Running 0 10s app=rc-demo
rc-demo-sbhb2 1/1 Running 0 7m2s app=rc-demo
[root@master 5]# kubectl label pod rc-demo-nrkvf app=rc-demo --overwrite
pod/rc-demo-nrkvf labeled
[root@master 5]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
rc-demo-98w2k 1/1 Running 0 41s app=rc-demo
rc-demo-9rw48 1/1 Running 0 13m app=rc-demo
rc-demo-cdvrq 1/1 Running 0 41s app=rc-demo
rc-demo-cf42f 1/1 Running 0 41s app=rc-demo
rc-demo-dgj5p 1/1 Running 0 41s app=rc-demo
rc-demo-f2g6k 1/1 Running 0 41s app=rc-demo
rc-demo-hxtj8 1/1 Running 0 13m app=rc-demo
rc-demo-n2fp8 1/1 Running 0 41s app=rc-demo
rc-demo-nrkvf 1/1 Running 0 12m app=re-demo,version=v1
rc-demo-nw2h9 1/1 Running 0 41s app=rc-demo
rc-demo-sbhb2 1/1 Running 0 7m33s app=rc-demo
ReplicaSet的匹配运算符主要包括以下几种,这些运算符用于在Pod模板的标签选择器(selector)中指定选择Pod的规则:
通过直接指定键值对来选择Pod。只有当Pod的标签与matchLabels中定义的标签完全匹配时,该Pod才会被选中。
示例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-ml-demo
spec:
replicas: 3
selector:
matchLabels: # 匹配标签
app: rs-ml-demo #matchLabels与pod标签做子集关系匹配
domian: Noziroh
template:
metadata:
labels:
app: rs-ml-demo
domian: Noziroh
version: v1
spec:
containers:
- name: rs-ml-demo-container
image: wangyanglinux/myapp:v1.0
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
[root@master 5]# kubectl get pod
NAME READY STATUS RESTARTS AGE
rc-demo-9rw48 1/1 Running 0 23m
rc-demo-hxtj8 1/1 Running 0 23m
rc-demo-nrkvf 1/1 Running 0 22m
rs-ml-demo-fm427 1/1 Running 0 20s
rs-ml-demo-kzjph 1/1 Running 0 20s
rs-ml-demo-v6nbn 1/1 Running 0 20s
提供了一种更灵活的方式来选择Pod,支持使用更复杂的逻辑条件(如AND、OR、NOT等,尽管直接通过matchExpressions实现复杂的逻辑组合需要多个表达式)。
每个matchExpressions条目可以包含key、operator和values三个字段。
key:要匹配的标签的键。
operator:比较运算符,用于定义如何匹配标签的值。常见的运算符包括In(值在列表中)、NotIn(值不在列表中)、Exists(标签存在)、DoesNotExist(标签不存在)。
values:一个值列表,当operator为In或NotIn时使用。
matchExpressions字段是一个列表,其中每个条目都定义了一个匹配条件。每个条件都由key、operator和values三个字段组成:
key:要匹配的标签的键。
operator:一个字符串,指定了与values数组中的值进行比较的运算符。常见的运算符包括:
values:一个字符串数组,当operator为In或NotIn时,用于与Pod标签的值进行比较。对于Exists和DoesNotExist运算符,该字段将被忽略。
下面是一个使用matchExpressions的ReplicaSet示例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchExpressions:
- key: app
operator: In
values:
- my-app
- key: environment
operator: NotIn
values:
- prod
template:
metadata:
labels:
app: my-app
environment: staging
spec:
containers:
- name: my-container
image: my-image:latest
在这个例子中,ReplicaSet my-replicaset 将选择所有标签为app: my-app且标签environment的值不是prod的Pod。这意味着,只有那些同时拥有app: my-app标签且environment标签的值不是prod(例如,environment: staging)的Pod才会被my-replicaset管理。
exist
示例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-exists-demo
spec:
selector:
matchExpressions:
- key: app
operator: Exists # 只要存在标签名为app即可
template:
metadata:
labels:
app: spring-k8s
spec:
containers:
- name: rs-me-exists-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80
[root@master 5]# kubectl create -f 02_rs.yaml
replicaset.apps/rs-me-exists-demo created
[root@master 5]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-me-exists-demo 1 1 1 10s
[root@master 5]# kubectl label pod rs-me-exists-demo-nhr89 app=Noziroh --overwrite
pod/rs-me-exists-demo-nhr89 labeled
rs-me-exists-demo-nhr89 1/1 Running 0 2m15s app=Noziroh
in示例
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-in-demo
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- spring-k8s
- hahahah
template:
metadata:
labels:
app: sg-k8s
spec:
containers:
- name: rs-me-in-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80
[root@master 5]# kubectl create -f 02_rs_in.yaml
The ReplicaSet "rs-me-in-demo" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"sg-k8s"}: `selector` does not match template `labels`
#app: sg-k8s 属于matchExpressions app:[spring-k8s,hahahah] 所以无法创建
#修改yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-in-demo
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- spring-k8s
- hahahah
- sg-k8s
template:
metadata:
labels:
app: sg-k8s
spec:
containers:
- name: rs-me-in-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80
[root@master 5]# kubectl create -f 02_rs_in.yaml
replicaset.apps/rs-me-in-demo created
删除rc rs 创建的pod
[root@master 5]# kubectl delete rc --all
replicationcontroller "rc-demo" deleted
[root@master 5]# kubectl delete rs --all
replicaset.apps "rs-me-exists-demo" deleted
replicaset.apps "rs-me-in-demo" deleted
replicaset.apps "rs-ml-demo" deleted
注意:
在实际使用中,matchLabels和matchExpressions可以单独使用,也可以组合使用(但通常不建议这样做,因为这可能会增加配置的复杂性并导致意外的选择结果)。
matchLabels提供了一种简单直观的方式来选择Pod,而matchExpressions则提供了更强大的灵活性和表达能力。
在定义ReplicaSet时,选择器的目的是确保ReplicaSet能够正确地识别和管理它应该负责的Pod。因此,在配置选择器时,需要确保它能够准确地匹配到目标Pod,以避免出现Pod丢失或ReplicaSet无正确管理Pod的情况。
声明式定义
使用kubectl create命令:可以直接通过命令行创建Deployment,指定容器镜像、副本数量等参数。
kubectl create deployment my-deployment --image=nginx:latest --replicas=3
这个命令会创建一个名为my-deployment的Deployment,使用nginx:latest镜像,并设置副本数量为3。
使用YAML文件:更常见的做法是先编写一个YAML文件定义Deployment,然后使用kubectl apply命令应用这个文件。
kubectl apply -f my-deployment.yaml
列出所有Deployments:
kubectl get deployments
这个命令会列出当前命名空间下的所有Deployments。
查看特定Deployment的详细信息:
kubectl describe deployment my-deployment
这个命令会显示名为my-deployment的Deployment的详细信息,包括Pod模板、副本数量、事件等。
更改副本数量:
kubectl scale deployment my-deployment --replicas=5
这个命令会将my-deployment的副本数量更改为5。
更新容器镜像:
kubectl set image deployment my-deployment my-container=nginx:1.19.2
这个命令会将my-deployment中名为my-container的容器的镜像更新为nginx:1.19.2。
滚动更新:默认情况下,通过更改Deployment的Pod模板(如镜像版本)并重新应用,Kubernetes会执行滚动更新。
回滚到上一个版本:
kubectl rollout undo deployment my-deployment
这个命令会将my-deployment回滚到上一个版本。
查看更新历史:
kubectl rollout history deployment my-deployment
这个命令会显示my-deployment的更新历史。
回滚到指定版本:
kubectl rollout undo deployment my-deployment --to-revision=N
其中N是想要回滚到的版本号(从kubectl rollout history命令中获取)。
暂停和恢复滚动更新
# 暂停滚动更新
kubectl rollout pause deployment/<deployment-name>
# 恢复滚动更新
kubectl rollout resume deployment/<deployment-name>
在Kubernetes(k8s)中,Deployment的更新策略是管理Pod版本升级和回滚的重要机制。主要的更新策略包括滚动更新(RollingUpdate)和重建(Recreate),每种策略都有其适用场景和配置方式。
滚动更新是Kubernetes Deployment的默认更新策略。在滚动更新过程中,Deployment控制器会逐步地将新版本的Pod逐个替换旧版本的Pod,从而确保在升级过程中始终有一定数量的可用Pod服务于客户端请求,实现平滑的服务过渡。
关键参数:
配置示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # 或者设置为一个整数,如 maxSurge: 1
maxUnavailable: 25% # 或者设置为一个整数,如 maxUnavailable: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2
适用场景:
滚动更新特别适用于需要确保服务持续可用的场景,如生产环境中的应用程序升级。
重建策略会在创建新Pod之前删除所有现有的Pod。这种策略会导致应用程序的短暂中断,因为在删除旧Pod和创建新Pod之间存在时间差。
配置示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
replicas: 3
strategy:
type: Recreate
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v2
适用场景:
重建策略适用于无状态应用程序或可以容忍短暂中断的应用程序,如开发环境或测试环境中的应用程序升级。
总结
在选择Deployment的更新策略时,需要根据应用程序的特性和业务需求进行权衡。滚动更新提供了更好的服务可用性和平滑的升级体验,但可能会增加系统的复杂性和资源消耗。重建策略则更简单直接,但可能会导致服务中断。在实际应用中,可以根据具体情况选择合适的更新策略,并通过调整maxSurge和maxUnavailable等参数来优化升级过程。
vi deployment-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deployment-demo
name: deployment-demo
spec:
replicas: 10
selector:
matchLabels:
app: deployment-demo
template:
metadata:
labels:
app: deployment-demo
spec:
containers:
- image: wangyanglinux/myapp:v1.0
name: deployment-demo-container
[root@master 6]# kubectl apply -f deployment-demo.yaml
deployment.apps/deployment-demo created
[root@master 6]# kubectl create svc clusterip deployment-demo --tcp=80:80
service/deployment-demo created
[root@master 6]# kubectl get deploy deployment-demo -o yaml
spec:
progressDeadlineSeconds: 600
replicas: 10
revisionHistoryLimit: 10
selector:
matchLabels:
app: deployment-demo
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
# 修改滚动更新pod滚动时的数量
# json模式更新 允许pod超过最大值1个,允许不可用pod为0
# '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":2}}}}'
[root@master 6]# kubectl patch deploy deployment-demo -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":2}}}}'
deployment.apps/deployment-demo patched
# 进行滚动更新
# '{"spec":{"template":{"spec":{"containers":[{"image":"wangyanglinux/myapp:v2.0","name":"deployment-demo-container"}]}}}}'
[root@master 6]# kubectl patch deploy deployment-demo --patch '{"spec":{"template":{"spec":{"containers":[{"image":"wangyanglinux/myapp:v2.0","name":"deployment-demo-container"}]}}}}' && kubectl rollout pause deploy deployment-demo
deployment.apps/deployment-demo patched
deployment.apps/deployment-demo paused
[root@master 6]# kubectl get pod | grep deployment |wc -l
11
[root@master 6]# kubectl describe pod deployment-demo-7dd46c6f55-l5mdl
Image: wangyanglinux/myapp:v2.0
[root@master 6]# kubectl rollout resume deploy deployment-demo
deployment.apps/deployment-demo resumed
# 回滚
[root@master 6]# kubectl rollout undo deployment/deployment-demo
deployment.apps/deployment-demo rolled back
[root@master 6]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-demo-6465d4c5c9 0 0 0 2m34s
deployment-demo-6995c75668 10 10 10 8m3s
kubectl apply 命令用于根据提供的配置文件(通常是YAML或JSON格式)来创建或更新资源。如果资源不存在,apply 会创建它;如果已存在,apply 会更新资源以匹配配置文件中的定义。
kubectl apply -f deployment.yaml
这个命令会根据deployment.yaml文件中的定义来创建或更新一个Deployment。
在Kubernetes中,并没有直接的replace命令来替换整个Deployment。但是,你可以使用kubectl replace命令来替换资源的定义,但这通常用于特定的场景,比如你需要替换整个资源对象而不是简单地更新它。
kubectl replace -f deployment.yaml --force
注意:–force选项在较新版本的kubectl中可能不是必需的,具体取决于你的Kubernetes集群版本和kubectl版本。使用replace时要小心,因为它会替换整个资源对象,而不仅仅是更新它。
kubectl apply | kubectl replace | |
---|---|---|
功能 | 创建或更新资源,使其与配置文件匹配 | 替换资源的当前配置,使其与配置文件完全匹配 |
特点 | 增量更新,幂等性,易于使用 | 全面替换,可能导致资源状态丢失,需要谨慎使用 |
适用场景 | 大多数资源更新场景 | 需要替换整个资源对象或资源状态复杂难以通过apply 更新的场景 |
测试
apiVersion: apps/v1
kind: Deployment # 类别为Deployment
metadata:
labels:
app: myapp-deploy # Deployment 标签
name: myapp-deploy # Deployment 名字
spec:
replicas: 1
selector:
matchLabels:
app: myapp-deploy # 容器标签app=myapp-deploy
template:
metadata:
labels:
app: myapp-deploy # 容器名字
spec:
containers:
- image: wangyanglinux/myapp:v1.0
name: myapp
[root@master 5]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-deploy-7977896984-gsd6m 1/1 Running 0 36s
[root@master 5]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
myapp-deploy 1/1 1 1 59s myapp wangyanglinux/myapp:v1.0 app=myapp-deploy
[root@master 5]# kubectl get deploy -o yaml
availableReplicas: 1
[root@master 5]# kubectl scale deploy myapp-deploy --replicas=10
deployment.apps/myapp-deploy scaled
[root@master 5]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
myapp-deploy 10/10 10 10 3m26s myapp wangyanglinux/myapp:v1.0 app=myapp-deploy
[root@master 5]# kubectl get deploy -o yaml
availableReplicas: 10
[root@master 5]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-7977896984-6gwzj 1/1 Running 0 101s 10.244.166.167 node1 <none> <none>
myapp-deploy-7977896984-9mmn4 1/1 Running 0 101s 10.244.104.35 node2 <none> <none>
myapp-deploy-7977896984-b47vm 1/1 Running 0 101s 10.244.166.170 node1 <none> <none>
myapp-deploy-7977896984-b6t5j 1/1 Running 0 101s 10.244.166.168 node1 <none> <none>
myapp-deploy-7977896984-gsd6m 1/1 Running 0 4m42s 10.244.104.34 node2 <none> <none>
myapp-deploy-7977896984-jbg62 1/1 Running 0 101s 10.244.166.171 node1 <none> <none>
myapp-deploy-7977896984-m2kh6 1/1 Running 0 101s 10.244.104.36 node2 <none> <none>
myapp-deploy-7977896984-r8shx 1/1 Running 0 101s 10.244.104.38 node2 <none> <none>
myapp-deploy-7977896984-rp6rz 1/1 Running 0 101s 10.244.104.37 node2 <none> <none>
myapp-deploy-7977896984-th76j 1/1 Running 0 101s 10.244.166.169 node1 <none> <none>
[root@master 5]# curl 10.244.166.167
www.xinxianghf.com | hello MyAPP | version v1.0
[root@master 5]# vim 01_deploy.yaml
- image: wangyanglinux/myapp:v2.0
[root@master 5]# kubectl apply -f 01_deploy.yaml
deployment.apps/myapp-deploy configured
[root@master 5]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
myapp-deploy 1/1 1 1 6m38s myapp wangyanglinux/myapp:v2.0 app=myapp-deploy
[root@master 5]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-58b4dc6f5-dggz9 1/1 Running 0 95s 10.244.104.39 node2 <none> <none>
[root@master 5]# curl 10.244.104.39
www.xinxianghf.com | hello MyAPP | version v2.0
[root@master 5]# vim 01_deploy.yaml
replicas: 10
- image: wangyanglinux/myapp:v3.0
[root@master 5]# kubectl replace -f 01_deploy.yaml
deployment.apps/myapp-deploy replaced
[root@master 5]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
myapp-deploy 10/10 10 10 17m myapp wangyanglinux/myapp:v3.0 app=myapp-deploy
[root@master 5]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-6fd574ffd6-287zl 1/1 Running 0 97s 10.244.104.44 node2 <none> <none>
myapp-deploy-6fd574ffd6-2rqpt 1/1 Running 0 60s 10.244.166.180 node1 <none> <none>
myapp-deploy-6fd574ffd6-987n5 1/1 Running 0 97s 10.244.104.41 node2 <none> <none>
myapp-deploy-6fd574ffd6-cmw6z 1/1 Running 0 61s 10.244.104.47 node2 <none> <none>
myapp-deploy-6fd574ffd6-g2pkf 1/1 Running 0 97s 10.244.104.42 node2 <none> <none>
myapp-deploy-6fd574ffd6-g9prr 1/1 Running 0 79s 10.244.166.178 node1 <none> <none>
myapp-deploy-6fd574ffd6-jqjbz 1/1 Running 0 72s 10.244.166.179 node1 <none> <none>
myapp-deploy-6fd574ffd6-vnzg4 1/1 Running 0 97s 10.244.166.174 node1 <none> <none>
myapp-deploy-6fd574ffd6-zlfnz 1/1 Running 0 97s 10.244.166.175 node1 <none> <none>
myapp-deploy-6fd574ffd6-zscjl 1/1 Running 0 63s 10.244.104.46 node2 <none> <none>
[root@master 5]# kubectl diff -f 01_deploy.yaml
diff -u -N /tmp/LIVE-1713354067/apps.v1.Deployment.default.myapp-deploy /tmp/MERGED-2968072580/apps.v1.Deployment.default.myapp-deploy
--- /tmp/LIVE-1713354067/apps.v1.Deployment.default.myapp-deploy 2024-08-22 23:48:21.313569984 +0800
+++ /tmp/MERGED-2968072580/apps.v1.Deployment.default.myapp-deploy 2024-08-22 23:48:21.314569996 +0800
@@ -4,7 +4,7 @@
annotations:
deployment.kubernetes.io/revision: "3"
creationTimestamp: "2024-08-22T15:29:32Z"
- generation: 4
+ generation: 5
labels:
app: myapp-deploy
name: myapp-deploy
@@ -13,7 +13,7 @@
uid: 383e54ba-ce53-4320-85d9-d72fd6abb35b
spec:
progressDeadlineSeconds: 600
- replicas: 10
+ replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
@@ -30,7 +30,7 @@
app: myapp-deploy
spec:
containers:
- - image: wangyanglinux/myapp:v3.0
+ - image: wangyanglinux/myapp:v2.0
imagePullPolicy: IfNotPresent
name: myapp
resources: {}
# deployment与rs关联升级 滚动更新
[root@master 5]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-58b4dc6f5 0 0 0 20m myapp wangyanglinux/myapp:v2.0 app=myapp-deploy,pod-template-hash=58b4dc6f5
myapp-deploy-6fd574ffd6 10 10 10 10m myapp wangyanglinux/myapp:v3.0 app=myapp-deploy,pod-template-hash=6fd574ffd6
myapp-deploy-7977896984 0 0 0 26m myapp wangyanglinux/myapp:v1.0 app=myapp-deploy,pod-template-hash=7977896984
kubectl delete 命令用于删除一个或多个资源。要删除一个Deployment,你可以使用以下命令:
kubectl delete deployment <deployment-name>
将替换为你的Deployment的名称。
在使用apply或replace时,请确保你的配置文件是最新的,以避免不必要的配置错误或资源状态不一致。
在删除Deployment之前,请确保你了解这将会删除该Deployment管理的所有Pods,并且你有适当的备份或恢划。
kubectl apply是更新资源的推荐方式,因为它可以处理资源配置的增量更新,而replace则更适合于替换整个对象。
对于复杂的应用场景,可能需要结合使用kubectl的多个命令,以及编写适当的Kubernetes配置文件,来精确你的应用部署和更新过程。
主要特点
应用场景
StatefulSet适用于需要持久化存储和唯一标识的有状态应用场景,包括但不限于:
在这些场景中,StatefulSet提供的稳定网络标识、有序部署和扩展、持久化存储等特性对于保证应用的数据一致性和高可用性至关重要。
组成部分
StatefulSet主要由以下几个部分组成:
示例
以下是一个简单的StatefulSet示例,用于部署一个具有3个副本的MySQL数据库服务:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-statefulset
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql-container
image: mysql:latest
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "standard"
resources:
requests:
storage: 1Gi
在这个示例中,StatefulSet mysql-statefulset 定义了3个MySQL Pod副本,每个Pod都挂载了一个名为mysql-storage的持久卷,用于存储数据库数据。这个持久卷通过volumeClaimTemplates自动生成,并请求了1GiB的存储空间。同时,StatefulSet还关联了一个名为mysql的Headless Service,用于提供Pod的网络标识和域名解析。
作用:确保在集群中的每个Node上都运行一个Pod的副本。它通常用于运行集群存储、日志收集等守护进程类任务。
特点:无论Node何时加入集群,DaemonSet都会确保在该Node上运行一个Pod副本(除非Node被标记为不可调度)。
DaemonSet 控制器能够确保 Kubernetes 集群中的每个节点(或选定的节点)都运行一个 Pod 的副本。当集群中增加新的节点时,DaemonSet 会自动在该节点上创建一个 Pod 副本;当节点从集群中移除时,DaemonSet 也会自动删除该节点上的 Pod。
以下是一个简单的 DaemonSet YAML 配置文件示例,用于在 Kubernetes 集群的每个节点上部署一个 Nginx Pod:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
namespace: default
spec:
selector:
matchLabels:
app: nginx-daemonset
template:
metadata:
labels:
app: nginx-daemonset
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
在创建了这个 DaemonSet 后,Kubernetes 将在每个节点上部署一个 Nginx Pod 副本。如果集群中有新的节点加入,DaemonSet 将自动在该节点上创建一个新的 Nginx Pod 副本。
作用:用于运行批处理任务,即执行一次性任务。当Pod完成其工作后,Job控制器会负责清理这些Pod。
K8s Job是Kubernetes中的一个核心概念,用于执行一次性任务或批处理作业。以下是关于K8s Job的详细解释:
以下是一个简单的Job配置文件示例:
apiVersion: batch/v1
kind: Job
metadata:
name: ubuntu-job
spec:
template:
spec:
containers:
- name: ubuntu-container
image: ubuntu
command: ["echo", "Hello, Kubernetes!"]
restartPolicy: Never
[root@master ~]# kubectl logs ubuntu-job-wlg8x
Hello, Kubernetes!
该配置文件定义了一个名为example-job的Job,它将启动一个Pod,该Pod包含一个运行echo "Hello, Kubernetes!"命令的容器。由于restartPolicy设置为Never,所以Pod在成功完成任务后不会重启。
作用:用于周期性地创建Job对象,执行定时任务。它类似于Unix中的crontab,用于安排周期性作业。
在Kubernetes(K8s)中,CronJob是一种非常有用的资源对象,它基于Cron表达式,允许用户在指定的时间间隔内自动运行容器化的任务。以下是关于K8s CronJob的详细解释:
Cron表达式由五个或六个字段组成,分别代表分钟、小时、日、月、星期几(以及可选的年份)。每个字段的取值范围不同,可以使用通配符、逗号、连字符等方式进行配置。以下是一些常见的Cron表达式示例:
以下是一个简单的CronJob配置文件示例:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cronjob
spec:
schedule: "*/1 * * * *" # 每一分钟执行一次任务
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: ubuntu
command: ["/bin/sh", "-c", "date; echo Hello from the Kubernetes cluster"]
restartPolicy: OnFailure
该配置文件定义了一个名为hello-cronjob的CronJob,它将每分钟执行一次任务,任务内容为打印当前日期和时间,并输出“Hello from the Kubernetes cluster”。
控制器是Kubernetes中用于管理一组Pod的高级对象,而Pod是Kubernetes中运行容器的最小单元。
控制器通过定义一组标签选择器来跟踪和控制具有这些标签的Pod。当Pod因故障而终止时,控制器会根据定义的规则自动创建新的Pod来替换它,从而确保应用的持续运行和所需的副本数量。
Pod控制器是由Master节点的kube-controller-manager组件提供的。它通过内部和解(reconciliation loop)机制不断地监控Kubernetes集群内资源对象的状态,以保证集群中的资源对象的状限接近于用户所期望的状态。
当资源对象状态发生变动时,API Server将状态写入etcd中,并通过水平触发机制将事件主动通知给相关的客户端程序(包括kube-controller-manager)。然后,控制器通过API Server的watch实时监控目标资源对象的变动,并在必要时执行和解操作。
综上所述,Pod控制器是Kubernetes中用于管理Pod资源的重要机制,它通过确保Pod副本数量、自动恢复、扩缩容、更新和回滚等功能,为应用的持续运行和运维自动化提供了有力支持。