Go语言K8S开发-01-链接k8s集群、node节点操作

1. 准备

1.1 需求

需要 go 1.19以上

1.2 获取配置文件

将k8s集群master的 ~/.kube/config文件拷贝到代码适合位置

本文将 ~/.kube/config文件内容拷贝至代码:conf/kube.conf文件中。

2. 几个包的说明

  • k8s.io/api/apps/v1 :对应K8S apiVersion: apps/v1接口操作的对象

如Deployment、DaemonSet、StatefulSet等

  • k8s.io/api/core/v1 :对应K8S apiVersion: v1接口操作的对象

如:ConfigMap、Service、NameSpace等

  • k8s.io/apimachinery/pkg/apis/meta/v1:对对象的实际操作,如增删改查等。
  • k8s.io/client-go/kubernetes 用于链接k8s集群

3. 链接k8s集群

package main

import (
	"fmt"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)


func ConnectK8s()(clientSet *kubernetes.Clientset,err error)  {
	configPath := "conf/kube.conf"
	config, err := clientcmd.BuildConfigFromFlags("", configPath)
	if err != nil {
		return nil, err
	}
	clientSet, err = kubernetes.NewForConfig(config)
	if err != nil {
		return nil,err
	}
	return clientSet,nil
}

4. Node

4.1 node相关结构体

4.1.1 NodeList

所在包:“k8s.io/api/core/v1”

type NodeList struct {
    v1.TypeMeta `json:",inline"`
    v1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
    Items           []Node `json:"items" protobuf:"bytes,2,rep,name=items"`
}

其中Items中各Node结构体如下:

4.1.2 Node

所在包:“k8s.io/api/core/v1”

type Node struct {
    v1.TypeMeta   `json:",inline"`
    v1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
    Spec              NodeSpec   `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
    Status            NodeStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

其中各成员详细说明如下:

4.1.3 TypeMeta

所在包 “k8s.io/apimachinery/pkg/apis/meta/v1”

type TypeMeta struct {
    Kind       string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"`
    APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"`
}

其对应yml文件的

apiVersion: v1
kind: Node

4.1.4 ObjectMeta

所在包:“k8s.io/apimachinery/pkg/apis/meta/v1”

type ObjectMeta struct {
    Name                       string               `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`
    GenerateName               string               `json:"generateName,omitempty" protobuf:"bytes,2,opt,name=generateName"`
    Namespace                  string               `json:"namespace,omitempty" protobuf:"bytes,3,opt,name=namespace"`
    SelfLink                   string               `json:"selfLink,omitempty" protobuf:"bytes,4,opt,name=selfLink"`
    UID                        types.UID            `json:"uid,omitempty" protobuf:"bytes,5,opt,name=uid,casttype=k8s.io/kubernetes/pkg/types.UID"`
    ResourceVersion            string               `json:"resourceVersion,omitempty" protobuf:"bytes,6,opt,name=resourceVersion"`
    Generation                 int64                `json:"generation,omitempty" protobuf:"varint,7,opt,name=generation"`
    CreationTimestamp          Time                 `json:"creationTimestamp,omitempty" protobuf:"bytes,8,opt,name=creationTimestamp"`
    DeletionTimestamp          *Time                `json:"deletionTimestamp,omitempty" protobuf:"bytes,9,opt,name=deletionTimestamp"`
    DeletionGracePeriodSeconds *int64               `json:"deletionGracePeriodSeconds,omitempty" protobuf:"varint,10,opt,name=deletionGracePeriodSeconds"`
    Labels                     map[string]string    `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"`
    Annotations                map[string]string    `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"`
    OwnerReferences            []OwnerReference     `json:"ownerReferences,omitempty" patchStrategy:"merge" patchMergeKey:"uid" protobuf:"bytes,13,rep,name=ownerReferences"`
    Finalizers                 []string             `json:"finalizers,omitempty" patchStrategy:"merge" protobuf:"bytes,14,rep,name=finalizers"`
    ManagedFields              []ManagedFieldsEntry `json:"managedFields,omitempty" protobuf:"bytes,17,rep,name=managedFields"`
}

对应yml文件中的

metadata:
  ……

4.1.5 NodeSpec

所在包:“k8s.io/api/core/v1”

type NodeSpec struct {
    PodCIDR            string            `json:"podCIDR,omitempty" protobuf:"bytes,1,opt,name=podCIDR"`
    PodCIDRs           []string          `json:"podCIDRs,omitempty" protobuf:"bytes,7,opt,name=podCIDRs" patchStrategy:"merge"`
    ProviderID         string            `json:"providerID,omitempty" protobuf:"bytes,3,opt,name=providerID"`
    Unschedulable      bool              `json:"unschedulable,omitempty" protobuf:"varint,4,opt,name=unschedulable"`
    Taints             []Taint           `json:"taints,omitempty" protobuf:"bytes,5,opt,name=taints"`
    ConfigSource       *NodeConfigSource `json:"configSource,omitempty" protobuf:"bytes,6,opt,name=configSource"`
    DoNotUseExternalID string            `json:"externalID,omitempty" protobuf:"bytes,2,opt,name=externalID"`
}

