一开始写了一个client-java版本的,但是java放在k8s集群上跑需要装jvm而且java的包比较大,client-go版本更适合主机端,下面是整个实现

原文地址:https://www.cnblogs.com/darope/p/12097013.html

说明:k8s官方维护的客户端库只有go和python版本,所以为了稳定性建议使用这两个版本,考虑到k8s是go实现的,我这里也就选择go版本。至于客户端连接k8s集群,在具体的生产环境中不建议外部连接访问。原因一是生产环境中的k8s配置文件重要,一般如果对接其他公司的业务,虽然有鉴权,人家也不愿意把配置文件拷贝给你,因为有了集群的配置文件,外部的这个项目的权限就很大,相当于给集群开了一个隐患口子,要知道k8s集群中有可能是该公司的整个业务。原因二集群内部访问不需要那么复杂的鉴权,反而更省事点,只需要写个小应用部署到k8s集群中即可。应用已经在集群内部了,就没有鉴权的概念了,其他三方服务只需要调用小应用的api即可操作k8s。

1. 构建goWeb小应用导入依赖:

  a. 不管是走go的代理还是其他办法,这里默认能搭建goWeb项目,并且能够使用go mod tidy拉取包。

  b. 按照官方文档导入依赖这里我用的是0.17.0版本,此处有坑,不仅仅这个版本有这个坑,其他版本很有可能也有,完全正常的导入但是会存在jar包之间版本不一致问题,这个问题会导致go build无法构建,是官方自身的兼容问题,报错信息为:

  # k8s.io/client-go/rest
  ../../../../goworkspace/pkg/mod/k8s.io/client-go@v11.0.0+incompatible/rest/request.go:598:31: not enough arguments in call to watch.NewStreamWatcher
  have (*versioned.Decoder)
  want (watch.Decoder, watch.Reporter)

  c. 可以尝试手动替换k8s.io/apimachinery@v0.17.0为k8s.io/apimachinery@release-1.14来解决。在终端执行# go mod download -json k8s.io/apimachinery@release-1.14最终gomod的关于k8s的所有依赖文件如下所示:

 require (
  k8s.io/api v0.17.0 // indirect
  k8s.io/apimachinery v0.17.0
  k8s.io/client-go v11.0.0+incompatible
  k8s.io/utils v0.0.0-20191114184206-e782cd3c129f // indirect
  sigs.k8s.io/yaml v1.1.0 // indirect
) replace (
k8s.io/api => k8s.io/api v0.0.0-20191004102349-159aefb8556b
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.0.0-20191004105649-b14e3c49469a
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20191004074956-c5d2f014d689
sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.3.0
)

这里参考博客为:https://segmentfault.com/a/1190000021077653?utm_source=tag-newest

最终go build就没问题了。

2. 配置集群内部访问的客户端

  a. 内部访问k8s客户端使用defaultClient即可,但是这里第二个坑,client-go里面默认的客户端寻找的是~/.kube下的config文件,并且需要集群的ip和port,也就是说需要人为的去配置环境变量以便满足ip和port的写入需要,需要提前把config放到~/.kube下。恰巧客户的环境也没配置环境变量,也没把config拷到响应的目录下,只能找其他办法。由于之前写过一个java的客户端调用,里面的defaultClient是可以访问到的。所以看下java中的寻找路径,发现了一个上下文路径的东西。最终改造client-go客户端信息如下:

 package utils

 import (
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"log"
"os"
"path/filepath"
) // 获取集群内部k8s客户端
func K8sClient() *kubernetes.Clientset {
// 使用当前上下文环境
kubeconfig := filepath.Join(
os.Getenv("KUBECONFIG"),
)
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
log.Fatal(err)
}
// 根据指定的 config 创建一个新的 clientSet
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
return clientSet
}

其中os.Getenv就是拿k8s的默认配置文件,只要该应用部署在k8s集群环境中,这个客户端就可以正确返回和使用。

3. pod列表,deployment列表,deployment扩缩容等实现

     // 拿客户端
