云原生俱樂部-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
英文地址,請注明出處:http://en.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;帶您領略…