從Helm到 Operator:Kubernetes應用管理的進化

🧰Helm 的作用

在開始前需要先對 kubernetes ?Operator 有個簡單的認識。

以為我們在編寫部署一些簡單 Deployment 的時候只需要自己編寫一個 yaml 文件然后 kubectl apply 即可。

apiVersion:?apps/v1??
kind:?Deployment??
metadata:??labels:??app:?k8s-combat??name:?k8s-combat??
spec:??replicas:?1??selector:??matchLabels:??app:?k8s-combat??template:??metadata:??labels:??app:?k8s-combat??spec:??containers:??-?name:?k8s-combat??image:?crossoverjie/k8s-combat:v1??imagePullPolicy:?Always??resources:??limits:??cpu:?"1"??memory:?300Mi??requests:??cpu:?"0.1"??memory:?30Mi
kubectl?apply?-f?deployment.yaml

這對于一些并不復雜的項目來說完全夠用了,但組件一多就比較麻煩了。

1cdd7d815f216c0223308038cebbd62d.png這里以 Apache Pulsar 為例:它的核心組件有:

  • Broker

  • Proxy

  • Zookeeper

  • Bookkeeper

  • Prometheus(可選)

  • Grafana(可選) 等組件,每個組件的啟動還有這依賴關系。

必須需要等 Zookeeper 和 Bookkeeper 啟動之后才能將流量放進來。

此時如何還繼續使用 yaml 文件一個個部署就會非常繁瑣,好在社區有提供 Helm 一鍵安裝程序,使用它我們只需要在一個同意的 yaml 里簡單的配置一些組件,配置就可以由 helm 來部署整個復雜的 Pulsar 系統。

components:??#?zookeeper??zookeeper:?true??#?bookkeeper??bookkeeper:?true??#?bookkeeper?-?autorecovery??autorecovery:?true??#?broker??broker:?true??#?functions??functions:?false??#?proxy??proxy:?true??#?toolset??toolset:?true??#?pulsar?manager??pulsar_manager:?false??
monitoring:??#?monitoring?-?prometheus??prometheus:?true??#?monitoring?-?grafana??grafana:?true??#?monitoring?-?node_exporter??node_exporter:?true??#?alerting?-?alert-manager??alert_manager:?false

比如在 helm 的 yaml 中我們可以選擇使用哪些 components,以及是否啟用監控組件。

最后直接使用這個文件進行安裝:

helm?install?pulsar?apache/pulsar?\--values?charts/pulsar/values.yaml?\--set?namespace=pulsar?\--set?initialize=true

它就會自動生成各個組件的 yaml 文件,然后統一執行。

所以 helm 的本質上和 kubectl apply yaml 一樣的,只是我們在定義 value.yaml 時幫我們處理了許多不需要用戶低頻修改的參數。

我們可以使用 helm 將要執行的 yaml 輸出后人工審核

helm?install?pulsar?apache/pulsar?--dry-run?--debug?>?debug.yaml

🤔Operator 是什么

💔Helm 的痛點

Helm 雖然可以幫我們部署或者升級一個大型應用,但他卻沒法幫我們運維這個應用。

舉個例子:比如我希望當 Pulsar Broker 的流量或者內存達到某個閾值后就指定擴容 Broker,閑時再自動回收。

或者某個 Bookkeeper 的磁盤使用率達到閾值后可以自動擴容磁盤,這些僅僅使用 Helm 時都是無法實現的。

以上這些需求我們目前也是通過監控系統發出報警,然后再由人工處理。

其中最大的痛點就是進行升級:

  • 升級ZK

  • 關閉auto recovery

  • 升級Bookkeeper

  • 升級Broker

  • 升級Proxy

  • 開啟auto recovery

因為每次升級是有先后順序的,需要依次觀察每個組件運行是否正常才能往后操作。

如果有 Operator 理性情況下下我們只需要更新一下鏡像版本,它就可以自動執行以上的所有步驟最后將集群升級完畢。

所以相對于 Helm 來說 Operator 是可以站在一個更高的視角俯視整個應用系統,它能發現系統哪個地方需要它從而直接修復。

💎CRD(Custom Resource Definitions)

而提到 Operator 那就不得不提到 CRD(Custom Resource Definitions)翻譯過來就是自定義資源。

