草庐IT

idea连接远程k8s集群使用kubernetes-client

wnfee 2025-05-11 原文

文章目录

一. k8s集群修改config

因为默认的是内网IP,复制出来后,后改为外面IP,报错

Unable to connect to the server: x509: certificate is valid for 10.0.1.27, 192.168.0.x, not x.x.x.x

原因从报错信息可以看出来:是证书对访问的IP做了校验,解决的方法就是要重新制作证书(不用动集群)。

1.1 备份当前k8s集群配置文件

cp -r /etc/kubernetes /etc/kubernetes.bak

1.2 删除当前k8s集群的apiserver的cert 和 key

rm -rf /etc/kubernetes/pki/apiserver.*

1.3 生成新的apiserver的cert和key

kubeadm init phase certs apiserver --apiserver-advertise-address ${Internal_IP} --apiserver-cert-extra-sans ${External_IP}

例如:

kubeadm init phase certs apiserver --apiserver-advertise-address 10.0.1.27 --apiserver-cert-extra-sans 122.51.103.44

1.4 刷新admin.conf

kubeadm alpha certs renew admin.conf

1.5 重启apiserver

kubectl -n kube-system delete pod -l component=kube-apiserver

1.6 刷新.kube/config

\cp /etc/kubernetes/admin.conf ~/.kube/config

注意:这里生成的 admin.conf 文件,server填写的依然是master内网IP,如果需要放在集群外的客户端上使用,将这个IP改为master外网IP即可。

参考 https://www.cnblogs.com/leozhanggg/p/16243205.html

二. 安装kubectl

2.1 下载kubectl

下载地址 https://www.jianshu.com/go-wild?ac=2&url=https%3A%2F%2Fstorage.googleapis.com%2Fkubernetes-release%2Frelease%2Fv1.21.2%2Fbin%2Fwindows%2Famd64%2Fkubectl.exe

下载kubectl.exe的可执行文件,我这里下载的是对应我们线上kubernetes版本的kubectl。如果想要下载其他版本,可以复制上面链接将版本号改对对应的即可。

kubectl添加到PATH环境变量
D盘下创建kube文件夹,将kubectl.exe存放在kube文件夹下。

D:\kube\kubectl添加到PATH环境变量中

执行命令查看已安装的 kubectl 版本号

C:\Users\16872>kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:38:33Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"windows/amd64"}
Unable to connect to the server: dial tcp 127.0.0.1:6443: connectex: No connection could be made because the target machine actively refused it.

2.2 配置kubectl

kubectl config文件存放在~/.kube/下。 ~代表当前的用户目录
创建~/.kube文件夹,将master上的config文件拉取到本地, 存放在~/.kube/文件夹下

config文件支持公网IP连接(配置)

验证配置结果

PS C:\Users\16872> kubectl get nodes
NAME     STATUS   ROLES                  AGE    VERSION
master   Ready    control-plane,master   4h7m   v1.21.2
node1    Ready    <none>                 4h3m   v1.21.2
node2    Ready    <none>                 4h3m   v1.21.2
PS C:\Users\16872> kubectl get pods -n kube-system
NAME                                           READY   STATUS    RESTARTS   AGE
calico-kube-controllers-69cccc84d-jcc4f        1/1     Running   3          4h1m
calico-node-6qvhg                              1/1     Running   1          4h1m
calico-node-jpqbc                              1/1     Running   1          4h1m
calico-node-xg558                              1/1     Running   2          4h1m
coredns-59d64cd4d4-cb6hg                       1/1     Running   2          4h7m
coredns-59d64cd4d4-w9nt4                       1/1     Running   2          4h7m
etcd-master                                    1/1     Running   1          4h7m
ingress-nginx-controller-qkw2c                 1/1     Running   0          39m
ingress-nginx-defaultbackend-c49866855-dlst8   1/1     Running   0          39m
kube-apiserver-master                          1/1     Running   1          4h7m
kube-controller-manager-master                 1/1     Running   1          4h7m
kube-proxy-4jtzf                               1/1     Running   2          4h3m
kube-proxy-6gbxz                               1/1     Running   1          4h7m
kube-proxy-ljjct                               1/1     Running   1          4h3m
kube-scheduler-master                          1/1     Running   1          4h7m

三. 使用kubernetes-client操作k8s集群

