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

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

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

如何使用kubernetes client-go實(shí)踐一個(gè)簡(jiǎn)單的與K8s交互過(guò)程

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 作者:Vladimir Vivien ? 2021-02-02 11:16 ? 次閱讀

【導(dǎo)讀】Kubernetes項(xiàng)目使用Go語(yǔ)言編寫(xiě),對(duì)Go api原生支持非常便捷。本篇文章介紹了如何使用kubernetes client-go實(shí)踐一個(gè)簡(jiǎn)單的與K8s交互過(guò)程。

kubernetes 的Go Client項(xiàng)目(client-go)

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

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

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

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

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

一個(gè)簡(jiǎn)單的k8s client 工具

讓我們?cè)俅位仡櫸覀儗⒁獦?gòu)建的工具,來(lái)說(shuō)明go client的用法。pvcwatch是一個(gè)簡(jiǎn)單的命令行工具,它可以監(jiān)聽(tīng)集群中聲明的PVC容量。當(dāng)總數(shù)到達(dá)一個(gè)閾值的時(shí)候,他會(huì)采取一個(gè)action(在這個(gè)例子中是在屏幕上通知顯示)

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

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

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

Setup

client-go支持Godep和dep作為vendor的管理程序,我覺(jué)得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"

運(yùn)行dep ensure確保剩下的工作。

連接 API Server

我們Go client的第一步就是建立一個(gè)與API Server的連接。為了做到這一點(diǎn),我們要使用實(shí)體包中的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_通過(guò)提供實(shí)體功能來(lái)從不同的上下文中獲取你的配置,從而使之成為一個(gè)不重要的任務(wù)。

從config文件

正如上面的例子所做的那樣,你能從kubeconfig文件啟動(dòng)配置來(lái)連接API server。當(dāng)你的代碼運(yùn)行在集群之外的時(shí)候這是一個(gè)理想的方案。clientcmd.BuildConfigFromFlags("", configFile)

從集群

當(dāng)你的代碼運(yùn)行在這個(gè)集群中的時(shí)候,你可以用上面的函數(shù)并且不使用任何參數(shù),這個(gè)函數(shù)就會(huì)通過(guò)集群的信息去連接api server。

clientcmd.BuildConfigFromFlags("", "")

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

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

創(chuàng)建一個(gè)clientset

我們需要?jiǎng)?chuàng)建一個(gè)序列化的client為了讓我們獲取API對(duì)象。在kubernetes包中的Clientset類(lèi)型定義,提供了去訪問(wèn)公開(kāi)的API對(duì)象的序列化client,如下:

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

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

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

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

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

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

獲取集群的PVC列表

我們對(duì)clientset執(zhí)行的最基本操作之一獲取存儲(chǔ)的API對(duì)象的列表。在我們的例子中,我們將要拿到一個(gè)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)來(lái)縮小pvc列表的范圍,這個(gè)結(jié)果的返回類(lèi)型是v1.PeristentVolumeClaimList。下面的這個(gè)代碼展示了我們?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)聽(tīng)集群中pvc

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

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

啟動(dòng)監(jiān)聽(tīng)功能

現(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這個(gè)資源通過(guò)Watch去創(chuàng)建一個(gè)監(jiān)聽(tīng)器。然后這個(gè)監(jiān)聽(tīng)器通過(guò)ResultChan從go的channel中訪問(wèn)事件通知。

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)事件

接下來(lái)我們將要處理資源事件。但是在我們處理事件之前,我們先聲明resource.Quantity類(lèi)型的的兩個(gè)變量為maxClaimsQuanttotalClaimQuant來(lái)分別表示我們的申請(qǐng)資源閾值(譯者注:代表某個(gè)ns下集群中運(yùn)行的PVC申請(qǐng)的上限)和運(yùn)行總數(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用于處理來(lái)自服務(wù)器傳入的通知。每個(gè)事件賦值給變量event,并且event.Object的類(lèi)型被聲明為PersistentVolumeClaim類(lèi)型,所以我們能從中提取出來(lái)。

處理ADDED事件

當(dāng)一個(gè)新的PVC創(chuàng)建的時(shí)候,event.Type的值被設(shè)置為watch.Added。然后我們用下面的代碼去獲取新增的聲明的容量(quant),將其添加到正在運(yùn)行的總?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查是否當(dāng)前的容量總值大于當(dāng)初設(shè)定的最大值(maxClaimedQuant),如果大于的話(huà)我們就觸發(fā)一個(gè)事件。

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事件

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

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***")
}
}
...
}
}

運(yùn)行程序

當(dāng)程序在一個(gè)運(yùn)行中的集群被執(zhí)行的時(shí)候,首先會(huì)列出PVC的列表。然后開(kāi)始監(jiān)聽(tīng)集群中新的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)

下面讓我們部署一個(gè)應(yīng)用到集群中,這個(gè)應(yīng)用會(huì)申請(qǐng)75Gi容量的存儲(chǔ)。(例如,讓我們通過(guò)helm去部署一個(gè)實(shí)例influxdb)。

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

正如下面你看到的,我們的工具立刻反應(yīng)出來(lái)有個(gè)新的聲明以及一個(gè)警告因?yàn)楫?dāng)前的運(yùn)行的聲明總量已經(jīng)大于我們?cè)O(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)

相反,從集群中刪除一個(gè)PVC的時(shí)候,該工具會(huì)相應(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é)

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