這是 kubernetes 提供的一個 API 擴展機制,類似于內置的 Deployment/StatefulSet/Services 資源,CRD 是一種自定義的資源。

這里以我們常用的 prometheus-operatorVictoriaMetrics-operator 為例:

Prometheus:

  • **Prometheus**:用于定義 Prometheus 的 Deployment

  • **Alertmanager**:用于定義 Alertmanager

  • **ScrapeConfig**:用于定會抓取規則

apiVersion:?monitoring.coreos.com/v1alpha1
kind:?ScrapeConfig
metadata:name:?static-confignamespace:?my-namespacelabels:prometheus:?system-monitoring-prometheus
spec:staticConfigs:-?labels:job:?prometheustargets:-?prometheus.demo.do.prometheus.io:9090

使用時的一個很大區別就是資源的 kind: ScrapeConfig 為自定義的類型。

VictoriaMetrics 的 CRD:

  • VMPodScrape:Pod 的抓取規則

  • VMCluster:配置 VM 集群

  • VMAlert:配置 VM 的告警規則

  • 等等

#?vmcluster.yaml
apiVersion:?operator.victoriametrics.com/v1beta1
kind:?VMCluster
metadata:name:?demo
spec:retentionPeriod:?"1"replicationFactor:?2vmstorage:replicaCount:?2storageDataPath:?"/vm-data"storage:volumeClaimTemplate:spec:resources:requests:storage:?"10Gi"resources:limits:cpu:?"1"memory:?"1Gi"vmselect:replicaCount:?2cacheMountPath:?"/select-cache"storage:volumeClaimTemplate:spec:resources:requests:storage:?"1Gi"resources:limits:cpu:?"1"memory:?"1Gi"requests:cpu:?"0.5"memory:?"500Mi"vminsert:replicaCount:?2

以上是用于創建一個 VM 集群的 CRD 資源,應用之后就會自動創建一個集群。

Operator 原理

78ddb8ade8e195145eb54915aef8ddc0.pngOperator 通常是運行在 kubernetes API server 的 webhook 之上,簡單來說就是在一些內置資源的關鍵節點 API-server 會調用我們注冊的一個 webhook,在這個 webhook 中我們根據我們的 CRD 做一些自定義的操作。

理論上我們可以使用任何語言都可以寫 Operator,只需要能處理 api-server 的回調即可。

只是 Go 語言有很多成熟的工具,比如常用的 kubebuilder 和 operator-sdk.

他們內置了許多命令行工具,可以幫我們節省需要工作量。

這里以 operator-sdk 為例:

$?operator-sdk?create?webhook?--group?cache?--version?v1alpha1?--kind?Memcached?--defaulting?--programmatic-validation

會直接幫我們創建好一個標準的 operator 項目:

├──?Dockerfile
├──?Makefile
├──?PROJECT
├──?api
│???└──?v1alpha1
│???????├──?memcached_webhook.go
│???????├──?webhook_suite_test.go
├──?config
│???├──?certmanager
│???│???├──?certificate.yaml
│???│???├──?kustomization.yaml
│???│???└──?kustomizeconfig.yaml
│???├──?default
│???│???├──?manager_webhook_patch.yaml
│???│???└──?webhookcainjection_patch.yaml
│???└──?webhook
│???????├──?kustomization.yaml
│???????├──?kustomizeconfig.yaml
│???????└──?service.yaml
├──?go.mod
├──?go.sum
└──?main.go

其中 Makefile 中包含了開發過程中常用的工具鏈(包括根據聲明的結構體自動生成 CRD 資源、部署k8s 環境測試等等)、Dockerfile 等等。

這樣我們就只需要專注于開發業務邏輯即可。

因為我前段時間給 https://github.com/open-telemetry/opentelemetry-operator 貢獻過兩個 feature,所以就以這個 Operator 為例:

它有一個 CRD: kind: Instrumentation,在這個 CRD 中可以將 OpenTelemetry 的 agent 注入到應用中。

