kubernetes客户端client-go使用
阅读原文时间:2023年07月12日阅读:2

下载地址: https://github.com/kubernetes/client-go

官方使用文档参考:https://v1-16.docs.kubernetes.io/docs/reference/using-api/client-libraries/

安装,使用的为kubernetes1.15.6版本的kubernetes集群

go get -u -v k8s.io/client-go@kubernetes-1.15.6

在操作外部k8s集群示例

创建一个clientSet

package main

import (
"flag"
"fmt"
apiv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
appv1 "k8s.io/api/apps/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)

func main() {

var (  
    k8sconfig = flag.String("k8sconfig", "./admin.conf", "kubernetes auth config") //使用kubeconfig配置文件进行集群权限认证  
    config    \*rest.Config  
    err       error  
)  
flag.Parse()

config, err = clientcmd.BuildConfigFromFlags("", \*k8sconfig)  
if err != nil {  
    fmt.Println(err)  
    return  
}  
// 从指定的config创建一个新的clientset  
clientset, err := kubernetes.NewForConfig(config)

if err != nil {  
    fmt.Println(err)  
    return  
} else {  
    fmt.Println("connect kubernetes cluster success.")  
}

获取指定namespace中的pod信息

// 获取pod列表 pod为名称空间级别资源需指定名称空间
pods, err := clientset.CoreV1().Pods("default").List(metav1.ListOptions{})

if err != nil {
panic(err)
}
// 循环打印pod的信息
for _,pod := range pods.Items {
fmt.Println(pod.ObjectMeta.Name,pod.Status.Phase)
}

创建namespace

nsClient := clientset.CoreV1().Namespaces()

ns := &apiv1.Namespace{
ObjectMeta:metav1.ObjectMeta{
Name: "testzhangsan",
},
Status:apiv1.NamespaceStatus{
Phase:apiv1.NamespaceActive,
},
}
ns,err = nsClient.Create(ns)

if err != nil{
panic(err)
}

fmt.Println(ns.ObjectMeta.Name,ns.Status.Phase)

获取指定名称空间下svc信息

svclist,err := clientset.CoreV1().Services("kube-system").List(metav1.ListOptions{})

for _,svc := range svclist.Items {
fmt.Println(svc.Name,svc.Spec.ClusterIP,svc.Spec.Ports)
}

创建一个deployment控制器

kubernetes中控制器的资源清单如下列所示,故需要按照资源清单的示例来根据客户端库创建控制器

apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: default
labels:
app: redis
spec:
containers:

  • name: redis-app image: redis imagePullPolicy: IfNotPresent ports:
    • name: redis
      containerPort: 6379
  • name: busybox image: busybox command:
    • "/bin/sh"
    • "-c"
    • "sleep 3600"

deployment控制器格式是如下结构体,需要根据此结构体创建

// Deployment enables declarative updates for Pods and ReplicaSets.
type Deployment struct {
metav1.TypeMeta `json:",inline"`
// Standard object metadata.
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

// Specification of the desired behavior of the Deployment.  
// +optional  
Spec DeploymentSpec \`json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"\`

// Most recently observed status of the Deployment.  
// +optional  
Status DeploymentStatus \`json:"status,omitempty" protobuf:"bytes,3,opt,name=status"\`  

}

需要metadata和spec两个选项

故需创建两个结构体,metadate只需要简单的名称和标签定义即可

ObjectMeta:metav1.ObjectMeta{
Name: "testgolangclient",
},

spec为pod的属性定义和副本数量等信息。一个完整的deployment控制器的结构体格式如下

type DeploymentSpec struct {
// Number of desired pods. This is a pointer to distinguish between explicit
// zero and not specified. Defaults to 1.
// +optional
Replicas *int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"`

// Label selector for pods. Existing ReplicaSets whose pods are  
// selected by this will be the ones affected by this deployment.  
// It must match the pod template's labels.  
Selector \*metav1.LabelSelector \`json:"selector" protobuf:"bytes,2,opt,name=selector"\`

// Template describes the pods that will be created.  
Template v1.PodTemplateSpec \`json:"template" protobuf:"bytes,3,opt,name=template"\`

// The deployment strategy to use to replace existing pods with new ones.  
// +optional  
// +patchStrategy=retainKeys  
Strategy DeploymentStrategy \`json:"strategy,omitempty" patchStrategy:"retainKeys" protobuf:"bytes,4,opt,name=strategy"\`

// Minimum number of seconds for which a newly created pod should be ready  
// without any of its container crashing, for it to be considered available.  
// Defaults to 0 (pod will be considered available as soon as it is ready)  
// +optional  
MinReadySeconds int32 \`json:"minReadySeconds,omitempty" protobuf:"varint,5,opt,name=minReadySeconds"\`

// The number of old ReplicaSets to retain to allow rollback.  
// This is a pointer to distinguish between explicit zero and not specified.  
// Defaults to 10.  
// +optional  
RevisionHistoryLimit \*int32 \`json:"revisionHistoryLimit,omitempty" protobuf:"varint,6,opt,name=revisionHistoryLimit"\`

// Indicates that the deployment is paused.  
// +optional  
Paused bool \`json:"paused,omitempty" protobuf:"varint,7,opt,name=paused"\`

// The maximum time in seconds for a deployment to make progress before it  
// is considered to be failed. The deployment controller will continue to  
// process failed deployments and a condition with a ProgressDeadlineExceeded  
// reason will be surfaced in the deployment status. Note that progress will  
// not be estimated during the time a deployment is paused. Defaults to 600s.  
ProgressDeadlineSeconds \*int32 \`json:"progressDeadlineSeconds,omitempty" protobuf:"varint,9,opt,name=progressDeadlineSeconds"\`  

}

此处简单创建一个deployment控制器,故只需副本数量 选择器 template即可。

在资源清单中的spec属性的为如下结构体

type PodTemplateSpec struct {
// Standard object's metadata.
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

// Specification of the desired behavior of the pod.  
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status  
// +optional  
Spec PodSpec \`json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"\`  

}

故此处需要定义,副本数量,选择器,podspec,而副本数量为一个int32类型的数字,标签选择器为一个map[string]string的数组

故定义如下

repl := int32(1) // 副本数量

match := make(map[string]string) // 标签选择器
match["app"] = "nginx"
var podSpec = apiv1.Container {
Name: "golang-client",
Image:"redis",
ImagePullPolicy:"IfNotPresent",
}
containers := []apiv1.Container{podSpec}

var templateSpec = apiv1.PodTemplateSpec{
ObjectMeta:metav1.ObjectMeta{
Name:"testpod",
Labels:match,
},
Spec: apiv1.PodSpec{
Containers:containers,
},
}

定义deployment控制器格式

selecter := metav1.LabelSelector{
MatchLabels: match,
}
deploy := appv1.Deployment{
ObjectMeta:metav1.ObjectMeta{
Name: "testgolangclient",
},

Spec: appv1.DeploymentSpec{  
    Replicas: &repl,  
    Selector:&selecter,  
    Template:templateSpec,  
},

}

创建的deplyment 控制器

podsClient,err := clientset.AppsV1().Deployments("default" /* 名称空间 */).Create(&deploy)