国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用kubernetes client-go實踐一個簡單的與K8s交互過程

Linux愛好者 ? 來源:Linux愛好者 ? 作者:Vladimir Vivien ? 2021-02-02 11:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【導(dǎo)讀】Kubernetes項目使用Go語言編寫,對Go api原生支持非常便捷。本篇文章介紹了如何使用kubernetes client-go實踐一個簡單的與K8s交互過程。

kubernetes 的Go Client項目(client-go)

go client是k8s client中最古老的一個,具有很多特性。Client-go 沒有使用Swagger生成器,它使用的是源于k8s項目中的源代碼生成工具,這個工具的目的是要生成k8s風(fēng)格的對象和序列化程序。

該項目是一組包的集合,該包能夠滿足從REST風(fēng)格的原語到復(fù)雜client的不同的編程需求。

d4dd48de-61ff-11eb-8b86-12bb97331649.jpg

RESTClient是一個基礎(chǔ)包,它使用api-machinery庫中的類型作為一組REST原語提供對API的訪問。作為對RESTClient之上的抽象,_clientset_將是你創(chuàng)建k8s client工具的起點。它暴露了公開化的API資源及其對應(yīng)的序列化。

注意:在 client-go中還包含了如discovery, dynamic, 和 scale這樣的包,雖然本次不介紹這些包,但是了解它們的能力還是很重要的。

一個簡單的k8s client 工具

讓我們再次回顧我們將要構(gòu)建的工具,來說明go client的用法。pvcwatch是一個簡單的命令行工具,它可以監(jiān)聽集群中聲明的PVC容量。當總數(shù)到達一個閾值的時候,他會采取一個action(在這個例子中是在屏幕上通知顯示)

d541877c-61ff-11eb-8b86-12bb97331649.jpg

你能在github上找到完整的例子

這個例子是為了展示k8s的go client的以下幾個方面:- 如何去連接 - 資源列表的檢索和遍歷 - 對象監(jiān)聽

Setup

client-go支持Godep和dep作為vendor的管理程序,我覺得dep便于使用所以繼續(xù)使用dep。例如,以下是client-go v6.0和k8s API v1.9所需最低限度的Gopkg.toml

[[constraint]]
  name = "k8s.io/api"
  version = "kubernetes-1.9.0"
[[constraint]]
  name = "k8s.io/apimachinery"
  version = "kubernetes-1.9.0"
[[constraint]]
  name = "k8s.io/client-go"
  version = "6.0.0"

運行dep ensure確保剩下的工作。

連接 API Server

我們Go client的第一步就是建立一個與API Server的連接。為了做到這一點,我們要使用實體包中的clientcmd,如下代碼所示:

import(
...
"k8s.io/client-go/tools/clientcmd"
)
funcmain(){
kubeconfig:=filepath.Join(
os.Getenv("HOME"),".kube","config",
)
config,err:=clientcmd.BuildConfigFromFlags("",kubeconfig)
iferr!=nil{
log.Fatal(err)
}
...
}

_Client-go_通過提供實體功能來從不同的上下文中獲取你的配置,從而使之成為一個不重要的任務(wù)。

從config文件

正如上面的例子所做的那樣,你能從kubeconfig文件啟動配置來連接API server。當你的代碼運行在集群之外的時候這是一個理想的方案。clientcmd.BuildConfigFromFlags("", configFile)

從集群

當你的代碼運行在這個集群中的時候,你可以用上面的函數(shù)并且不使用任何參數(shù),這個函數(shù)就會通過集群的信息去連接api server。

clientcmd.BuildConfigFromFlags("", "")

或者我們可以通過rest包來創(chuàng)建一個使用集群中的信息去配置啟動的(譯者注:k8s里所有的Pod都會以Volume的方式自動掛載k8s里面默認的ServiceAccount,所以會用默認的ServiceAccount的授權(quán)信息),如下:

import "k8s.io/client-go/rest"
...
rest.InClusterConfig()

創(chuàng)建一個clientset

