云原生俱乐部-k8s知识点归纳(8)

这一部分主要讲一讲CRD客户资源定义、Gateway API、Priority Class优先类、HPA自动扩缩这四部分内容。还剩下Argo CD的内容了整个k8s,至于operator的话单独有一本书,都是实战内容。

CRD客户资源定义

先来讲一讲这节内容的几个核心术语,Custom Resource (CR)​,用户定义的资源实例。CRD,定义 CR 的 Schema(字段、类型、校验规则)。还有controller,监听 CR 变化并执行调谐逻辑的组件,准确来说是监听apiserver。

[1]定义CRD

kind资源类型写CRD,并定义CR的kid标识,以及单复数形式。主要定义的是CR的字段、类型和校验规则。

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:name: mysqlclusters.db.example.com
spec:group: db.example.com           # API 组名scope: Namespaced               # 资源作用域(Namespaced/Cluster)names:plural: mysqlclusters          # API 中使用的复数形式singular: mysqlcluster        # CLI 中使用的单数形式kind: MySQLCluster            # Kind 标识shortNames: ["mysql"]         # 缩写(如 `kubectl get mysql`)versions:- name: v1alpha1served: true                # 是否启用该版本storage: true               # 是否持久化存储schema:                     # 字段校验规则(OpenAPI v3)openAPIV3Schema:type: objectproperties:spec:type: objectproperties:replicas:type: integerminimum: 1version:type: stringpattern: "^5.7|8.0$"

[2]定义CR

即使不创建控制器,也能够创建自定义资源的实例,即CR。可以通过kubectl get MySQLCluster -n ns来查看,但是注意的是,此时CR只是一个存储在etcd中静态声明,并不会触发集群的实际操作。除非有控制器能够处理。

apiVersion: db.example.com/v1alpha1
kind: MySQLCluster
metadata:name: my-mysql
spec:replicas: 3version: "8.0"

[3]实现控制器

以下是控制器的部分代码,一般来说,需要定义CR资源的结构体,并处理相应的字段。我们通过将控制器构建成docker容器镜像,并通过deployment(或其他控制器)来部署自定义的控制器。这样我们实现的控制器就会监听apiserver的请求并创建对应的资源。

// controllers/mysqlcluster_controller.gotype MySQLClusterReconciler struct {client.Client  // Kubernetes 客户端Scheme *runtime.Scheme
}func (r *MySQLClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {// 1. 获取 CR 对象cluster := &dbv1.MySQLCluster{}if err := r.Get(ctx, req.NamespacedName, cluster); err != nil {return ctrl.Result{}, client.IgnoreNotFound(err)}// 2. 调谐逻辑:根据 CR 的 Spec 创建实际资源if err := r.reconcileDeployment(cluster); err != nil {return ctrl.Result{}, err}// 3. 更新 CR 状态cluster.Status.Ready = trueif err := r.Status().Update(ctx, cluster); err != nil {return ctrl.Result{}, err}return ctrl.Result{}, nil
}// 关联资源创建逻辑
func (r *MySQLClusterReconciler) reconcileDeployment(cluster *dbv1.MySQLCluster) error {deploy := &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name:      cluster.Name + "-deploy",Namespace: cluster.Namespace,},Spec: appsv1.DeploymentSpec{Replicas: &cluster.Spec.Replicas,Template: corev1.PodTemplateSpec{Spec: corev1.PodSpec{Containers: []corev1.Container{{Name:  "mysql",Image: "mysql:" + cluster.Spec.Version,}},},},},}// 设置 OwnerReference(建立 CR 与 Deployment 的关联)ctrl.SetControllerReference(cluster, deploy, r.Scheme)return r.CreateOrUpdate(context.TODO(), deploy)
}

[4]访问权限

注意,CR属于集群资源,如果集群范围内创建CR,那么控制器就需要集群权限。如果仅在当前命名空间创建CR,那么当前命名空间的权限就足够了。主要包括get、create、update等等权限,尽量只给予必要的权限。

# config/rbac/role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: mysql-operator-role
rules:
- apiGroups: ["example.com"]       # CRD 所属的 API 组resources: ["mysqlclusters"]     # 自定义资源名称(复数形式)verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]resources: ["deployments"]verbs: ["*"]                    # 全权限
- apiGroups: [""]resources: ["pods", "services", "configmaps"]verbs: ["create", "get", "list", "watch"]
- apiGroups: [""]resources: ["events"]verbs: ["create", "patch"]
---
# config/rbac/role_binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: mysql-operator-rolebinding
subjects:
- kind: ServiceAccountname: mysql-operator-sa    # 控制器使用的 ServiceAccountnamespace: default
roleRef:kind: Rolename: mysql-operator-roleapiGroup: rbac.authorization.k8s.io