apiVersion:?opentelemetry.io/v1alpha1??
kind:?Instrumentation??
metadata:??name:?instrumentation-test-ordernamespace:?test??
spec:??env:??-?name:?OTEL_SERVICE_NAME??value:?orderselector:??matchLabels:??app:?order??java:??image:?autoinstrumentation-java:2.4.0-release??extensions:??-?image:?autoinstrumentation-java:2.4.0-release??dir:?/extensions??env:??-?name:?OTEL_RESOURCE_ATTRIBUTES??value:?service.name=order??-?name:?OTEL_INSTRUMENTATION_MESSAGING_EXPERIMENTAL_RECEIVE_TELEMETRY_ENABLED??value:?"true"??-?name:?OTEL_TRACES_EXPORTER??value:?otlp??-?name:?OTEL_METRICS_EXPORTER??value:?otlp??-?name:?OTEL_LOGS_EXPORTER??value:?none??-?name:?OTEL_EXPORTER_OTLP_ENDPOINT??value:?http://open-telemetry-opentelemetry-collector.otel.svc.cluster.local:4317??-?name:?OTEL_EXPORTER_OTLP_COMPRESSION??value:?gzip??-?name:?OTEL_EXPERIMENTAL_EXPORTER_OTLP_RETRY_ENABLED??value:?"true"

它的運行規則是當我們的 Pod 在啟動過程中會判斷 Pod 的注解中是否開啟了注入 OpenTelemetry 的配置。

如果開啟則會將我們在 CRD 中自定義的鏡像里的 javaagent 復制到業務容器中,同時會將下面的那些環境變量也一起加入的業務容器中。

要達到這樣的效果就需要我們注冊一個回調 endpoint。

mgr.GetWebhookServer().Register("/mutate-v1-pod",?&webhook.Admission{??Handler:?podmutation.NewWebhookHandler(cfg,?ctrl.Log.WithName("pod-webhook"),?decoder,?mgr.GetClient(),??[]podmutation.PodMutator{??sidecar.NewMutator(logger,?cfg,?mgr.GetClient()),??instrumentation.NewMutator(logger,?mgr.GetClient(),?mgr.GetEventRecorderFor("opentelemetry-operator"),?cfg),??}),})

當 Pod 創建或有新的變更請求時就會回調我們的接口。

func?(pm?*instPodMutator)?Mutate(ctx?context.Context,?ns?corev1.Namespace,?pod?corev1.Pod)?(corev1.Pod,?error)?{??logger?:=?pm.Logger.WithValues("namespace",?pod.Namespace,?"name",?pod.Name)}

在這個接口中我們就可以拿到 Pod 的信息,然后再獲取 CRD Instrumentation 做我們的業務邏輯。

var?otelInsts?v1alpha1.InstrumentationList??
if?err?:=?pm.Client.List(ctx,?&otelInsts,?client.InNamespace(ns.Name));?err?!=?nil?{??return?nil,?err??
}//?從 CRD 中將數據復制到業務容器中。
pod.Spec.InitContainers?=?append(pod.Spec.InitContainers,?corev1.Container{Name:??????javaInitContainerName,Image:?????javaSpec.Image,Command:???[]string{"cp",?"/javaagent.jar",?javaInstrMountPath?+?"/javaagent.jar"},Resources:?javaSpec.Resources,VolumeMounts:?[]corev1.VolumeMount{{Name:??????javaVolumeName,MountPath:?javaInstrMountPath,}},
})for?i,?extension?:=?range?javaSpec.Extensions?{pod.Spec.InitContainers?=?append(pod.Spec.InitContainers,?corev1.Container{Name:??????initContainerName?+?fmt.Sprintf("-extension-%d",?i),Image:?????extension.Image,Command:???[]string{"cp",?"-r",?extension.Dir?+?"/.",?javaInstrMountPath?+?"/extensions"},Resources:?javaSpec.Resources,VolumeMounts:?[]corev1.VolumeMount{{Name:??????javaVolumeName,MountPath:?javaInstrMountPath,}},})
}

不過需要注意的是想要在測試環境中測試 operator 是需要安裝一個 cert-manage,這樣 webhook 才能正常的回調。

009ba0d3f35f11e361efc7a9bd0b8551.png要使得 CRD 生效,我們還得先將 CRD 安裝進 kubernetes 集群中,不過這些 operator-sdk 這類根據已經考慮周到了。

我們只需要定義好 CRD 的結構體:b39292b1a0405ed1763b1ffbc8d34f4b.png

然后使用 Makefile 中的工具 make bundle 就會自動將結構體轉換為 CRD。