我們需要創(chuàng)建一個序列化的client為了讓我們獲取API對象。在kubernetes包中的Clientset類型定義,提供了去訪問公開的API對象的序列化client,如下:

typeClientsetstruct{
*authenticationv1beta1.AuthenticationV1beta1Client
*authorizationv1.AuthorizationV1Client
...
*corev1.CoreV1Client
}

一旦我們有正確的配置連接,我們就能使用這個配置去初始化一個clientset,如下:

funcmain(){
config,err:=clientcmd.BuildConfigFromFlags("",kubeconfig)
...
clientset,err:=kubernetes.NewForConfig(config)
iferr!=nil{
log.Fatal(err)
}
}

對于我們的例子,我們使用的是v1的API對象。下一步,我們要使用clientset通過CoreV1()去訪問核心api資源,如下:

funcmain(){
...
clientset,err:=kubernetes.NewForConfig(config)
iferr!=nil{
log.Fatal(err)
}
api:=clientset.CoreV1()
}

你能在這里看到可以獲得clientsets。

獲取集群的PVC列表

我們對clientset執(zhí)行的最基本操作之一獲取存儲的API對象的列表。在我們的例子中,我們將要拿到一個namespace下面的pvc列表,如下:

import(
...
metav1"k8s.io/apimachinery/pkg/apis/meta/v1"
)
funcmain(){
varns,label,fieldstring
flag.StringVar(&ns,"namespace","","namespace")
flag.StringVar(&label,"l","","Labelselector")
flag.StringVar(&field,"f","","Fieldselector")
...
api:=clientset.CoreV1()
//setuplistoptions
listOptions:=metav1.ListOptions{
LabelSelector:label,
FieldSelector:field,
}
pvcs,err:=api.PersistentVolumeClaims(ns).List(listOptions)
iferr!=nil{
log.Fatal(err)
}
printPVCs(pvcs)
...
}

在上面的代碼中,我們使用ListOptions指定 label 和 field selectors (還有namespace)來縮小pvc列表的范圍,這個結(jié)果的返回類型是v1.PeristentVolumeClaimList。下面的這個代碼展示了我們?nèi)绾稳ケ闅v和打印從api server中獲取的pvc列表。

funcprintPVCs(pvcs*v1.PersistentVolumeClaimList){
template:="%-32s%-8s%-8s
"
fmt.Printf(template,"NAME","STATUS","CAPACITY")
for_,pvc:=rangepvcs.Items{
quant:=pvc.Spec.Resources.Requests[v1.ResourceStorage]
fmt.Printf(
template,
pvc.Name,
string(pvc.Status.Phase),
quant.String())
}
}

監(jiān)聽集群中pvc

k8s的Go client框架支持為指定的API對象在其生命周期事件中監(jiān)聽集群的能力,包括創(chuàng)建,更新,刪除一個指定對象時候觸發(fā)的CREATED,MODIFIED,DELETED事件。對于我們的命令行工具,我們將要監(jiān)聽在集群中已經(jīng)聲明的PVC的總量。

對于某一個namespace,當pvc的容量到達了某一個閾值(比如說200Gi),我們將會采取某個動作。為了簡單起見,我們將要在屏幕上打印個通知。但是在更復(fù)雜的實現(xiàn)中,可以使用相同的辦法觸發(fā)一個自動操作。

啟動監(jiān)聽功能

現(xiàn)在讓我們?yōu)?code style="font-size:14px;font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;padding:2px 4px;margin-right:2px;margin-left:2px;color:rgb(233,105,0);background:rgb(248,248,248);">PersistentVolumeClaim這個資源通過Watch去創(chuàng)建一個監(jiān)聽器。然后這個監(jiān)聽器通過ResultChan從go的channel中訪問事件通知。

funcmain(){
...
api:=clientset.CoreV1()
listOptions:=metav1.ListOptions{
LabelSelector:label,
FieldSelector:field,
}
watcher,err:=api.PersistentVolumeClaims(ns).
Watch(listOptions)
iferr!=nil{
log.Fatal(err)
}
ch:=watcher.ResultChan()
...
}