Gateway API

Gateway API 是 Kubernetes 官方推出的 ​​下一代 Ingress 和 Service Mesh 标准​​,旨在解决传统 Ingress 的局限性,提供更强大、更灵活的流量管理能力。

[1]ingress

首先回顾一下ingress的概念和作用,ingress定义与service之上,将路由的访问流量转发到service对应的端口(要提前部署控制器)。路径有Prefix和Exact两种,前者是前缀路由匹配,也可以叫兜底路由。后者是精确匹配该路由。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-app-ingress
spec:ingressClassName: nginx  # 指定使用 Nginx Ingress Controllerrules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80

[2]GatewayClass、Gateway、HTTPRoute

同样的,使用Gateway API也需要指定控制器(提前部署).

apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:name: alb-gateway-class
spec:controllerName: "alb.ingress.k8s.aws"  # 指定控制器parametersRef:  # 可选参数(如 AWS ALB 配置)name: alb-configgroup: elbv2.k8s.awskind: IngressClassParams

至于Gateway,需要定义协议,端口之类的规则,同时和GatewayClass关联起来。需要指定spec.linsteners.hostname字段,定义提供HTTP的主机IP或者域名,否则该网关不监听任何的请求,即使HTTPRoute定义也没有用。

apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:name: public-gateway
spec:gatewayClassName: alb-gateway-class  # 关联 GatewayClasslisteners:- name: httpshostnames: ["app.example.com"]  # 域名port: 443protocol: HTTPStls:mode: TerminatecertificateRefs:- kind: Secretname: example-com-tls

定义HTTPRoute资源,需要和Gateway关联起来,并定义具体的路由规则。因为Gateway并不定义路由规则,只声明协议、端口,监听的域名等。具体的访问规则需要HTTPRoute来定义,并将流量转发给service。

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:name: full-route
spec:hostnames: ["app.example.com"]  # 域名parentRefs:- name: public-gatewayrules:- matches:- path:type: PathPrefixvalue: "/api"backendRefs:- name: api-svcport: 8080- matches:- headers:- name: envvalue: canarybackendRefs:- name: canary-svcport: 80

PriorityClass

PriorityClass 是 Kubernetes 调度系统的“紧急程度标签”,用于解决资源竞争时的调度决策问题。 通过数值优先级和抢占机制定义 Pod 的相对重要性,当集群资源不足时,PriorityClass 决定哪些 Pod 应该优先获得资源,并且高优先级 Pod 可以抢占低优先级 Pod 的资源。

通过名字就可以知道优先级类是定义的资源模板,PriorityClass 是非命名空间资源,是在集群级别定义的,在所有命名空间可见。值的通常范围为 0- 10,000,000,系统组件建议≥1,000,000,业务应用不超过 5,000,000。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:name: high-priority
value: 1000000                  # 优先级数值(必填)
globalDefault: false            # 是否作为集群默认优先级(谨慎设置!)
description: "用于关键业务 Pod"   # 描述信息
preemptionPolicy: PreemptLowerPriority  # 抢占策略(默认值)

PreemptLowerPriority(允许抢占)或 Never(禁止抢占),在定义资源的时候,通过spec.PriorityClassName来指定该资源使用的优先级类。PriorityClass 独立于 QoS 等级(如 Guaranteed/Burstable),但高优先级 Pod 通常应配置高 QoS。

apiVersion: v1
kind: Pod
metadata:name: nginx-high-priority
spec:priorityClassName: high-priority  # 引用已定义的 PriorityClasscontainers:- name: nginximage: nginx

HPA自动扩缩

HPA(Horizontal Pod Autoscaler)是 Kubernetes 中的一种自动扩缩容机制,用于根据资源使用情况 动态调整 Pod 副本数量,确保应用能够应对负载的变化,高负载时自动扩容(保证服务可用性),低负载时自动缩容(节约资源成本)。

