kubernetes客户端client-go使用

下载地址: 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/[email protected]

 

在操作外部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)

 

 

 

 

你可能感兴趣的:(kubernetes客户端client-go使用)