循環(huán)事件

接下來我們將要處理資源事件。但是在我們處理事件之前,我們先聲明resource.Quantity類型的的兩個變量為maxClaimsQuanttotalClaimQuant來分別表示我們的申請資源閾值(譯者注:代表某個ns下集群中運行的PVC申請的上限)和運行總數(shù)。

import(
"k8s.io/apimachinery/pkg/api/resource"
...
)
funcmain(){
varmaxClaimsstring
flag.StringVar(&maxClaims,"max-claims","200Gi",
"Maximumtotalclaimstowatch")
vartotalClaimedQuantresource.Quantity
maxClaimedQuant:=resource.MustParse(maxClaims)
...
ch:=watcher.ResultChan()
forevent:=rangech{
pvc,ok:=event.Object.(*v1.PersistentVolumeClaim)
if!ok{
log.Fatal("unexpectedtype")
}
...
}
}

在上面的for-range循環(huán)中,watcher的channel用于處理來自服務(wù)器傳入的通知。每個事件賦值給變量event,并且event.Object的類型被聲明為PersistentVolumeClaim類型,所以我們能從中提取出來。

處理ADDED事件

當一個新的PVC創(chuàng)建的時候,event.Type的值被設(shè)置為watch.Added。然后我們用下面的代碼去獲取新增的聲明的容量(quant),將其添加到正在運行的總?cè)萘恐校?code style="font-size:14px;font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;padding:2px 4px;margin-right:2px;margin-left:2px;color:rgb(233,105,0);background:rgb(248,248,248);">totalClaimedQuant)。最后我們?nèi)z查是否當前的容量總值大于當初設(shè)定的最大值(maxClaimedQuant),如果大于的話我們就觸發(fā)一個事件。

import(
"k8s.io/apimachinery/pkg/watch"
...
)
funcmain(){
...
forevent:=rangech{
pvc,ok:=event.Object.(*v1.PersistentVolumeClaim)
if!ok{
log.Fatal("unexpectedtype")
}
quant:=pvc.Spec.Resources.Requests[v1.ResourceStorage]
switchevent.Type{
casewatch.Added:
totalClaimedQuant.Add(quant)
log.Printf("PVC%sadded,claimsize%s
",
pvc.Name,quant.String())
iftotalClaimedQuant.Cmp(maxClaimedQuant)==1{
log.Printf(
"
Claimoveragereached:max%sat%s",
maxClaimedQuant.String(),
totalClaimedQuant.String())
//triggeraction
log.Println("***Takingaction***")
}
}
...
}
}
}

處理DELETED事件

代碼也會在PVC被刪除的時候做出反應(yīng),它執(zhí)行相反的邏輯以及把被刪除的這個PVC申請的容量在正在運行的容量的總值里面減去。

funcmain(){
...
forevent:=rangech{
...
switchevent.Type{
casewatch.Deleted:
quant:=pvc.Spec.Resources.Requests[v1.ResourceStorage]
totalClaimedQuant.Sub(quant)
log.Printf("PVC%sremoved,size%s
",
pvc.Name,quant.String())
iftotalClaimedQuant.Cmp(maxClaimedQuant)<=?0{
log.Printf("Claimusagenormal:max%sat%s",
maxClaimedQuant.String(),
totalClaimedQuant.String(),
)
//triggeraction
log.Println("***Takingaction***")
}
}
...
}
}

運行程序

當程序在一個運行中的集群被執(zhí)行的時候,首先會列出PVC的列表。然后開始監(jiān)聽集群中新的PersistentVolumeClaim事件。

$>./pvcwatch
Usingkubeconfig:/Users/vladimir/.kube/config
---PVCs----
NAMESTATUSCAPACITY
my-redis-redisBound50Gi
my-redis2-redisBound100Gi
-----------------------------
Totalcapacityclaimed:150Gi
-----------------------------
---PVCWatch(maxclaims200Gi)----
2018/02/1321:55:03PVCmy-redis2-redisadded,claimsize100Gi
2018/02/1321:55:03
At50.0%claimcapcity(100Gi/200Gi)
2018/02/1321:55:03PVCmy-redis-redisadded,claimsize50Gi
2018/02/1321:55:03
At75.0%claimcapcity(150Gi/200Gi)