对应yml文件的

spec:
  ……

4.1.6 NodeStatus

所在包:“k8s.io/api/core/v1”

type NodeStatus struct {
    Capacity        ResourceList        `json:"capacity,omitempty" protobuf:"bytes,1,rep,name=capacity,casttype=ResourceList,castkey=ResourceName"`
    Allocatable     ResourceList        `json:"allocatable,omitempty" protobuf:"bytes,2,rep,name=allocatable,casttype=ResourceList,castkey=ResourceName"`
    Phase           NodePhase           `json:"phase,omitempty" protobuf:"bytes,3,opt,name=phase,casttype=NodePhase"`
    Conditions      []NodeCondition     `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,4,rep,name=conditions"`
    Addresses       []NodeAddress       `json:"addresses,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,5,rep,name=addresses"`
    DaemonEndpoints NodeDaemonEndpoints `json:"daemonEndpoints,omitempty" protobuf:"bytes,6,opt,name=daemonEndpoints"`
    NodeInfo        NodeSystemInfo      `json:"nodeInfo,omitempty" protobuf:"bytes,7,opt,name=nodeInfo"`
    Images          []ContainerImage    `json:"images,omitempty" protobuf:"bytes,8,rep,name=images"`
    VolumesInUse    []UniqueVolumeName  `json:"volumesInUse,omitempty" protobuf:"bytes,9,rep,name=volumesInUse"`
    VolumesAttached []AttachedVolume    `json:"volumesAttached,omitempty" protobuf:"bytes,10,rep,name=volumesAttached"`
    Config          *NodeConfigStatus   `json:"config,omitempty" protobuf:"bytes,11,opt,name=config"`
}

对应yml文件的

status:
 ……

4.1.7 对照yml文件示例

附原生k8s集群上一个node节点信息,大家可以对照理解一下以上结构体

apiVersion: v1
kind: Node
metadata:
  annotations:
    flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"3e:31:18:5c:89:6a"}'
    flannel.alpha.coreos.com/backend-type: vxlan
    flannel.alpha.coreos.com/kube-subnet-manager: "true"
    flannel.alpha.coreos.com/public-ip: 10.10.239.204
    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
    node.alpha.kubernetes.io/ttl: "0"
    volumes.kubernetes.io/controller-managed-attach-detach: "true"
  creationTimestamp: "2022-07-18T09:25:53Z"
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/os: linux
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: crust-n01
    kubernetes.io/os: linux
    node_type: cpu
  name: crust-n01
  resourceVersion: "23109809"
  selfLink: /api/v1/nodes/crust-n01
  uid: 0a83df46-9900-4b22-b12a-8e6266b5a795
spec:
  podCIDR: 10.244.5.0/24
  podCIDRs:
  - 10.244.5.0/24
status:
  addresses:
  - address: 10.10.xxx.204
    type: InternalIP
  - address: crust-n01
    type: Hostname
  …………

4.2 Get Node List

语法

  • 语法
func (NodeInterface) List(ctx context.Context, opts v1.ListOptions) (*v1.NodeList, error)
  • 语法示例
nodeList,err := clientSet.CoreV1().Nodes().List(context.TODO(), metaV1.ListOptions{})

完整示例

  • 定义函数
package crowK8S

import (
	"context"
	coreV1 "k8s.io/api/core/v1"
	metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
)

func GetNodeList(clientSet *kubernetes.Clientset)(nodeList *coreV1.NodeList,err error)  {
	nodeList,err = clientSet.CoreV1().Nodes().List(context.TODO(), metaV1.ListOptions{})
	if err != nil {
		return nodeList,err
	}
    return nodeList,nil
}
  • 调用示例
package main

import (
	"fmt"
	"go-k8s/crowK8S"
)

func main()  {
	clientSet,err := crowK8S.ConnectK8s()
	if err !=nil {
		fmt.Println(err)
	}

	nodeList,err := crowK8S.GetNodeList(clientSet)
	for err != nil{
		fmt.Println(err)
	}
	//fmt.Printf("%+v",nodeList)
	for _,nodeInfo := range nodeList.Items{
		fmt.Printf("node 的名字为:%s\n",nodeInfo.Name)
	}
}
  • 结果显示
API server listening at: 127.0.0.1:52897
node 的名字为:crust-m01
node 的名字为:crust-m02
node 的名字为:crust-m03
node 的名字为:crust-n01
node 的名字为:crust-n02
node 的名字为:crust-n03
node 的名字为:sa2

4.3 Get Node

语法

  • 语法
func (NodeInterface) Get(ctx context.Context, name string, opts v1.GetOptions) (*v1.Node, error)
  • 语法示例
nodeInfo,err = clientSet.CoreV1().Nodes().Get(context.TODO(),nodeName,  metaV1.GetOptions{})

完整示例

  • 定义函数
package crowK8S

