那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

Linux愛好者 ? 來源:Linux愛好者 ? 作者:Vladimir Vivien ? 2021-02-02 11:16 ? 次閱讀

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

kubernetes 的Go Client項目(client-go)

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

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

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

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

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

一個簡單的k8s client 工具

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

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

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

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

Setup

client-go支持Godep和dep作為vendor的管理程序,我覺得dep便于使用所以繼續使用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_通過提供實體功能來從不同的上下文中獲取你的配置,從而使之成為一個不重要的任務。

從config文件

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

從集群

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

clientcmd.BuildConfigFromFlags("", "")

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

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

創建一個clientset

我們需要創建一個序列化的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執行的最基本操作之一獲取存儲的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列表的范圍,這個結果的返回類型是v1.PeristentVolumeClaimList。下面的這個代碼展示了我們如何去遍歷和打印從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())
}
}

監聽集群中pvc

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

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

啟動監聽功能

現在讓我們為PersistentVolumeClaim這個資源通過Watch去創建一個監聽器。然后這個監聽器通過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()
...
}

循環事件

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

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循環中,watcher的channel用于處理來自服務器傳入的通知。每個事件賦值給變量event,并且event.Object的類型被聲明為PersistentVolumeClaim類型,所以我們能從中提取出來。

處理ADDED事件

當一個新的PVC創建的時候,event.Type的值被設置為watch.Added。然后我們用下面的代碼去獲取新增的聲明的容量(quant),將其添加到正在運行的總容量中(totalClaimedQuant)。最后我們去檢查是否當前的容量總值大于當初設定的最大值(maxClaimedQuant),如果大于的話我們就觸發一個事件。

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被刪除的時候做出反應,它執行相反的邏輯以及把被刪除的這個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***")
}
}
...
}
}

運行程序

當程序在一個運行中的集群被執行的時候,首先會列出PVC的列表。然后開始監聽集群中新的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)

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

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

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

---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的時候,該工具會相應展示提示信息。

...
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 ***

總結

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

責任編輯:xj

原文標題:使用 Go 構建 Kubernetes 應用

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


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Client
    +關注

    關注

    0

    文章

    10

    瀏覽量

    8827
  • kubernetes
    +關注

    關注

    0

    文章

    227

    瀏覽量

    8752

原文標題:使用 Go 構建 Kubernetes 應用

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