clientSet := utils.K8sClient()
//获取PODS列表,不传namespace默认查全部
pods, err := clientSet.CoreV1().Pods(nameSpace).List(metav1.ListOptions{})
if err != nil {
log.Println(err.Error())
}
// deployment列表获取
deploymentsClient := clientSet.AppsV1().Deployments(nameSpace)
deployments, err := deploymentsClient.List(metav1.ListOptions{})
if err != nil {
panic(err)
}
// deployment详情获取
deploymentsClient := clientSet.AppsV1().Deployments(nameSpace)
deployment, err := deploymentsClient.Get(deploymentName, metav1.GetOptions{})
if err != nil {
panic(err)
}
// 扩缩容,num是扩缩容至多少
  deploymentsClient := clientSet.AppsV1().Deployments(nameSpace)
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
result, getErr := deploymentsClient.Get(deploymentName, metav1.GetOptions{})
if getErr != nil {
panic(fmt.Errorf("失败,确认之后再试一下呗~: %v", getErr))
}
result.Spec.Replicas = int32Ptr(int32(num))
_, updateErr := deploymentsClient.Update(result)
return updateErr
})
if retryErr != nil {
panic(fmt.Errorf("扩容出现问题,请检查调用~: %v", retryErr))
}

亲测可用~,点个赞让跟多人看到,避免反复踩坑。

client-go获取k8s集群内部连接,实现deployment的增删改查的更多相关文章

  1. 【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像

    本文将介绍如何使用kubectl列举K8S集群中运行的Pod内的容器镜像. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同. 0x00 准备工作 需要有一个K8S集群,并且配置好了k ...

  2. China Azure中部署Kubernetes(K8S)集群

    目前China Azure还不支持容器服务(ACS),使用名称"az acs create --orchestrator-type Kubernetes -g zymtest -n kube ...

  3. k8s重要概念及部署k8s集群(一)--技术流ken

    重要概念 1. cluster cluster是 计算.存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用. 2.master master是cluster的大脑,他的主要职责是调度,即决 ...

  4. 使用Kubeadm创建k8s集群之部署规划(三十)

    前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...

  5. Kubernetes(k8s)集群安装

    一:简介 二:基础环境安装 1.系统环境 os Role ip Memory Centos 7 master01 192.168.25.30 4G Centos 7 node01 192.168.25 ...

  6. 在k8s集群部署SonarQube

    目录 1.2.存储环境 1.3.sonarqube版本 2.部署sonarqube 2.1.部署PostgreSQL 2.2.部署SonarQube 2.3.访问检查 SonarQube 是一款用于代 ...

  7. Kubernetes 学习3 kubeadm初始化k8s集群

    一.k8s集群 1.k8s整体架构图 2.k8s网络架构图 二.基于kubeadm安装k8s步骤 1.master,nodes:安装kubelet,kubeadm,docker 2.master: k ...

  8. K8S集群Master高可用实践

    K8S集群Master高可用实践    https://blog.51cto.com/ylw6006/2164981 本文将在前文基础上介绍k8s集群的高可用实践,一般来讲,k8s集群高可用主要包含以 ...

  9. [转帖]当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?

    改天学习一下. https://www.cnblogs.com/alisystemsoftware/p/11570806.html   当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题 ...

随机推荐

  1. JS:收集的一些Array及String原型对象的扩展实现代码

    扩展Array的原型对象的方法  // 删除数组中数据 Array.prototype.del = function(n) { if (n<0) return this; return this ...

  2. 八. jenkins参数化构建 git分支

    使用git管理代码时往往会有多分支开发,这时部署通过修改配置不试用.可以通过参数化构建. 1.通过字符参数方式 新建一个maven项目,选择参数化构建过程-字符参数,如下: 源码管理中配置如下: 其它 ...

  3. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  4. Charles重发请求

    1.如下图 2.选中某个接口,右键--选择 Repeat Advanced选项,设置请求多次 3.

  5. 面试题:Nginx 是如何实现高并发?常见的优化手段有哪些?

    面试题: Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些? 面试官心理分析 主要是看应聘人员的对NGINX的基本原理是否熟悉, ...

  6. 使用自编译的Emacs26.0.50build10版本,helm报错(已解决)

    使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...

  7. Python之随机选择 random

    随机选择:random import random # 从一个序列中随机的抽取一个元素 values=[1,2,3,4,56] # 指定取出N个不同元素 print(random.sample(val ...

  8. c#各类DI容器

    IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理. DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现. ...

  9. go中字符类型的使用小结

    示例 // 字符类型的用法 package main import ( "fmt" "unsafe" ) func main() { // 未指定类型并赋值字符 ...

  10. XML 和 HTML 之间的差异

    XML 和 HTML 为不同的目的而设计: XML 被设计用来传输和存储数据,其焦点是数据的内容. HTML 被设计用来显示数据,其焦点是数据的外观. HTML 旨在显示信息,而 XML 旨在存储和传 ...