以下定义的HPA会匹配名称为php-apache的deployment,并应用该策略,最小副本数为1,最大副本数为10。Metrics Server 定期(默认 15s)从 Kubelet 收集所有 Pod 的 CPU/Memory 使用量,HPA 控制器通过 Metrics API 获取当前指标值。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: php-apache-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: php-apache       # 目标工作负载minReplicas: 1           # 最小副本数maxReplicas: 10          # 最大副本数metrics:- type: Resourceresource:name: cpu            # 指标类型target:type: Utilization  # 目标值类型(Utilization 或 AverageValue)averageUtilization: 50  # CPU 使用率阈值(50%)

CPU 利用率= (Pod 实际 CPU 使用量/Pod 的 CPU Request 值)×100%,当cpu使用率超过50%的时候,期望副本数= ceil[当前副本数×(当前指标值/目标指标值)],结果会被限制在 minReplicas 和 maxReplicas 之间。HPA 通过修改 Deployment 的 replicas 字段触发扩缩容,扩 容时默认无延迟(可配置 scaleUp 规则),缩容默认等待 5 分钟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94233.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】7.随机森林之数学原理

随机森林(Random Forest)的数学原理核心是“决策树基学习器 Bootstrap抽样 特征随机选择” 的集成框架,通过降低单棵决策树的方差、提升模型泛化能力来工作。以下分步骤解析其数学推导与核心逻辑: 一、 基学习器:决策…

大模型微调面试题全解析:从概念到实战

大模型微调面试题全解析&#xff1a;从概念到实战 微调基础概念 本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<< >>gitee<< &#xff08;一&#xff09;什么是微调 微调&#xf…

Linux: network: arp: arp_accept

文章目录 接收 linux 代码 arp协议的处理 接收 arp_accept - BOOLEAN Define behavior for gratuitous ARP frames who’s IP is not already present in the ARP table: 0 - don’t create new entries in the ARP table 1 - create new entries in the ARP table Both repli…

SpringBoot 整合 Langchain4j RAG 技术深度使用解析

目录 一、前言 二、Langchain4j RAG介绍 2.1 什么是LangChain4j 2.2 LangChain4j RAG技术介绍 2.2.1 RAG技术原理 2.2.2 LangChain4j中的RAG实现 2.2.3 LangChain4j RAG技术优势 2.2.4 LangChain4j RAG技术应用场景 三、LangChain4j RAG 技术深度使用 3.1 文档加载与解…

百度深度学习面试:batch_size的选择问题

题目在深度学习中&#xff0c;为什么batch_size设置为1不好&#xff1f;为什么batch_size设为整个数据集的大小也不好&#xff1f;&#xff08;假设服务器显存足够&#xff09;解答这是一个非常核心的深度学习超参数问题。即使显存足够&#xff0c;选择极端的 batch_size 也通常…

AWS Fargate 完全指南:在无服务器容器中释放应用潜能

容器化技术带来了应用交付的革命,但管理运行容器的底层服务器集群却带来了新的复杂性。如何在不牺牲容器灵活性的前提下,摆脱服务器的运维重负? AWS Fargate 应运而生。它是一款为容器打造的无服务器计算引擎,让您能够专注于构建应用程序,而无需管理服务器。本文将带您深…

WSL Ubuntu数据迁移

将 WSL 中的 Ubuntu 迁移到其他磁盘可有效释放 C 盘空间并优化系统性能。以下是详细步骤及注意事项&#xff1a;&#x1f4cd; ​​迁移步骤​​​​备份 WSL 数据&#xff08;防止意外丢失&#xff09;​​以管理员身份打开 PowerShell 或命令提示符。导出 Ubuntu 实例为压缩包…

基于STM32的病房监测系统/环境监测系统/人体健康监测系统

基于STM32的病房监测系统/环境监测系统/人体健康监测系统 持续更新&#xff0c;欢迎关注!!! 基于STM32的病房监测系统/环境监测系统/人体健康监测系统 随着科技的进步与人们健康意识的提升&#xff0c;环境与人体健康监测的需求日益增长。在医疗、居住和工作环境中&#xff0c…

【适合中小企业应用的Flask网站部署指南】【小白指南系列】如何在Windows Server服务器上部署Flask网站和SSL证书开启HTTPS

【适合中小企业应用的Flask网站部署指南】【小白指南系列】如何在Windows Server服务器上部署Flask网站和SSL证书开启HTTPS 前言&#xff1a; 上一篇文章已经配置好Redis数据库和网站雏形建立了。现在完善了一个比较重大的功能和进度之后&#xff0c;我们尝试初步将Flask项目网…

