文章目录
1. 准备1.1 需求1.2 获取配置文件
2. 几个包的说明3. 链接k8s集群4. Node4.1 node相关结构体4.1.1 NodeList4.1.2 Node4.1.3 TypeMeta4.1.4 ObjectMeta4.1.5 NodeSpec4.1.6 NodeStatus4.1.7 对照yml文件示例
4.2 Get Node List语法完整示例
4.3 Get 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:
}]
}