import (
	"context"
	coreV1 "k8s.io/api/core/v1"
	metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
)
func GetNode(clientSet *kubernetes.Clientset,nodeName string)(nodeInfo *coreV1.Node,err error)  {
	nodeInfo,err = clientSet.CoreV1().Nodes().Get(context.TODO(),nodeName,  metaV1.GetOptions{})
	if err != nil {
		return nodeInfo,err
	}
	return nodeInfo,nil
}
  • 调用示例
package main

import (
	"fmt"
	"go-k8s/crowK8S"
)

func main()  {
	clientSet,err := crowK8S.ConnectK8s()
	if err !=nil {
		fmt.Println(err)
	}

    nodeInfo,err := crowK8S.GetNode(clientSet,"crust-n02")
	if err !=nil {
		fmt.Println(err)
	}
	fmt.Printf("%+v",nodeInfo.ObjectMeta)
}
  • 结果显示

以下结果是我格式化了的,实际是一个json字串。

{
	Name: crust - n02 GenerateName: Namespace: SelfLink: /api/v
	1 / nodes / crust - n02 UID: 491 b0e8b - b70e - 46 a0 - bc81 - 78080 d806030 ResourceVersion: 18804706 Generation: 0 CreationTimestamp: 2022 - 07 - 12 16: 58: 15 + 0800 CST DeletionTimestamp: < nil > DeletionGracePeriodSeconds: < nil > Labels: map[beta.kubernetes.io / arch: amd64 beta.kubernetes.io / os: linux kubernetes.io / arch: amd64 kubernetes.io / hostname: crust - n02 kubernetes.io / os: linux] Annotations: map[flannel.alpha.coreos.com / backend - data: {
			"VtepMAC": "fa:8a:d8:b0:e1:76"
		}
		flannel.alpha.coreos.com / backend - type: vxlan flannel.alpha.coreos.com / kube - subnet - manager: true flannel.alpha.coreos.com / public - ip: 10.10 .239 .205 kubeadm.alpha.kubernetes.io / cri - socket: /var/run / dockershim.sock node.alpha.kubernetes.io / ttl: 0 volumes.kubernetes.io / controller - managed - attach - detach: true] OwnerReferences: [] Finalizers: [] ManagedFields: [{
		Manager: kubeadm Operation: Update APIVersion: v1 Time: 2022 - 07 - 12 16: 58: 15 + 0800 CST FieldsType: FieldsV1 FieldsV1: {
			"f:metadata": {
				"f:annotations": {
					"f:kubeadm.alpha.kubernetes.io/cri-socket": {}
				}
			}
		}
		Subresource:
	} {
		Manager: flanneld Operation: Update APIVersion: v1 Time: 2022 - 07 - 12 16: 58: 20 + 0800 CST FieldsType: FieldsV1 FieldsV1: {
			"f:metadata": {
				"f:annotations": {
					"f:flannel.alpha.coreos.com/backend-data": {},
					"f:flannel.alpha.coreos.com/backend-type": {},
					"f:flannel.alpha.coreos.com/kube-subnet-manager": {},
					"f:flannel.alpha.coreos.com/public-ip": {}
				}
			}
		}
		Subresource:
	} {
		Manager: kubelet Operation: Update APIVersion: v1 Time: 2022 - 08 - 05 23: 32: 40 + 0800 CST FieldsType: FieldsV1 FieldsV1: {
			"f:metadata": {
				"f:annotations": {
					".": {},
					"f:volumes.kubernetes.io/controller-managed-attach-detach": {}
				},
				"f:labels": {
					".": {},
					"f:beta.kubernetes.io/arch": {},
					"f:beta.kubernetes.io/os": {},
					"f:kubernetes.io/arch": {},
					"f:kubernetes.io/hostname": {},
					"f:kubernetes.io/os": {}
				}
			},
			"f:status": {
				"f:allocatable": {
					"f:ephemeral-storage": {}
				},
				"f:capacity": {
					"f:ephemeral-storage": {}
				},
				"f:conditions": {
					"k:{\"type\":\"DiskPressure\"}": {
						"f:lastHeartbeatTime": {},
						"f:lastTransitionTime": {},
						"f:message": {},
						"f:reason": {},
						"f:status": {}
					},
					"k:{\"type\":\"MemoryPressure\"}": {
						"f:lastHeartbeatTime": {}
					},
					"k:{\"type\":\"PIDPressure\"}": {
						"f:lastHeartbeatTime": {}
					},
					"k:{\"type\":\"Ready\"}": {
						"f:lastHeartbeatTime": {},
						"f:lastTransitionTime": {},
						"f:message": {},
						"f:reason": {},
						"f:status": {}
					}
				},
				"f:images": {}
			}
		}
		Subresource:
	} {
		Manager: kube - controller - manager Operation: Update APIVersion: v1 Time: 2022 - 08 - 06 00: 00: 54 + 0800 CST FieldsType: FieldsV1 FieldsV1: {
			"f:metadata": {
				"f:annotations": {
					"f:node.alpha.kubernetes.io/ttl": {}
				}
			},
			"f:spec": {
				"f:podCIDR": {},
				"f:podCIDRs": {
					".": {},
					"v:\"10.244.2.0/24\"": {}
				}
			}
		}
		Subresource:
	}]
}

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值