k8s实践(四):Controller
off999 2025-01-13 16:48 18 浏览 0 评论
一、Kubernetes核心组件
1. 核心组件概述
Kubernetes主要由以下几个核心组件组成:
- etcd 保存了整个集群的状态;
- apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
- controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
- Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
- kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡
部署流程
2. 查看核心组件
Kubelet是唯一一直作为常规系统组件来运行的组件,它把其他组件作为pod来运行。
2.1 查看Kubelet
master和node节点都可查看
[root@master ~]# systemctl status kubelet2.2 查看其他组件
[root@master ~]# kubectl get po -o custom-columns=POD:metadata.name,NODE:spec.nodeName --sort-by spec.nodeName -n kube-system!
本文重点介绍核心组件controller manager
各资源简写查看:
[root@master ~]# kubectl api-resources 二、Controller Manager
1. 简介
? ? Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控维护整个集群的状态,比如故障检测、自动扩展、滚动更新等并确保集群处于预期的工作状态。
? ? cloud-controller-manager 在 Kubernetes 启用 Cloud Provider 的时候才需要,用来配合云服务提供商的控制,如:Node Controller、Route Controller、Service Controller。
2. 原理
? ? Controller Manager是Kubernetes集群内部的管理控制中心, 负责Kubernetes集群内的Node、 Pod、服务端点、 服务、 资源配额、 命名空间 、服务账号等资源的管理 、 自动化部署、健康监测, 并对异常资源执行自动化修复, 确保集群各资源始终处于预期的工作状态 。 比如, 当某个Node意外若机时,Controller Manager会根据资源调度策略选择集群内其他节点自动部署原右机节点上的Pod副本 。
? ? Controller Manager是 一 个控制器集合, 包含Replication Controller、Deployment Controller、RelicaSet、StatefulSet Controller、Daemon Controller、CronJob Controller、Node Controller、Resourcequota Controller 、Namespace Controller 、ServiceAccount Controller 、Token Controller、Service Controller及Endpoint Controller等多个控制器,Controller Manager是这些控制器的核心管理者。 一般来说, 智能系统和自动系统通常会通过一个操纵系统来不断修正系统的状态。 在Kubernetes集群中, 每个控制器的核心工作原理就是:每个控制器通过API服务器来查看系统的运行状态, 并尝试着将系统状态从“ 现有状态 ”修正到“期望状态”。
三、ReplicationController
1. 简介
ReplicationController会持续监控正在运行的pod列表,确保pod的数量始终与其标签选择器匹配,ReplicationController由三部分组成:
- label selector(标签选择器),用于确定ReplicationController作用域中有哪些pod
- replica count(副本个数),指定应运行的pod 数量
- pod template(pod模板),用于创建新的pod 副本
2. 创建ReplicationController
[root@master ~]# more nginx-rc.yaml
apiVersion: v1
kind: ReplicationController #类型为ReplicationController
metadata:
name: nginx #ReplicationController名字
spec:
replicas: 3 #pod实例数目
selector: #pod选择器
app: nginx
template: #pod模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx3. 查看ReplicationController
[root@master ~]# kubectl get rc
[root@master ~]# kubectl describe rc nginx 4. 扩缩容
扩缩容可以采用修改pod模板和直接命令方式
扩容
[root@master ~]# kubectl edit rc nginx 缩容
[root@master ~]# kubectl scale rc nginx --replicas=45. 删除pod
[root@master ~]# kubectl delete po nginx-2twcf删除pod nginx-2twcf,发现该pod被删除的同时k8s自动新增一个pod nginx-vtmt4,这也印证了之前简介中讲的"ReplicationController会持续监控正在运行的pod列表,确保pod的数量始终与其标签选择器匹配"
6. 删除ReplicationController
[root@master ~]# kubectl delete rc nginx 删除ReplicationController会将其管理的pod一并删除,如果想保留pod,可以添加参数"--cascade = false"
7. 标签
7.1 新增标签
[root@master ~]# kubectl label po nginx-28d4k env=prod7.2 查看标签
[root@master ~]# kubectl get po --show-labels 7.3 更改标签
[root@master ~]# kubectl label po nginx-28d4k app=test --overwrite更改app=nginx的标签,这将使该pod不再与ReplicationController的标签选择器匹配,只剩两个匹配的pod,ReplicationController会启动一个新的pod nginx-64w44将总数量恢复为3个。
四、ReplicaSet
1. 简介
ReplicaSet的行为与ReplicationController完全相同,但pod选择器的表达能力更强,是新一代的ReplicationController,并且将其完全替换掉(ReplicationController最终将被弃用).
2. 创建ReplicaSet
[root@master ~]# more httpd-rs.yaml
apiVersion: apps/v1 #api版本
kind: ReplicaSet
metadata:
name: httpd
spec:
replicas: 3
selector:
matchExpressions:
- key: app #标签名为app
operator: In #In : Label的值必须与其中一个指定的values匹配
values:
- httpd #标签值为httpd
template: #replicaset模板
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd ReplicaSet相对于ReplicationController的主要改进是它更具表达力的标签选择器,ReplicaSet的pod选择器的表达能力更强。
3. 查看ReplicaSet
[root@master ~]# kubectl get rs
[root@master ~]# kubectl describe rs httpd 4. 删除ReplicaSet
[root@master ~]# kubectl delete rs httpd同理,如需保留pod可以添加参数--cascade=false
五、Deployment
1. 简介
Deployment为Pod和Replica Set(下一代 Replication Controller)提供声明式更新。你只需要在Deployment中描述你想要的目标状态是什么,Deployment controller就会帮你将Pod和Replica Set的实际状态改变到你的目标状态。你可以定义一个全新的Deployment,也可以创建一个新的替换旧的Deployment。
Deployment的典型应用场景 包括:
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
2. Deployment实践
Deployment相关操作详见:k8s实践(三):pod常用操作
六、DaemonSet
1. 简介
与Replicationcontroller和ReplicaSet在Kubemetes集群上运行部署特定数量的pod不同,DaemonSet每个Node上最多只能运行一个副本,如果节点下线,DaemonSet不会在其他地方重新创建pod,当将一个新节点添加到集群中时,DaemonSet会立刻部署一个新的pod实例。如果有人无意删除了一个pod,它也会从配置的pod模板中创建新的pod。
DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
- 日志收集,比如fluentd,logstash等
- 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Gangliagmond等
- 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等
本文以日志搜集工具filebeat为例实践
2. 创建DaemonSet
[root@master ~]# more filebeat-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat-ds
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
name: filebeat
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env:
- name: REDIS_HOST
value: db.ilinux.io:6379
- name: LOG_LEVEL
value: info
[root@master ~]# kubectl apply -f filebeat-ds.yaml
daemonset.apps/filebeat-ds created3. 查看DaemonSet
[root@master ~]# kubectl get ds
[root@master ~]# kubectl describe ds filebeat-ds
[root@master ~]# kubectl get po -o wide 查看日志
4. 更新DaemonSet
[root@master ~]# kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.6.6-alpineDaemonSet通过删除和新建方式更新image
5. 回滚DaemonSet
5.1 查询历史版本
[root@master ~]# kubectl rollout history ds filebeat-ds 5.2 查询某个历史版本详细信息
[root@master ~]# kubectl rollout history ds filebeat-ds --revision=1
[root@master ~]# kubectl rollout history ds filebeat-ds --revision=25.3 回滚
[root@master ~]# kubectl rollout undo ds filebeat-ds --to-revision=15.4 查看DaemonSet状态
[root@master ~]# kubectl rollout status ds/filebeat-ds
daemon set "filebeat-ds" successfully rolled out
[root@master ~]# kubectl describe ds filebeat-ds |grep Image
Image: ikubernetes/filebeat:5.6.5-alpine6. 删除DaemonSet
[root@master ~]# kubectl delete ds filebeat-ds
daemonset.extensions "filebeat-ds" deleted七、 Job
1. 简介
从程序的运行形态上来区分,我们可以将Pod分为两类:长时运行服务(http server、daemon、mysql)和一次性任务(如并行数据计算、测试、批处理程序等)。ReplicationController、 ReplicaSet和DaemonSet创建的Pod都是长时运行服务,而Job创建的Pod都是一次性的服务。
2. 创建job
[root@master ~]# more job.yaml
apiVersion: batch/v1 #api版本为batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never #设置容器失败后不重启,即直接新建pod
backoffLimit: 4 #限制新建pod数目,默认为6
[root@master ~]# kubectl apply -f job.yaml
job.batch/pi created3. 查看job
[root@master ~]# kubectl get job
[root@master ~]# kubectl get po -o wide 查看job运行结果
[root@master ~]# kubectl logs pi-g2499 该job为求圆周率精确至2000位
4. 并行job
[root@master ~]# more multi-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: multi-job
spec:
completions: 10 #设置Job成功完成Pod的总数
parallelism: 2 #pod并行执行数
template:
metadata:
labels:
app: multi-job
spec:
restartPolicy: OnFailure #设置容器失败后重启
containers:
- name: busybox
image: busybox
[root@master ~]# kubectl apply -f multi-job.yaml
job.batch/multi-job created每次同时运行两个job,最终运行的pod数为10
5. Cronjob
新建cronjob
[root@master ~]# more cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
[root@master ~]# kubectl apply -f cronjob.yaml
cronjob.batch/hello created查看cronjob
[root@master ~]# kubectl get cronjobs
[root@master ~]# kubectl get job --watch每隔一分钟就会生成一个job
6. 删除job
[root@master ~]# kubectl delete job pi multi-job
[root@master ~]# kubectl delete cronjobs hello本文所有脚本和配置文件已上传github:https://github.com/loong576/k8s-Controller.git
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
