k8s在go语言中的使用及client 初始化简介

作为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)

当发生变动或者认证信息失效时,客户端或报相应的权限错误,即可重新获取认证信息,重新初始化。这样可以保证不重启程序,不手动修改配置的情况下适应集群变动

以上就是k8s在go语言中的使用及client 初始化简介的详细内容,更多关于k8s go client初始化的资料请关注我们其它相关文章!

(0)

相关推荐

  • K8s部署发布Golang应用程序的实现方法

    目录 创建dockerfile 打包并且推送 创建namespace 创建deployment 创建service 创建ingress 创建hpa alertGo程序可以参考上篇文章,主要用于alertmanager实现钉钉报警 创建dockerfile FROM golang:1.14-alpine ENV GOPROXY=https://goproxy.cn WORKDIR /build COPY . . EXPOSE 8088 RUN mkdir /app RUN go mod tidy

  • Ingress七层路由机制实现域名的方式访问k8s

    Ingress概念: 通俗来讲:Ingress和之前说的Service.Deployment一样,也是一个k8s的资源类型:Ingress用于实现域名的方式访问k8s的内部应用,Service可能更适于服务间访问. 这东西我们使用的k8s官方维护的本版,另外nginx官方也有一个版本,怎么用看个人. Ingress支持多种方案:包括 Nginx.Haproxy.Traefik.istio等:在实际中Ingress上面可能还有一层公司的硬件层代理. 大概的流程图如下: 创建一个Ingress: 这

  • k8s监控数据组件Pod自动化进行扩缩容HPA

    自动扩缩容HPA:全称是Horizontal Pod Autoscaler 我们安装k8s集群的时候,安装过一个metrics-server的组件,这是一个监控数据组件,提供HPA和基础资源监控的能力.就是这面这个Pod: [root@k8s-master01 ~]# kubectl get pod -n kube-system metrics-server-6bf7dcd649-5fhrw 1/1 Running 2 (3d5h ago) 8d 通过这个组件可以看到节点或者Pod的内存和CPU

  • k8s在go语言中的使用及client 初始化简介

    作为k8s官方维护的客户端,k8s go-client对于go语言中使用k8s可以说是唯一选项.但是官方的使用示例我个人觉得并不是很清晰,尤其是对于对于k8s并不熟悉的用户.这里我总结一下使用过程中碰到的坑,也希望能给有需要的人一些参考. 首先从官方示例说起:这里先解释一下k8s连接问题.集群的节点上会有一个.kube目录(这个目录一般在root用户home目录下)目录中会存在一个config文件,文件中记录了连接k8s集群所需的所有信息,如apiserver地址,用户认证token等.一般来说

  • C语言中数组的使用详解

    目录 1 数组的基本概念 2 数组定义语法 3 一维数组的初始化 3.1 全部初始化 3.2 部分元素赋初值 3.3 省略长度赋初值 4 一维数组的使用示例 4.1 求最大值.最小值.平均值 4.2 数组逆置 4.3 数组排序 4.3.1 冒泡排序 4.3.2 选择排序 选择列表中的最小值与未排序列表中的第一个值互换位置. 4.3.3 直接插入排序 5 二维数组 5.1 二维数组的概念 5.2 二维数组的初始化 5.2.1 全部初始化 按行全部赋初值 5.2.2 部分初始化 5.2.3 省略长度

  • Go语言中的延迟函数defer示例详解

    前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.return.返回值.panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!话不多说了,来一起看看详细的介绍吧. 先来运行下面两段代码: A. 匿名返回值的情况 package main import ( "fmt&qu

  • Go语言中的流程控制结构和函数详解

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和无条件跳转. if if也许是各种编程语言中最常见的了,它的语法概括起来就是:如果满足条件就做某事,否则做另一件事. Go里面if条件判断语句中不需要括号,如下代码所示: 复制代码 代码如下: if x > 10 {     fmt.Println("x is greater than 10&

  • Go语言中的指针运算实例分析

    本文实例分析了Go语言中的指针运算方法.分享给大家供大家参考.具体分析如下: Go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*void然后随意转换指针类型这样的东西.最近在思考Go如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据. 这里对Go语言内置的unsafe模块做了一个实验,发现通过unsafe模块,Go语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的. 下面是实验代码: 复制代码 代码如下: packag

  • Go语言中的匿名结构体用法实例

    本文实例讲述了Go语言中的匿名结构体用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main      import (     "fmt" )      func main() {     var user struct{Name string; Gender int}     user.Name = "dotcoo"     user.Gender = 1     fmt.Printf("%#v\n",

  • 详解易语言中的数据类型

    各种数据存放在磁盘或内存中都有其不同的存放格式,因此就存在不同的数据类型.了解各种数据的特性,对编程开发来说是十分重要. 程序中经常会进行一些运算,易语言中的运算都要使用运算符进行识别处理,并通过运算表达式来完成运算操作.程序中对各数据之间的关系的描述也要通过运算符. 1.易语言的数据类型 一个程序内部应包括两个方面的内容:1.数据的描述.2.操作步骤,即对程序动作的描述. 数据是程序操作的对象,操作的结果会改变数据的内容.打个比方:要做一道菜,做菜前先选择烹饪的原材料(即对数据进行描述),然后

  • Delphi之Pascal语言中的关键字及保留字汇总

    本文汇总了Pascal语言中的关键字及保留字如下,供大家参考: absolute//指令(变量) abstract//指令(方法) and//运算符(布尔) array//类型 as//运算符(RTTI) asm//语句 assembler//向后兼容(汇编) at//语句(异常处理) automated//访问类别符(类) begin//块标记 case//语句 cdecl//函数调用协定 class//类型 const//声明或指令(参数) constructor//特殊方法 contain

  • jsp页面中表达式语言中的$符号不起作用的解决方法

    今天myeclipse里部署了之前做的一个测试项目,发现jsp里的$符号tomcat启动后页面上显示出来了,百度搜了下别人也有类似的问题出现过.经提醒原来是web.xml配置的version设置的是2.5而我tomcat5启动的.是tomcat的版本低于web的版本,从而导致$符号不能正常使用. 后将tomcat5改用tomcat6.jdk采用1.6 启动spring2.5项目.$显示问题解决. 以下是网上摘录的详细说明: 在jsp页面中用表达式语言中的$符号,如${pageScope.titl

  • 深入讲解Go语言中函数new与make的使用和区别

    前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用,话不多说了,来一起看看详细的介绍吧. 变量的声明 var i int var s string 变量的声明我们可以通过var关键字,然后就可以在程序中使用.当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,st

随机推荐