下载地址: 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)