golang k8s client-go

本文介绍了K8s集群的配置,包括节点信息和代理设置,并通过部署Sockshop微服务实例展示了K8s应用的部署流程。此外,提到了通过Go语言的client-go库与K8sAPI交互,获取集群内Pod信息和节点资源。还提及了K8sDashboard在开发验证中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go K8s Start

K8s入门安装之类的比较多了,这里主要记录K8s开发相关内容。。

配置介绍:

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION  IP(I append)
master   Ready    master   9m29s   v1.18.0  192.168.228.100
node1    Ready    <none>   8m1s    v1.18.0  192.168.228.101
node2    Ready    <none>   7m53s   v1.18.0  192.168.228.102
[root@master ~]# env | grep -i proxy
http_proxy=http://192.168.228.1:7890/
https_proxy=http://192.168.228.1:7890/ #代理为方便访问外面的资源

部署服务实例

这里我们使用Sockshop(较为有名的微服务实例,提供docker-compese/K8s部署指令,较为方便)
于Master节点执行以下命令以部署应用:

git clone https://github.com/microservices-demo/microservices-demo
[root@master ~]# kubectl create namespace sock-shop
namespace/sock-shop created
[root@master ~]# kubectl apply -f microservices-demo/deploy/kubernetes/complete-demo.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
namespace/sock-shop configured
deployment.apps/carts created
service/carts created
...开启了一系列的应用

查看启动状态:

[root@master ~]# kubectl get pods -n sock-shop
NAME                            READY   STATUS    RESTARTS   AGE
carts-b88f67bd5-x6hrv           1/1     Running   0          6m41s
carts-db-84b777d9c-dh9fz        1/1     Running   0          6m41s
catalogue-578bc986c4-qjqqm      1/1     Running   0          6m41s
catalogue-db-5579f7f4cb-llmst   1/1     Running   0          6m41s
front-end-6598d7fdf7-vnvxb      1/1     Running   0          6m41s
orders-5cd98488c5-k2kwb         1/1     Running   0          6m41s
orders-db-77c46b9c85-ws6xn      1/1     Running   0          6m41s
payment-576b45758f-t5qks        1/1     Running   0          6m40s
queue-master-756cc8fd5f-qxll7   1/1     Running   0          6m40s
rabbitmq-7ddc84cb6c-wz8fp       2/2     Running   0          6m40s
session-db-8f64655d5-zs798      1/1     Running   0          6m40s
shipping-596cd757cc-lxgvg       1/1     Running   0          6m40s
user-65886d4ccf-q4pt2           1/1     Running   0          6m39s
user-db-79b99f877f-t9nx9        1/1     Running   0          6m39s
[root@master ~]# kubectl get service -n sock-shop
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
carts          ClusterIP   10.109.71.56     <none>        80/TCP              5m37s
carts-db       ClusterIP   10.103.242.233   <none>        27017/TCP           5m37s
catalogue      ClusterIP   10.97.33.33      <none>        80/TCP              5m37s
catalogue-db   ClusterIP   10.100.129.25    <none>        3306/TCP            5m37s
front-end      NodePort    10.107.122.50    <none>        80:30001/TCP        5m37s
orders         ClusterIP   10.111.73.100    <none>        80/TCP              5m37s
...

注意存在front-end对应TYPE为NodePort,因此我们可以通过该地址访问服务,这里的url为:192.168.228.100:30001,界面如下:
在这里插入图片描述
另外部署dashboard,参考这个连接,然后通过kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token获取token用于登录,界面如下:
在这里插入图片描述

这里做k8s-dashboard主要是方便开发过程中的校验(毕竟,初级开发的功能在dashboard几乎都能找到…)

go program

这里就直接在Master上进行go代码编写,简单实例代码如下:

package main
import (
	"context"
	"flag"
	"fmt"
	"math/rand"
	"path/filepath"
	"time"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
)

func main() {
	var kubeconfig *string
	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()
	// use the current context in kubeconfig
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}
	// create the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
	s1 := rand.NewSource(time.Now().UnixNano())
	r1 := rand.New(s1)
	num := r1.Intn(len(pods.Items))//生成真正的随机数,而不是每次都一样
	fmt.Printf("%s's Host IP :%s \n", pods.Items[num].Name, pods.Items[num].Status.HostIP)
}

输出结果:

[root@master demo1]# go run main.go -kubeconfig=$HOME/.kube/config
There are 31 pods in the cluster
kube-scheduler-master's Host IP :192.168.228.100  
[root@master demo1]# go run main.go -kubeconfig=$HOME/.kube/config
There are 31 pods in the cluster
shipping-596cd757cc-lxgvg's Host IP :192.168.228.102 

当然,也可以通过以下代码块获取worker的资源信息:

nodes, aerr := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
if aerr != nil {
    panic(aerr.Error())
}
num2 := 2
v1 := nodes.Items[num2].Status.Capacity.Cpu().AsDec().Scale
//输出:node 2's Total CPU 19537440 

具体的client-go使用可以直接去看源码,这里的结果也可以和dashboard比对一下。


其实也只是去调用API而已,就像kubectl做的一样,和一些自研或者说是扩展出来的k8s还是有本质区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值