責(zé)任編輯:xj

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

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


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

    關(guān)注

    0

    文章

    10

    瀏覽量

    8749
  • kubernetes
    +關(guān)注

    關(guān)注

    0

    文章

    223

    瀏覽量

    8683

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    混合云部署k8s集群方法是首先需在本地與公有云分別建立K8s集群,并確保網(wǎng)絡(luò)連接。接著,配置kubeconfig文件連接兩集群,并安裝云服務(wù)插件以實(shí)現(xiàn)資源互通。然后,編寫(xiě)Deployment文件部署應(yīng)用,并使用kubectl命令應(yīng)用至集群。最后,驗(yàn)證應(yīng)用狀態(tài)并監(jiān)控集群性能
    的頭像 發(fā)表于 11-07 09:37 ?61次閱讀

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

    Kubernetes(簡(jiǎn)稱(chēng)K8S)可以部署私有云。Kubernetes個(gè)開(kāi)源的容器編排引擎,能夠自動(dòng)化容器的部署、擴(kuò)展和管理,使得應(yīng)用可
    的頭像 發(fā)表于 10-25 09:32 ?108次閱讀

    k8s云原生開(kāi)發(fā)要求

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

    k8s容器啟動(dòng)失敗的常見(jiàn)原因及解決辦法

    k8s容器啟動(dòng)失敗的問(wèn)題通常出現(xiàn)在開(kāi)發(fā)者使用Kubernetes進(jìn)行容器編排時(shí),可能的原因有多種,例如:配置錯(cuò)誤、鏡像問(wèn)題、資源限制、依賴(lài)問(wèn)題、網(wǎng)絡(luò)問(wèn)題、節(jié)點(diǎn)狀態(tài)異常、其他因素等,以下是對(duì)這些常見(jiàn)原因的詳細(xì)分析:
    的頭像 發(fā)表于 10-11 10:12 ?158次閱讀

    云服務(wù)器部署k8s需要什么配置?

    云服務(wù)器部署K8s需要至少2核CPU、4GB內(nèi)存、50GBSSD存儲(chǔ)的主節(jié)點(diǎn)用于管理集群,工作節(jié)點(diǎn)建議至少2核CPU、2GB內(nèi)存、20GBSSD。還需安裝Docker,選擇兼容的Kubernetes版本,配置網(wǎng)絡(luò)插件,以及確保系統(tǒng)安全、監(jiān)控和備份措施到位。
    的頭像 發(fā)表于 10-09 15:31 ?151次閱讀

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

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

    常用的k8s容器網(wǎng)絡(luò)模式有哪些?

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

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

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

    如何使用Kubeadm命令在PetaExpress Ubuntu系統(tǒng)上安裝Kubernetes集群

    Kubernetes,通??s寫(xiě)為K8s,是個(gè)開(kāi)源的容器編排平臺(tái),旨在自動(dòng)化容器化應(yīng)用的部署、擴(kuò)展和管理。有了Kubernetes,您可以輕
    的頭像 發(fā)表于 07-15 13:31 ?792次閱讀
    如何使用Kubeadm命令在PetaExpress Ubuntu系統(tǒng)上安裝<b class='flag-5'>Kubernetes</b>集群

    K8S學(xué)習(xí)教程三:在PetaExpress KubeSphere 容器部署 Wiki 系統(tǒng) wiki.js 并啟用中文全文檢索

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

    K8S學(xué)習(xí)教程(二):在 PetaExpress KubeSphere容器平臺(tái)部署高可用 Redis 集群

    并且需要手動(dòng)重啟節(jié)點(diǎn),相較之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服務(wù) 進(jìn)行 Redis 集群的部署,則展現(xiàn)出了顯著的優(yōu)勢(shì): 1、安裝便捷:使用鏡像或者 yaml 配置文件即可件安裝,極大地
    的頭像 發(fā)表于 07-03 15:30 ?637次閱讀
    <b class='flag-5'>K8S</b>學(xué)習(xí)教程(二):在 PetaExpress KubeSphere容器平臺(tái)部署高可用 Redis 集群

    Kubectl核心命令總結(jié):如何快速掌握K8s

    設(shè)置 kubectl 命令交互kubernetes 集群并修改配置信息。參閱 使用 kubeconfig 文件進(jìn)行跨集群驗(yàn)證 獲取關(guān)于配置文件的詳細(xì)信息。
    的頭像 發(fā)表于 02-23 14:43 ?426次閱讀
    Kubectl核心命令總結(jié):如何快速掌握<b class='flag-5'>K8s</b>

    K8s容器debug高級(jí)技巧

    如果您在 Kubernetes 上運(yùn)行軟件,您會(huì)想要在某些時(shí)候去調(diào)試您所部署的軟件的些方面。對(duì)于習(xí)慣于使用虛擬機(jī) (VMs) 的人來(lái)說(shuō)能自然使用的簡(jiǎn)單的調(diào)試方法,就是連接到
    的頭像 發(fā)表于 01-12 11:31 ?517次閱讀

    K8S落地實(shí)踐經(jīng)驗(yàn)分享

    k8sKubernetes,是個(gè)開(kāi)源的容器編排引擎,用來(lái)對(duì)容器化應(yīng)用進(jìn)行自動(dòng)化部署、 擴(kuò)縮和管理。
    的頭像 發(fā)表于 01-02 11:45 ?1005次閱讀
    <b class='flag-5'>K8S</b>落地<b class='flag-5'>實(shí)踐</b>經(jīng)驗(yàn)分享

    使用Kubectl進(jìn)行Kubernetes診斷的指南

    今天浩道跟大家分享100個(gè)K8S常見(jiàn)命令,看看大家都用過(guò)幾個(gè),用過(guò)半以上可以稱(chēng)為高手了!
    的頭像 發(fā)表于 12-07 11:26 ?1138次閱讀