K8s资源控制器的实战
Pod的资源控制器类型
- Pod类型:
- 自主运行的Pod(静态Pod)
- 管理器运行的Pod(动态Pod)
管理器的作用:通过标签绑定Pod,并进行管理;
管理副本数量;
Pod的生命周期就是调度、启动、成功、终止、删除;
控制器类型:
1.ReplicationController(RC)/ReplicaSet(RS)
- 副本控制器:动态的控制Pod的数量
- RS和RC功能一致,增加selector集合选择器
- 很少独立使用,而是被其他管理器调用
vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myweb
spec:
replicas: 3
selector:
matchLabels:
aihao: haha
template:
metadata:
labels:
aihao: haha
spec:
containers:
- name: nginx
image: 192.168.57.200:8099/library/nginx:1.21
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
当我们定义了副本数量之后,系统始终会保持这个数量,多删少建。
通过kubectl get pod --show-labels 来查看我们 Pod 的标签。
通过kubectl label pod <Pod名称> <新的标签> --overwrite=True 修改标签
2.Deployment
- 实现业务的部署,部署无状态服务
- 控制副本数量,实现扩容和缩容
- 控制容器的镜像版本,实现升级和回滚
vim deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
app: web-nginx
replicas: 3
template:
metadata:
labels:
app: web-nginx
spec:
containers:
- name: web-nginx
image: 192.168.57.200:8099/library/nginx:1.21
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
kubectl create -f deploy.yaml --record
# --record参数可以记录命令,我们可以很方便的查看每次revision的变化,这个在生产中作为资源创建更新用来回滚的重要标记,强烈建议在生产中操作时都加上这个参数
扩容:kubectl scale deployment my-nginx --replicas=5
缩容:kubectl scale deployment my-nginx --replicas=2
查看nginx的版本:kubectl exec <Pod-name> -it -- nginx -v
升级:kubectl set image deployment/my-nginx web-nginx=nginx:1.24(都会升级)
回滚:kubectl rollout undo deployment --to-revision=1(Pod名称会变化)
查看deployment的历史记录:kubectl rollout history deployment my-nginx
清理 Policy :
可以通过设置 spec.revisonHistoryLimit 项来指定 deployment 最多保留多少 revision 历史记录。默认的会保留所有的 revision,如果将该项设置为 0,Deployment 就不允许回退了。
3.DaemonSet
- 在每个Node节点上自动部署Pod
- 例如:K8s监控、网络插件
vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: deamonset #daemonset名称
labels:
app: daemonset
spec:
selector:
matchLabels:
name: deamonset
template:
metadata:
labels:
name: deamonset
spec:
containers:
- name: daemonset
image: 192.168.57.200:8099/library/nginx:1.21
适用场景:
1. 日志收集和监控:可以在每个节点上运行一个 Fluentd、Fluent Bit 或者 Prometheus 代理来进行日志收集和监控。
2. 网络代理:如 Cilium、Flannel 或 Calico 可能需要在每个节点上运行,以便管理 Pod 之间的网络通信。
3. 存储:如 GlusterFS 或 Ceph 也需要在每个节点上运行一定的存储代理,以便提供存储解决方案。
4. 安全代理:如 Istio Sidecar 可以通过 DaemonSet 确保每个节点上至少有一个实例来保障网络安全。
查看 DaemonSet 的状态:kubectl get daemonset <daemonset-name>
获取详细信息:kubectl describe daemonset <daemonset-name>
通过运行 DaemonSet,您可以确保在集群中每个节点上都运行了必要的服务或代理,从而增强了集群的功能和安全性。
4.StateFulSet(StS)
- 用户部署有状态服务
- Pod的名称唯一且有序
- 适合部署数据库一类的容器
StatefulSet是由什么组成的?
·Headless Service:用来定义pod网路标识,生成可解析的DNS记录;不分配clusterIP,可以通过解析service的DNS,返回所有Pod的dns和ip地址
·StatefulSet:管理pod的
·volumeClaimTemplates:存储卷申请模板,创建pvc,指定pvc名称大小,自动创建pvc,且pvc由存储类供应。
StatefulSet使用场景?
·稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现。
·稳定的网络标识符,即 Pod 重新调度后其 PodName 和 HostName 不变。
·有序部署,有序扩展,基于 init containers 来实现。
·有序收缩。
5.Job与cronJob
- Job是一次性任务,控制Pod运行成功后自动销毁
- cronJob:crontab语法“分时日月周”设置周期执行Pod
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job
spec:
template: #格式同Pod
metadata:
name: job
spec:
containers:
- name: job
image: 192.168.57.200:8099/library/perl:latest
command: ["/bin/sh", "-c", "ls && pwd"]
restartPolicy: Never #仅支持 Never 或 OnFailure
![]()
--------------------------------------------------------------------------------------------------------------------------
vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" #调度,必需字段,指定任务运行周期,格式同 Cron
jobTemplate: #Job 模板,必需字段,指定需要运行的任务,格式同 Job
spec:
template: #格式同Pod
spec:
containers:
- name: hello
image: 192.168.57.200:8099/library/nginx:1.21
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure #仅支持 Never 或 OnFailure
![]()
6.Horizontal Pod Autoscaling
- 水平Pod自动扩缩容管理器,简称HPA
- 根据CPU占有率来决定是否扩缩容
- 设置阈值:Pod的最大值和最小值
# 1.首先用web的yaml配置并增加资源分配配置增加
vim web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx:1.21.6
name: nginx
resources:
limits: # 因为我这里是测试环境,所以这里CPU只分配50毫核(0.05核CPU)和20M的内存
cpu: "50m"
memory: 20Mi
requests: # 保证这个pod初始就能分配这么多资源
cpu: "50m"
memory: 20Mi
# 更新web资源:
kubectl apply -f web.yaml
# 创建hpa:
kubectl autoscale deployment web --max=3 --min=1 --cpu-percent=50
# 正确的 Metrics Server 安装步骤总结:
1. 下载官方配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server.yaml
2. 修改镜像地址为国内源
sed -i 's|image: registry.k8s.io/metrics-server/metrics-server:v0.8.0|image: registry.aliyuncs.com/google_containers/metrics-server:v0.8.0|g' metrics-server.yaml
3. 编辑配置文件添加 TLS 参数
vim metrics-server.yaml
在 Deployment 的 args 部分添加一行:
- --kubelet-insecure-tls
4. 应用配置
kubectl apply -f metrics-server.yaml
5. 验证安装
# 检查 Pod 状态(等待变为 1/1 Running)
kubectl get pods -n kube-system -l k8s-app=metrics-server
# 测试功能
kubectl top nodes
kubectl top pods
# 可以看到相关的hpa信息(K8s上metrics服务收集所有pod资源的时间间隔大概在60s的时间)
kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web Deployment/web 0%/50% 1 3 1 21m
# 设置Service,实现负载均衡的效果
kubectl expose deployment web --port=80 --target-port=80 --name=web
# 查看Service IP
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d
web ClusterIP 10.102.134.29 <none> 80/TCP 8s
# 启动一个临时pod,来模拟大量请求
kubectl run -it --rm busybox --image=registry.cn-shanghai.aliyuncs.com/acs/busybox:v1.29.2 -- sh
If you don't see a command prompt, try pressing enter.
/ # 输入exit,然后替换成自己IP测试,记得退出不然会一直循环
while :;do wget -q -O- http://10.102.134.29;done
# 查看相关的hpa信息,可以看到,在业务流量高峰下去后,HPA并不急着马上收缩pod数量,而是等待5分钟后,再进行收敛,这是稳妥的作法,是k8s为了避免频繁增删pod的一种手段
kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web Deployment/web 0%/50% 1 3 1 35m
web Deployment/web 100%/50% 1 3 1 37m
web Deployment/web 100%/50% 1 3 2 38m
web Deployment/web 86%/50% 1 3 3 39m
web Deployment/web 0%/50% 1 3 3 41m
web Deployment/web 0%/50% 1 3 1 44m