下面讓我們部署一個應(yīng)用到集群中,這個應(yīng)用會申請75Gi容量的存儲。(例如,讓我們通過helm去部署一個實例influxdb)。

helminstall--namemy-influx
--setpersistence.enabled=true,persistence.size=75Gistable/influxdb

正如下面你看到的,我們的工具立刻反應(yīng)出來有個新的聲明以及一個警告因為當前的運行的聲明總量已經(jīng)大于我們設(shè)定的閾值。

---PVCWatch(maxclaims200Gi)----
...
2018/02/1321:55:03
At75.0%claimcapcity(150Gi/200Gi)
2018/02/1322:01:29PVCmy-influx-influxdbadded,claimsize75Gi
2018/02/1322:01:29
Claimoveragereached:max200Giat225Gi
2018/02/1322:01:29***Takingaction***
2018/02/1322:01:29
At112.5%claimcapcity(225Gi/200Gi)

相反,從集群中刪除一個PVC的時候,該工具會相應(yīng)展示提示信息。

...
At 112.5% claim capcity (225Gi/200Gi)
2018/02/14 1136 PVC my-redis2-redis removed, size 100Gi
2018/02/14 1136 Claim usage normal: max 200Gi at 125Gi
2018/02/14 1136 *** Taking action ***

總結(jié)

這篇文章是進行的系列的一部分,使用Go語言的官方k8s客戶端與API server進行交互。和以前一樣,這個代碼會逐步的去實現(xiàn)一個命令行工具去監(jiān)聽指定namespace下面的PVC的大小。這個代碼實現(xiàn)了一個簡單的監(jiān)聽列表去觸發(fā)從服務(wù)器返回的資源事件。

責任編輯:xj

原文標題:使用 Go 構(gòu)建 Kubernetes 應(yīng)用

文章出處:【微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Client
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    9293
  • kubernetes
    +關(guān)注

    關(guān)注

    0

    文章

    257

    瀏覽量

    9480