std::exchange详解

一、基本概念与函数原型 std::exchange 是 C++14 引入的标准库函数,定义于 <utility> 头文件。其核心功能是原子性地替换对象的值并返回旧值,适用于资源管理、状态机更新等场景。 函数原型: template <class T, class U = T> T exchange(T& obj,

kubernetes-dashboard使用http不登录

安装了k8s v1.28&#xff0c;想要安装kubernetes-dashboard以便可视化管理平台&#xff0c;网上很多资料都是版本比较低的&#xff0c;自己摸索了很久&#xff0c;终于搞定了。直接上配置文件&#xff0c;拿去kubectl apply -f k8s-dashb.yml就行了。 # Copyright 2017 The Kub…

道路车道线分割数据集左车道右车道中线labelme格式3494张4类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数)&#xff1a;3494标注数量(json文件个数)&#xff1a;3494标注类别数&#xff1a;4标注类别名称:["center_lane","right_lane","…

12.Shell脚本修炼手册--函数的基础认知与实战演练(fock炸弹!!)

Shell 函数的知识与实践 文章目录Shell 函数的知识与实践Shell 函数介绍Shell 函数的语法Shell 函数的执行1. 不带参数的函数执行2. 带参数的函数执行Shell 函数的基础实践示例 1&#xff1a;简单的 hello 函数&#xff08;验证 “先定义后调用”&#xff09;示例 2&#xff1a…

微信小程序设计的请求封装方案(request.js)

以下是为微信小程序设计的请求封装方案&#xff0c;包含代码示例和最佳实践建议&#xff1a; 基础请求封装&#xff08;request.js&#xff09; // 基础配置 const BASE_URL https://api.yourdomain.com; const TIMEOUT 10000;// 请求封装函数 const request (options) >…

【Linux系统】进程信号:信号的处理

上一篇文章在介绍完信号的产生和保存后&#xff0c;我们现在对信号有了一个基本的认识&#xff0c;信号由键盘、系统调用、硬件异常、软件条件等方式产生&#xff0c;然后被保存在三张表中&#xff0c;再将信号递达&#xff0c;操作系统有三种处理方式&#xff1a;默认处理、忽…

权限管理模块

登录相关权限管理模块(基础版)模块设计与实现优化点&#xff1a;前后端用户验证实现方式常见的攻击手段及防御手段权限管理模块(基础版) RBAC(Role-Base Access Control&#xff0c;基于角色的访问控制)&#xff1a;是权限管理的常用方案。 核心&#xff1a;通过用户 - 角色 -…

征服与守护:从拉里·埃里森看八号人格的职场王者之道

真正的强者&#xff0c;从不遵守别人的规则2010年&#xff0c;加利福尼亚州的圣何塞机场迎来了一架不速之客——一架意大利产的马基战斗机以一种极其霸道的姿态降落在跑道上。舱盖打开&#xff0c;走下来的不是空军飞行员&#xff0c;而是一位身穿飞行员服、戴着墨镜的企业家&a…

【Linux系统】命名管道与共享内存

前言&#xff1a; 上文我们讲到了匿名管道【Linux系统】匿名管道以及进程池的简单实现-CSDN博客 本文我们来讲一讲命名管道与共享内存 命名管道 上面我们讲到&#xff0c;匿名管道只能用于有血缘关系&#xff08;尤其父子&#xff09;的进程进行通信&#xff01;但如果…

搜索体验优化:ABP vNext 的查询改写(Query Rewrite)与同义词治理

&#x1f50e; 搜索体验优化&#xff1a;ABP vNext 的查询改写&#xff08;Query Rewrite&#xff09;与同义词治理 &#x1f4da; 目录&#x1f50e; 搜索体验优化&#xff1a;ABP vNext 的查询改写&#xff08;Query Rewrite&#xff09;与同义词治理1. 背景与问题界定 &…

Text2API与Text2SQL深度对比:自然语言驱动的数据交互革命

在数字化浪潮中&#xff0c;如何让人机交互更加自然流畅&#xff1f;Text2API与Text2SQL技术应运而生&#xff0c;它们如同魔法般将自然语言转化为机器可执行的指令&#xff0c;让数据交互不再高不可攀。本文将深入剖析这两项技术的原理、优劣势及应用场景&#xff0c;带您领略…