參考鏈接:

  • https://github.com/VictoriaMetrics/operator

  • https://github.com/prometheus-operator/prometheus-operator

    往期推薦

    如何找到并快速上手一個開源項目

    OpenTelemetry 深度定制:跨服務追蹤的實戰技巧

    從 Prometheus 到 OpenTelemetry: 指標監控的演進與實踐

    從 Dapper 到 OpenTelemetry:分布式追蹤的演進之旅

    實操 OpenTelemetry:通過 Demo 掌握微服務監控的藝術

    ab8c94efd5579def0dba183d4ba2f9c4.gif

    點分享

    9b785d96af38ff71a2611c38331dd390.gif

    點收藏

    fb8ca8057dc45a8bdd311d75971abaae.gif

    點點贊

    5147ebc5cc405c49bb6638c7c0d7a4c8.gif

    點在看

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43144.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

去水印小程序源碼修復版-前端后端內置接口+第三方接口

去水印小程序源碼,前端后端,內置接口第三方接口, 修復數據庫賬號密碼錯誤問題,內置接口支持替換第三方接口, 文件挺全的,可以添加流量主代碼,搭建需要準備一臺服務器,備案域名和http…

農牧行業CRM洞察:打造營、銷、服一體化數字營銷平臺

01、行業應用背景 保持企業活力,支撐業務單元協調發展,穩定核心產品競爭力,將成為農牧行業企業數字化、數智化建設的指導方向。 積極發揮數據在生產、流通、消費各個環節的決策支撐,為農牧企業特別是多業態集團型企業&#xff0…

JVM:類的生命周期