原文標題:使用 Go 構(gòu)建 Kubernetes 應(yīng)用

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    文帶你徹底搞懂K8s網(wǎng)絡(luò)

    說實話,K8s 網(wǎng)絡(luò)是我見過最讓新手頭疼的知識點,沒有之。記得我剛接觸 K8s 那會兒,看著流量在 Pod、Service、Node 之間穿梭,完全是臉懵逼。后來踩了無數(shù)坑,熬了無
    的頭像 發(fā)表于 02-06 10:15 ?265次閱讀

    K8s生產(chǎn)環(huán)境10大踩坑記錄復(fù)盤

    這篇文章記錄了我這些年在 K8s 生產(chǎn)環(huán)境踩過的坑。每一個案例都是血淚教訓(xùn),有些甚至導(dǎo)致了生產(chǎn)事故。希望通過分享這些經(jīng)歷,能幫助大家避免重蹈覆轍。
    的頭像 發(fā)表于 02-05 15:51 ?211次閱讀

    香港服務(wù)器支持Docker和Kubernetes嗎?

    在云原生技術(shù)成為主流的今天,Docker和KubernetesK8s)已成為現(xiàn)代化應(yīng)用開發(fā)和部署的事實標準。對于選擇香港服務(wù)器的開發(fā)者與企業(yè)而言,核心問題是:香港服務(wù)器能否完美支
    的頭像 發(fā)表于 10-21 15:47 ?618次閱讀

    K8s集群性能調(diào)優(yōu)實戰(zhàn)技巧

    大多數(shù)團隊在遇到K8s性能問題時,第反應(yīng)是"加機器"。但根據(jù)我對超過50生產(chǎn)集群的分析,80%的性能問題源于配置不當,而非資源不足。
    的頭像 發(fā)表于 09-08 09:36 ?761次閱讀

    K8s存儲類設(shè)計與Ceph集成實戰(zhàn)

    在云原生時代,存儲是制約應(yīng)用性能的關(guān)鍵瓶頸。本文將帶你深入理解K8s存儲類的設(shè)計原理,并手把手實現(xiàn)與Ceph的完美集成,讓你的集群存儲性能提升300%!
    的頭像 發(fā)表于 08-22 11:50 ?832次閱讀

    Kubernetes安全加固的核心技術(shù)

    在生產(chǎn)環(huán)境中,Kubernetes集群的安全性直接關(guān)系到企業(yè)數(shù)據(jù)安全和業(yè)務(wù)穩(wěn)定性。本文將從實戰(zhàn)角度,帶你掌握K8s安全加固的核心技術(shù)。
    的頭像 發(fā)表于 08-18 11:18 ?771次閱讀

    高效管理Kubernetes集群的實用技巧

    作為名經(jīng)驗豐富的運維工程師,我深知在日常的Kubernetes集群管理中,熟練掌握kubectl命令是提升工作效率的關(guān)鍵。今天,我將分享15經(jīng)過實戰(zhàn)檢驗的kubectl實用技巧,幫助你像藝術(shù)家
    的頭像 發(fā)表于 08-13 15:57 ?875次閱讀

    解析K8S實用命令

    前言: 作為運維工程師,掌握 Kubernetes 命令行工具是日常工作的核心技能。本文將深入解析 K8S 最實用的命令,從基礎(chǔ)操作到高級技巧,助你成為容器化集群管理專家。
    的頭像 發(fā)表于 07-24 14:07 ?837次閱讀

    k8s權(quán)限管理指南說明

    我們在目前的k8s集群環(huán)境里面,只能在master節(jié)點上執(zhí)行kubectl的些命令,在其他節(jié)點上執(zhí)行就會報錯。
    的頭像 發(fā)表于 06-26 14:06 ?704次閱讀

    什么是 K8S,如何使用 K8S

    Kubernetes(簡稱K8S)是用于管理容器化應(yīng)用程序的開源平臺。以下是關(guān)于K8S及其使用方法的介紹:
    發(fā)表于 06-25 06:45

    k8s網(wǎng)絡(luò)的基本介紹

    Kubernetes網(wǎng)絡(luò)是指在Kubernetes集群中不同組件之間進行通信和交互的網(wǎng)絡(luò)架構(gòu)。
    的頭像 發(fā)表于 06-16 13:42 ?903次閱讀

    詳解Kubernetes中的Pod調(diào)度親和性

    KubernetesK8s)中,Pod 調(diào)度親和性(Affinity) 是種高級調(diào)度策略,用于控制 Pod 與節(jié)點(Node)或其他 Pod 之間的關(guān)聯(lián)(親和)或反關(guān)聯(lián)(反親和)關(guān)系。通過親和性規(guī)則,管理員可以更精細地控
    的頭像 發(fā)表于 06-07 13:56 ?910次閱讀

    簡述K3SK8S的區(qū)別

    K3s 是CNCF 認證的 Kubernetes 發(fā)行版和Sandbox項目,專為低資源環(huán)境而設(shè)計。由 Rancher Labs 維護著 K3s
    的頭像 發(fā)表于 04-18 10:27 ?1651次閱讀

    如何通過Docker和K8S集群實現(xiàn)高效調(diào)用GPU

    在有GPU資源的主機安裝,改主機作為K8S集群的Node。
    的頭像 發(fā)表于 03-18 16:50 ?1186次閱讀
    如何通過Docker和<b class='flag-5'>K8S</b>集群實現(xiàn)高效調(diào)用GPU

    搭建k8s需要買幾臺云主機?

    至少3臺。搭建KubernetesK8s)集群所需的云主機數(shù)量因?qū)嶋H需求而異。基本的K8s集群通常需要至少3臺云主機,包括1
    的頭像 發(fā)表于 02-20 10:40 ?1091次閱讀