收藏 人收藏

    評論

    相關推薦

    k8s和docker區別對比,哪個更強?

    Docker和KubernetesK8s)是容器化技術的兩大流行工具。Docker關注構建和打包容器,適用于本地開發和單主機管理;而K8s則提供容器編排和管理平臺,適用于多主機或云環境,具備自動化
    的頭像 發表于 12-11 13:55 ?180次閱讀

    k8s微服務架構就是云原生嗎?兩者是什么關系

    k8s微服務架構就是云原生嗎?K8s微服務架構并不等同于云原生,但兩者之間存在密切的聯系。Kubernetes在云原生架構中扮演著核心組件的角色,它簡化了容器化應用程序的管理,提供了彈性、自動化
    的頭像 發表于 11-25 09:39 ?196次閱讀

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地與公有云分別建立K8s集群,并確保網絡連接。接著,配置kubeconfig文件連接兩集群,并安裝云服務插件以實現資源互通。然后,編寫Deployment文件部署應用,并使用kubectl命令應用至集群。最后,驗證應用狀態并監控集群性能
    的頭像 發表于 11-07 09:37 ?189次閱讀

    k8s可以部署私有云嗎?私有云部署全攻略

    Kubernetes(簡稱K8S)可以部署私有云。Kubernetes開源的容器編排引擎,能夠自動化容器的部署、擴展和管理,使得應用可
    的頭像 發表于 10-25 09:32 ?207次閱讀

    k8s云原生開發要求

    KubernetesK8s)云原生開發對硬件有定要求。CPU方面,建議至少配備2邏輯核心,高性能CPU更佳。內存至少4GB,但8GB或
    的頭像 發表于 10-24 10:03 ?276次閱讀
    <b class='flag-5'>k8s</b>云原生開發要求

    k8s容器啟動失敗的常見原因及解決辦法

    k8s容器啟動失敗的問題通常出現在開發者使用Kubernetes進行容器編排時,可能的原因有多種,例如:配置錯誤、鏡像問題、資源限制、依賴問題、網絡問題、節點狀態異常、其他因素等,以下是對這些常見原因的詳細分析:
    的頭像 發表于 10-11 10:12 ?322次閱讀

    云服務器部署k8s需要什么配置?

    云服務器部署K8s需要至少2核CPU、4GB內存、50GBSSD存儲的主節點用于管理集群,工作節點建議至少2核CPU、2GB內存、20GBSSD。還需安裝Docker,選擇兼容的Kubernetes版本,配置網絡插件,以及確保系統安全、監控和備份措施到位。
    的頭像 發表于 10-09 15:31 ?247次閱讀

    納尼?自建K8s集群日志收集還能通過JMQ保存到JES

    作者:京東科技 劉恩浩 、背景 基于K8s集群的私有化交付方案中,日志收集采用了ilogtail+logstash+kafka+es方案,其中ilogtail負責日志收集,logstash負責對數
    的頭像 發表于 09-30 14:45 ?243次閱讀

    常用的k8s容器網絡模式有哪些?

    常用的k8s容器網絡模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s的容器網絡模式多種多樣
    的頭像 發表于 09-19 11:29 ?299次閱讀

    基于DPU與SmartNIC的K8s Service解決方案

    1.? 方案背景 1.1. Kubernetes Service介紹 Kubernetes Service是Kubernetes中的核心
    的頭像 發表于 09-02 17:01 ?1023次閱讀
    基于DPU與SmartNIC的<b class='flag-5'>K8s</b> Service解決方案

    如何使用Kubeadm命令在PetaExpress Ubuntu系統上安裝Kubernetes集群

    Kubernetes,通常縮寫為K8s,是開源的容器編排平臺,旨在自動化容器化應用的部署、擴展和管理。有了Kubernetes,您可以輕
    的頭像 發表于 07-15 13:31 ?911次閱讀
    如何使用Kubeadm命令在PetaExpress Ubuntu系統上安裝<b class='flag-5'>Kubernetes</b>集群

    K8S學習教程三:在PetaExpress KubeSphere 容器部署 Wiki 系統 wiki.js 并啟用中文全文檢索

    K8S學習教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系統 wiki.js 并啟用中文全文檢索? 。
    的頭像 發表于 07-08 17:03 ?696次閱讀
    <b class='flag-5'>K8S</b>學習教程三:在PetaExpress KubeSphere 容器部署 Wiki 系統 wiki.js 并啟用中文全文檢索

    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 Redis 集群

    并且需要手動重啟節點,相較之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服務 進行 Redis 集群的部署,則展現出了顯著的優勢: 1、安裝便捷:使用鏡像或者 yaml 配置文件即可件安裝,極大地
    的頭像 發表于 07-03 15:30 ?837次閱讀
    <b class='flag-5'>K8S</b>學習教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 Redis 集群

     K8S學習教程:使用PetaExpress云服務器安裝Minikube 集群

    使得開發人員能夠在本地機器上輕松創建單節點的 Kubernetes 集群,從而方便開發、測試和學習 Kubernetes。 我們看下如何使用PetaExpress云服務器安裝Mi
    的頭像 發表于 07-01 15:41 ?417次閱讀
     <b class='flag-5'>K8S</b>學習教程<b class='flag-5'>一</b>:使用PetaExpress云服務器安裝Minikube 集群

    Kubectl核心命令總結:如何快速掌握K8s

    設置 kubectl 命令交互kubernetes 集群并修改配置信息。參閱 使用 kubeconfig 文件進行跨集群驗證 獲取關于配置文件的詳細信息。
    的頭像 發表于 02-23 14:43 ?501次閱讀
    Kubectl核心命令總結:如何快速掌握<b class='flag-5'>K8s</b>
    bet365体育开户| 百家乐押注最高是多少| 互博百家乐官网现金网| 粤港澳百家乐赌场娱乐网规则 | 百家乐游戏客户端| 澳门百家乐官网职业| 太阳城巧克力社区怎么样| 百家乐官网3式打法微笑心法| 钟山县| 博发百家乐的玩法技巧和规则| 百家乐官网庄闲符号记| 同乐城| 大世界百家乐的玩法技巧和规则| 将军百家乐官网的玩法技巧和规则| 环澳娱乐| 长赢百家乐赌徒| 租nongcun房看风水做生意的| 百家乐官网美女视频| 在线水果机游戏| 打百家乐如何赢分| 诚信百家乐官网平台| 大发888官方网站| 百家乐怎么骗人| 大众百家乐官网的玩法技巧和规则| 六枝特区| 大发888官方备用网址| 百家乐大小点桌子| 百家乐官网娱乐真人娱乐| 伟德百家乐官网下载| 大发888娱乐城官方下载安装| 百家乐官网赌场代理荐| 百乐门娱乐城| 大发888老虎机下载免费| 作弊百家乐赌具| 网络百家乐官网会输钱的多吗| 永利高百家乐官网进不去| 立博| 太阳城娱乐场| 现场百家乐电话投注| 可信百家乐官网的玩法技巧和规则 | 澳门百家乐搏牌规则|