文章目錄 一、介紹二、加載階段三、連接階段1、驗證階段2、準備階段3、解析階段 四、初始化階段 一、介紹 類的生命周期描述了一個類加載、連接(驗證、準備和解析)、初始化、使用、卸載的整個過程。 二、加載階段 加載(Loading&#xff09…

全棧業務開發入門——登錄業務接口

業務已上傳則資源 實現登錄業務的前后端聯調,前端點擊登錄按鈕向后端發送一個請求,后端調用接口向前端響應結果 效果如下: 設計環境:springbootmybatisvue3axios 一.前端設計 1.基于vue3腳手架創建項目,搭建項目結構…

LAZYNVIM學習使用筆記

文章目錄 1. 前言VIM的模式快捷鍵參考 1. 前言 習慣使用vscode進行代碼編輯,無意中刷到lazynvim,感覺功能強大,于是下載、安裝,學習使用一下,本篇主要記錄學習使用lazynvim的一些要點,防止遺忘。 持續更新…

帝特(DTECH)USB轉RS485/422串口線在Ubuntu系統中的安裝

因為測試需要,買了一根帝特(DTECH)USB轉RS485/422串口線,今天測試了一下在Ubuntu 22.04系統上的使用。帝特的網站上提供了驅動程序,下載以后發現接口芯片是CP2102,廠商只提供了Linux內核2.6和3.x版本的驅動…

1703:發現它,抓住它

網址如下: OpenJudge - 1703:發現它,抓住它 測,這題差點讓我去世 用了一堆方法來做 后面現學了并查集,用了并查集來做,因為縮短路徑的方法不好,還是超時了 后面換了一種縮短路徑的方法 先上代碼 解法一…

游戲AI的創造思路-技術基礎-情感計算(2)

上一篇我們介紹了情感計算的基本支持,本篇將呈現情感計算在游戲AI中的使用實例~~~ 目錄 7. 情感計算在游戲AI中的運用實例 7.1. RPG游戲中的運用實例 7.1.1. 實例背景 7.1.2. AI情感計算系統 7.1.3. 引導用戶執行任務 7.1.4. 推動游戲劇情發展 7.1.5. 實例效…

用Python玩轉Excel的五大功能!

在日常的數據處理工作中,Excel無疑是一個強大的工具。然而,當數據量較大或需要自動化處理時,Python憑借其強大的庫支持,如pandas和openpyxl,能夠更高效地處理Excel文件。 本文將介紹Python中常用的五種Excel操作**&am…

一個用于在虛擬桌面下跑chrome的docker鏡像

制作了一個用于跑chrome的docker鏡像xvfb-chrome,主要是為了支持能夠通過xvfb或者wayland,給chrome提供一個虛擬的桌面環境。 這個鏡像主要支持: 將chrome --remote-debugging-port映射到docker的host,可以在host直接訪問。支持…

Python辦公自動化:增值稅發票批量識別和核驗

騰訊云免費體驗地址: https://console.cloud.tencent.com/api/explorer?Product=ocr&Version=2018-11-19&Action=VatInvoiceVerifyNew 首先進行識別,這里以python為例子 # -*- coding: utf-8 -*- import jsonfrom tencentcloud.common.common_client import Commo…

【C++航海王:追尋羅杰的編程之路】關聯式容器的底層結構——紅黑樹

目錄 1 -> 紅黑樹 1.1 -> 紅黑樹的概念 1.2 -> 紅黑樹的性質 1.3 -> 紅黑樹節點的定義 1.4 -> 紅黑樹的結構 1.5 -> 紅黑樹的插入操作 1.6 -> 紅黑樹的驗證 1.8 -> 紅黑樹與AVL樹的比較 2 -> 紅黑樹模擬實現STL中的map與set 2.1 -> 紅…

如何理解李彥宏說的“不要卷模型,要卷應用?

背景: 7月4日,2024世界人工智能大會暨人工智能全球治理高級別會議全體會議在上海世博中心舉辦。在產業發展主論壇上,百度創始人、董事長兼首席執行官李彥宏呼吁:“大家不要卷模型,要卷應用!”李彥宏認為&am…

【堆 優先隊列】1354. 多次求和構造目標數組

本文涉及知識點 堆 優先隊列 LeetCode1354. 多次求和構造目標數組 給你一個整數數組 target 。一開始&#xff0c;你有一個數組 A &#xff0c;它的所有元素均為 1 &#xff0c;你可以執行以下操作&#xff1a; 令 x 為你數組里所有元素的和 選擇滿足 0 < i < target.…

idea在選定范圍搜索

idea在選定范圍搜索 CtrlR 在IntelliJ IDEA中&#xff0c;?如果你想在選定的范圍內搜索關鍵字&#xff0c;?可以按照以下步驟操作&#xff1a;? 首先&#xff0c;?使用鼠標選中你要搜索關鍵字的一個范圍。? 然后&#xff0c;?使用快捷鍵CtrlR&#xff08;?替換元素&am…

掌握JsonConvert.SerializeObject:美化輸出與序列化對象的藝術

目錄 引言 JsonConvert.SerializeObject簡介 參數詳解 使用示例 運行結果 結論 結語 引言 在現代軟件開發中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;被廣泛用于Web API、數據庫存儲以及跨平臺數據傳…

linux信息收集與提權

目錄 版本信息收集 kali得一些exp網站 kali自帶的searchsploit工具 臟牛提權漏洞&#xff08;改寫沒有寫權限的文件&#xff09; 測試靶場下載鏈接 sudo提權 上傳惡意C腳本進行編譯生成dirty的elf文件&#xff0c;也可以在攻擊機編譯好上傳 啟動&#xff0c;123456是設…

體驗完這款售價29999元起蘋果新品,我大受震撼

講道理&#xff0c;數碼圈已經很久沒有出現過讓人耳目一新的產品了。 整個圈子近些年各家新品邏輯給我的一種感覺是普遍主打循規循距&#xff0c;用高情商話來說那叫穩扎穩打不易出錯&#xff0c;而低情商嘛&#xff0c;說白了叫創新精神嚴重缺失。 「科技最后以換皮為準」這…

C語言學習 關于short和int

&#x1f308; 關于今天的這一part 簡單說說關于C中的short 和 int 主要是復盤C語言時候的一個小小的回顧把~&#xff08;內容來自C Primer Plus 第六版&#xff09; &#x1f433;主要是討論一下兩個東西 1?? 在給函數傳遞參數時&#xff0c;C編譯器把short類型的值自動轉換…

【CUDA】 Trust基本特性介紹及性能分析

Trust簡介 Thrust 是一個實現了眾多基本并行算法的 C 模板庫,類似于 C 的標準模板庫(standard template library, STL)。該庫自動包含在 CUDA 工具箱中。這是一個模板庫,僅僅由一些頭文件組成。在使用該庫的某個功能時,包含需要的頭文件即可。該庫中的所有類型與函數都在命名空…