控制器
在Kubernetes(通常简称为K8s)中,控制器(Controller)是一个核心概念,它负责管理和维护集群中的资源,确保这些资源的状态与用户定义的期望状态保持一致。控制器是Kubernetes系统中负责管理和维护应用程序的关键组件之一。
控制器通过监控整个集群的状态,并根据用户定义的期望状态来进行调整和修复。具体来说,控制器的作用包括以下几个方面:
- 资源管理:控制器负责管理Kubernetes集群中的各种资源,如Pod、ReplicaSet、Deployment等,确保这些资源的状态与用户定义的期望状态保持一致。
- 自动伸缩:控制器可以根据资源使用情况进行自动伸缩,以确保应用程序具有适当的资源量,同时最大限度地提高资源利用率。
- 故障恢复:当集群中的某个组件或资源发生故障时,控制器可以自动进行恢复操作,例如重新启动Pod、替换故障节点等,以保持应用程序的可用性。
- 版本控制:控制器可以管理应用程序的版本,确保在升级或回滚过程中应用程序的稳定性和一致性。
在Kubernetes中,存在多种类型的控制器,每种控制器都有其特定的用途和特征。例如,ReplicationController、ReplicaSet和Deployment控制器用于确保在任意时间运行Pod指定的副本数量,并支持滚动更新和回滚。DaemonSet控制器则确保集群内全部(或部分)node节点上都分配一个Pod,如果新加node节点,也会自动再分配对应的Pod。
此外,Kubernetes的控制器可以是被动或主动的。主动控制器会自行实施必要的行动,而被动控制器会将更改传达给其他组件或集群API服务器。由于控制器的角色是有意抽象的,因此除了对特定对象的监视之外,它们没有其他通用功能。
总的来说,Kubernetes中的控制器是实现自动化控制循环功能的一种模式,它们通过监控集群的状态并根据用户定义的期望状态来进行调整和修复,以确保应用程序的稳定性和可用性。
控制器类型
- ReplicationController(RC) ReplicaSet(RS)
- Deployment
- DaemonSet
- StatFulSet
- Job/CronJob
- Horizontal Pod Autoscaling(HPA)
RC RS Deployment
RC主要作用就是确保容器应用的副本数始终保持在用户定义的副本数。如果有容器异常退出,会自动创新新Pod;如果异常多出来的Pod也会自动回收
K8S建议使用RS代替RC,两者功能基本一致,但是RS支持集合式的selector。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-demo
namespace: default
spec:
replicas: 3
selector:
matchLabels:
tier: demo
template:
metadata:
labels:
tier: demo
spec:
containers:
- name: pod-demo
image: busybox
command: ["/bin/sh", "-c", "sleep 3600"]
Pod资源嵌套在template中,相应的在Pod中定义的InitC,探针等都可以在其中定义。修改后的资源清单如下
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-demo
namespace: default
spec:
replicas: 3
selector:
matchLabels:
tier: demo
template:
metadata:
labels:
tier: demo
spec:
containers:
- name: pod-demo
image: busybox
command: ["/bin/sh", "-c", "sleep 3600"]
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "wget 10.0.0.115:5000/start"]
preStop:
exec:
command: ["/bin/sh", "-c", "wget 10.0.0.115:5000/stop"]
上述资源清单中在pod中添加了lifecycle,并在postStart和preStop中添加了使用wget访问url的功能(busybox中没有curl命令,可以用wget发起HTTP Get请求)
为了更明显的演示lifecycle,这里采用flask应用来响应Pod的postStart和preStop动作
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/stop', methods=['GET'])
def stop_endpoint():
name = request.args.get('name', None) # 从 URL 查询字符串中获取 name 参数
# 这里你可以添加你希望在停止时执行的逻辑
print("Stopping")
# 返回响应
return jsonify({'message': 'Stopped'})
@app.route('/start', methods=['GET'])
def start_endpoint():
name = request.args.get('name', None) # 从 URL 查询字符串中获取 name 参数
# 这里你可以添加你希望在启动时执行的逻辑
print("Starting")
# 返回响应
return jsonify({'message': 'Started'})
if __name__ == '__main__':
app.run("0.0.0.0", debug=True) # 在开发模式下运行 Flask 应用
python3 app.py
使用上文的资源清单可以生成3个pod,根据配置会向http服务器的/start发送三个请求,
如果删除此rs下的pod,RS会重新将pod拉起。
刪除其中一个,可以看到会触发pod的preStop,然后RS会重新拉起一个新的pod
同样的,如果修改pod的标签,也会触发拉起新pod,因为RS是通过标签来判断示例的replicas数量的
查看标签
kubectl get pod --show-labels| grep rs-demo
修改标签
kubectl label pod rs-demo-946fx tier=demo1 --overwrite
可以看到,因为标签变动,RS会再拉起一个新的Pod
相应的,如果删除此rs,这3个pod会向http服务器/stop发送三个请求。