網站首頁 編程語言 正文
作為k8s官方維護的客戶端,k8s go-client對于go語言中使用k8s可以說是唯一選項。但是官方的使用示例我個人覺得并不是很清晰,尤其是對于對于k8s并不熟悉的用戶。這里我總結一下使用過程中碰到的坑,也希望能給有需要的人一些參考。
首先從官方示例說起:這里先解釋一下k8s連接問題。集群的節點上會有一個.kube目錄(這個目錄一般在root用戶home目錄下)目錄中會存在一個config文件,文件中記錄了連接k8s集群所需的所有信息,如apiserver地址,用戶認證token等。一般來說客戶端連接集群均需要此配置文件。一下就是官方示例代碼。
var kubeconfig *string //配置了config目錄就讀取該目錄下的config信息 if home := homedir.HomeDir(); home != "" { kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file") } else { //否則就需要指定配置文件路徑 kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") } flag.Parse() config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) }
可以看到初始化go-client必須要指定config文件。但是實際使用中往往沒有這里理想化,比如我們的代碼運行在集群外,再比如我們的代碼連接的client需要在不同集群上來回切換,更甚者我們需要連接的集群會隨時改變,集群數量改變,集群的連接信息改變。總之很多情況下無法直接從集群獲取到config文件,也無法使用固定的config文件。
總體上來說,使用場景包括集群內和集群外訪問,同時也可以分為固定訪問和動態訪問。對于集群內且集群的配置是固定的,使用起來還是相當簡單。
1、集群內且集群配置固定,以進程方式運行,即代碼編譯后直接以進程的方式運行在集群的某個節點上且只會訪問本地或外部固定集群。這種情況下,本地集群config文件路徑是固定的,外部集群可以提前把config文件放到本地,使用示例代碼的配置方式即可
2、集群內且集群配置固定,以pod方式運行。對于本地集群,雖然pod就跑在集群中,但是容器的因為隔離性,無法獲取集群的配置信息。此時可以通過默認配置跟k8s RBAC進行本地集群訪問,即使用pod中的默認apiserver地址和端口環境變量(可以直接使用go-client的默認config rest.InclusterConfig)連接集群,同時給pod配置集群的admin角色即可。也可以將.kube目錄掛載到pod上,通過讀取該目錄中的配置文件初始化客戶端。訪問外部集群跟1中的方式無太大差別。
3、需要訪問的集群不固定(集群數量隨時增減,集群認證信息會過期),這種情況下無論是否運行在容器中都不太好使用官方的示例代碼來連接集群。此種情況下需要一個能夠獲取集群認證信息(token,user password等)的地方。有了這些信息代碼中就可以手動新建config,通過這個config來初始化集群,同時在認證信息失效后及時重新初始化
手動指定apiserver地址,這里地址可以是url也可以主機加端口 ??
kubeconfig,er := clientcmd.BuildConfigFromFlags(apiUrl,"")
配置認證信息,token或者用戶名加密碼或者其他認證方式
kubeconfig.BearerToken = token
初始化client
clientset, err := kubernetes.NewFo,rConfig(kubeconfig)
當發生變動或者認證信息失效時,客戶端或報相應的權限錯誤,即可重新獲取認證信息,重新初始化。這樣可以保證不重啟程序,不手動修改配置的情況下適應集群變動
原文鏈接:https://www.cnblogs.com/zziawanblog/p/14539246.html
相關推薦
- 2022-04-09 Mybatis-Plus中dao層、service封裝的方法
- 2022-08-10 Go語言反射獲取類型屬性和方法示例_Golang
- 2022-08-25 C++示例講解vector容器_C 語言
- 2022-07-24 Goland中Protobuf的安裝、配置和使用_Golang
- 2023-04-24 pandas常用表連接merge/concat/join/append詳解_python
- 2022-06-11 C#把EXCEL數據轉換成DataTable_C#教程
- 2022-11-20 Postgresql刪除數據庫表中重復數據的幾種方法詳解_PostgreSQL
- 2022-07-10 移動文件夾ubuntu
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支