3.1 依赖

        <!--kubernetes-client-->
        <dependency>
            <groupId>io.kubernetes</groupId>
            <artifactId>client-java</artifactId>
            <version>16.0.0</version>
        </dependency>

版本选择参考 https://github.com/kubernetes-client/java/wiki/2.-Versioning-and-Compatibility

3.2 注意(可忽略)

编辑配置添加-Djdk.tls.client.protocols=TLSv1.2

否则报错

io.kubernetes.client.openapi.ApiException: javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request

3.3 创建 StatefulSet

    @Override
    @SneakyThrows
    public Boolean createCpsGo() {
        ApiClient client = Config.defaultClient();
        Configuration.setDefaultApiClient(client);
        // new一个statefulSet
        V1StatefulSet body = new V1StatefulSet()
                .metadata(new V1ObjectMeta().name("pod-go"))
                .spec(new V1StatefulSetSpec()
                        .serviceName("pod-go")
                        .replicas(3)
                        .selector(new V1LabelSelector().matchLabels(Map.of("app", "pod-go")))
                        .template(new V1PodTemplateSpec()
                                .metadata(new V1ObjectMeta().labels(Map.of("app", "pod-go")))
                                .spec(new V1PodSpec().containers(List.of(
                                        new V1Container()
                                                .name("pod-go")
                                                .image("registry.cn-shanghai.aliyuncs.com/wanfei/centos7-golang-sh:v1")
                                                .imagePullPolicy("IfNotPresent")
                                                .stdin(true)
                                                .tty(true)
                                )))
                        )
                );

        // 运行statefulSet
        AppsV1Api appsV1Api = new AppsV1Api();
        appsV1Api.createNamespacedStatefulSet("default", body, null, null, null, null);
        return true;
    }

创建成功

[root@master jenkins]# kubectl get StatefulSet | grep pod-go
pod-go                3/3     17s

3.4 运行shell命令

例如:生成文件,压缩文件

    @Override
    @SneakyThrows
    public Boolean createFile() {
        // 生成 pod-go-0.exe 文件命令
        String shExeCmd = "sh build.sh /app/test/ pod-go-0";
        // 压缩 pod-go-0.exe 为 pod-go-0.zip
        String shZipCmd = "zip /app/test/pod-go-0.zip /app/test/pod-go-0.exe";

        ApiClient client = Config.defaultClient();
        Configuration.setDefaultApiClient(client);

        // 执行kubectl exec在指定pod内运行命令
        String shExeStr = execForStr(shExeCmd);
        log.info("编译exe文件返回: {}", shExeStr);
        String shZipStr = execForStr(shZipCmd);
        log.info("压缩exe文件返回: {}", shZipStr);
        return true;
    }

    /**
     * 执行kubectl exec
     * @param command 命令
     */
    @SneakyThrows
    private static String execForStr(String command) {
        Exec exec = new Exec();
        Process proc = exec.exec("default", "pod-go-0", ArrayUtil.toArray(List.of("/bin/sh", "-c", command), String.class), "pod-go", true, true);
        return RuntimeUtil.getResult(proc);
    }

编译压缩成功

[root@pod-go-0 test]# ls
main.go  pdf1.syso  pod-go-0.exe  pod-go-0.zip

3.5 删除 StatefulSet

    @Override
    @SneakyThrows
    public Boolean deleteCpsGo() {
        ApiClient client = Config.defaultClient();
        Configuration.setDefaultApiClient(client);
        AppsV1Api appsV1Api = new AppsV1Api();
        appsV1Api.deleteNamespacedStatefulSet("pod-go", "default", null, null, null, null, null, null);
        return true;
    }

3.6 线上运行注意

部署到线上后发现报错

进入pod执行

[root@pod-java-67cdc944f8-jknpq app]# kubectl get pods
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:default" cannot list resource "pods" in API group "" in the namespace "default"

创建最高权限的角色

cat <<EOF> client-java-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: client-java-sa
  namespace: default
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: client-java-sa-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: client-java-sa
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
EOF

部署java应用的时候使用client-java-sa这个ServiceAccount,否则会使用默认的default这个ServiceAccount

添加serviceAccountName: client-java-sa

部署

kubectl apply -f client-java-sa.yaml

参考 https://blog.51cto.com/zq2599/4907211

有关idea连接远程k8s集群使用kubernetes-client的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