kubernetes client client-go use

Download: https://github.com/kubernetes/client-go

Official Use Document Reference: https://v1-16.docs.kubernetes.io/docs/reference/using-api/client-libraries/

 

Installation for kubernetes1.15.6 version of kubernetes use of cluster

go get -u -v k8s.io/[email protected]

 

In exemplary operation of an external cluster k8s

 

Create a 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() {

	where (
		k8sconfig = flag.String ( "k8sconfig", "./admin.conf", "kubernetes auth config") // use kubeconfig cluster configuration file certification authority
		config    *rest.Config
		err       error
	)
	flag.Parse()

	config, err = clientcmd.BuildConfigFromFlags("", *k8sconfig) 
	if err != nil {
		fmt.Println(err)
		return
	}
	// Create a new clientset from the specified config
	clientset, err := kubernetes.NewForConfig(config)

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

 Obtain information about the specified namespace in the pod

// Get a list pod to pod namespace level of resources required to specify the name space
pods, err := clientset.CoreV1().Pods("default").List(metav1.ListOptions{})


if err != nil {
	panic(err)
}
// print circulation of information pod
for _,pod := range pods.Items {
	fmt.Println(pod.ObjectMeta.Name,pod.Status.Phase)
}

 Create a 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)

 Gets the namespace information under 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)
}

 Create a deployment controller

Listing kubernetes resource controller, as shown below, it is necessary to create a controller according to the exemplary client library according to the list of resources

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: default
  labels:
    app: redis
spec:
  containers:
  - name: redis-app
    Image: repeat
    imagePullPolicy: IfNotPresent
    ports:
    - name: redis
      containerPort: 6379
  - name: busybox
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"

 The format is as follows deployment controller structure, according to this structure need to create

// 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"`
}

 Required metadata spec and two options

 Therefore, we need to create two structures, metadate need only a simple name and label definitions can be

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

 spec defined for the attribute information and the number of copies of the pod. A format structure as complete deployment controller

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"`
}

 Here is simple to create a deployment controller, it is simply the number of copies selector template can be.

The structure is as follows spec properties in the resource list

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"`
}

 Here it is necessary to define the number of copies, a selector, podspec, and the number of copies of a digital type int32, the tag selector a map [string] string array

It is defined as follows

repl: = int32 (1) // number of copies

match: = make (map [string] string) // tag selector
match["app"] = "nginx"
var podSpec = apiv1.Container {
	Name: "golang-client",
	Picture: "repeat"
	ImagePullPolicy:"IfNotPresent",
}
containers := []apiv1.Container{podSpec}

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

Define deployment controller format

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

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

}

 Created deplyment controller

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

Translation copy is read queries, please wait ...... retry reading aloud copy copy copy via Google translate (domestic) translation

Guess you like

Origin www.cnblogs.com/LC161616/p/12046863.html