天天看點

實作調用client-go操作k8s叢集,入門k8s二開

實作調用client-go操作k8s叢集,熟悉k8s二開基礎。更多Golang開發學習資料:​​https://edu.51cto.com/course/31781.html​​

1、簽發賬号證書,建立kubeconfig檔案

1、配置kubeconfig檔案
# 簽發learn證書
cfssl gencert \
-ca=/etc/kubernetes/pki/ca.crt \
-ca-key=/etc/kubernetes/pki/ca.key \
-config=/root/kubernetes/certjson/ca-config.json \
-profile=kubernetes \
-hostname=10.96.0.1,127.0.0.1,k8s.yunlearn.org,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local,192.168.1.10,192.168.1.11,192.168.1.12,192.168.1.13 \
/root/kubernetes/certjson/learn-csr.json | cfssljson -bare /etc/kubernetes/pki/learn
# json檔案請查閱課程:https://edu.51cto.com/course/30386.html
2、設定一個叢集項
kubectl config set-cluster kubernetes     \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true     \
--server=https://k8s.yunlearn.org:6443     \
--kubeconfig=/etc/kubernetes/learn.conf
3、設定一個環境項,一個上下文
kubectl config set-credentials kubernetes-learn \
--client-certificate=/etc/kubernetes/pki/learn.pem \
--client-key=/etc/kubernetes/pki/learn-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/learn.conf
4、設定一個使用者項
kubectl config set-context kubernetes-learn@kubernetes \
--cluster=kubernetes \
--user=kubernetes-learn \
--kubeconfig=/etc/kubernetes/learn.conf
5、設定預設環境
kubectl config use-context kubernetes-learn@kubernetes \
--kubeconfig=/etc/kubernetes/learn.conf
6、将learn.conf重命名為kubeconfig,拷到項目代碼目錄      

2、main主函數

package main

import (
    "bytes"
    "context"
    "crypto/cipher"
    "crypto/des"
    "crypto/md5"
    "flag"
    "fmt"
    appsv1 "k8s.io/api/apps/v1"
    apiv1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/util/intstr"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/retry"
    "time"
)

// 初始化并加載kubeconfi檔案配置
func main() {
    var kubeconfig *string
    //if home := homedir.HomeDir(); home != "" {
    //  kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "kubeconfig"), "(optional) absolute path to the kubeconfig file")
    //} else {
    kubeconfig = flag.String("kubeconfig", "./kubeconfig", "absolute path to the kubeconfig file")
    //}
    flag.Parse()

    //查詢k8s叢集版本号、node、default命名空間pod資源、default命名空間deployment資源
    getk8s(kubeconfig)
    //修改k8s叢集default命名空間deployment資源應用副本數或鏡像版本
    updatedeployment(kubeconfig)
    //删除一個deployment
    deletedeployments(kubeconfig)
    //删除一個svc
    deletesvc(kubeconfig)
    time.Sleep(15 * time.Second)

    //建立一個deployment
    createdeployment(kubeconfig)
    //建立一個svc
    createsvc(kubeconfig)

}      

3、調用client-go查詢k8s叢集資源

// 查詢叢集資源,namespace、pod、node、deployment
func getk8s(kubeconfig *string){
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err.Error())
    }
    // create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("查詢k8s版本:")
    version, err := clientset.ServerVersion()
    fmt.Println("version=", version)
    fmt.Println("*******************************************************")
    fmt.Println("查詢k8s叢集命名空間:")
    list, _ := clientset.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})
    for _, item := range list.Items {
        fmt.Println(item.Name)
    }
    fmt.Println("*******************************************************")
    fmt.Println("查詢k8s叢集節點資源:")
    //fmt.Println("node list ")
    nodeList1, _ := clientset.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{})
    for _, item := range nodeList1.Items {
        fmt.Println(item.Name)
    }
    fmt.Println("*******************************************************")
    fmt.Println("查詢k8s叢集default命名空間pod資源:")
    //fmt.Println("pod list in default")
    list1, _ := clientset.CoreV1().Pods("default").List(context.Background(), metav1.ListOptions{})
    for _, item := range list1.Items {
        fmt.Println(item.Name)
    }
    fmt.Println("*******************************************************")
    fmt.Println("查詢k8s叢集default命名空間deployment資源:")
    //fmt.Println("deployment list in default")
    deploymentList1, _ := clientset.AppsV1().Deployments("default").List(context.Background(), metav1.ListOptions{})
    for _, item := range deploymentList1.Items {
        fmt.Println(item.Name)
    }
}
func int32Ptr(i int32) *int32 { return &i }      

4、調用client-go修改k8s叢集default命名空間deployment資源nginx-test副本數或鏡像版本

// 修改deployment
func updatedeployment(kubeconfig *string)  {
  fmt.Println("*******************************************************")
  fmt.Println("修改k8s叢集default命名空間deployment資源nginx-test副本數或鏡像版本:")
  config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  if err != nil {
    panic(err)
  }
  clientset, err := kubernetes.NewForConfig(config)
  if err != nil {
    panic(err)
  }
  //嘗試更新資源
  retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
    //擷取Get()傳回的“result"
    deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
    result, getErr := deploymentsClient.Get(context.Background(), "nginx-test", metav1.GetOptions{})
    if getErr != nil {
      panic(fmt.Errorf("Failed to get latest version of Deployment: %v", getErr))
    }
    result.Spec.Replicas = int32Ptr(2)                                       // change replica count
    //result.Spec.Template.Spec.Containers[0].Image = "nginx:1.19.6" // change nginx version
    _,updateErr := deploymentsClient.Update(context.Background(), result, metav1.UpdateOptions{})
    return updateErr
  })
  if retryErr != nil {
    panic(fmt.Errorf("Update failed: %v", retryErr))
  }
  fmt.Println("Updated deployment success.")
}

5、源碼調用client-go删除一個deployment
// 删除一個deployment
func deletedeployments(kubeconfig *string){
  fmt.Println("*******************************************************")
  fmt.Println("删除k8s叢集default命名空間deployment名為nginx-demo資源:")
  config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  if err != nil {
    panic(err.Error())
  }

  // create the clientset
  clientset, err := kubernetes.NewForConfig(config)
  deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
  deletePolicy := metav1.DeletePropagationForeground
  if err := deploymentsClient.Delete(context.Background(), "nginx-demo", metav1.DeleteOptions{
    PropagationPolicy: &deletePolicy,
  }); err != nil {
    //anic(err)
  }
  fmt.Println("Deleted deployment nginx-demo success. ")
}      

5、調用client-go删除一個deployment

// 删除一個deployment
func deletedeployments(kubeconfig *string){
  fmt.Println("*******************************************************")
  fmt.Println("删除k8s叢集default命名空間deployment名為nginx-demo資源:")
  config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  if err != nil {
    panic(err.Error())
  }

  // create the clientset
  clientset, err := kubernetes.NewForConfig(config)
  deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
  deletePolicy := metav1.DeletePropagationForeground
  if err := deploymentsClient.Delete(context.Background(), "nginx-demo", metav1.DeleteOptions{
    PropagationPolicy: &deletePolicy,
  }); err != nil {
    //anic(err)
  }
  fmt.Println("Deleted deployment nginx-demo success. ")
}      

6、調用client-go删除一個Service

// 删除一個Service
func deletesvc(kubeconfig *string){
  fmt.Println("*******************************************************")
  fmt.Println("删除k8s叢集default命名空間svc名為nginx-demo資源:")
  config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  if err != nil {
    panic(err.Error())
  }

  // create the clientset
  clientset, err := kubernetes.NewForConfig(config)
  svcClient := clientset.CoreV1().Services(apiv1.NamespaceDefault)
  deletePolicy := metav1.DeletePropagationForeground
  if err := svcClient.Delete(context.Background(), "nginx-demo", metav1.DeleteOptions{
    PropagationPolicy: &deletePolicy,
  }); err != nil {
    //panic(err)
  }
  fmt.Println("Deleted svc nginx-demo success. \n")
}      

7、調用client-go建立一個deployment

// 建立一個deployment
func createdeployment(kubeconfig *string)  {

  config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  if err != nil {
    panic(err)
  }
  clientset, err := kubernetes.NewForConfig(config)
  if err != nil {
    panic(err)
  }

  deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
  // Create Deployment
  deployment := &appsv1.Deployment{
    ObjectMeta: metav1.ObjectMeta{
      Name: "nginx-test",
    },
    Spec: appsv1.DeploymentSpec{
      Replicas: int32Ptr(1),
      Selector: &metav1.LabelSelector{
        MatchLabels: map[string]string{
          "app": "nginx-test",
        },
      },
      Template: apiv1.PodTemplateSpec{
        ObjectMeta: metav1.ObjectMeta{
          Labels: map[string]string{
            "app": "nginx-test",
          },
        },
        Spec: apiv1.PodSpec{
          Containers: []apiv1.Container{
            {
              Name:  "web",
              Image: "nginx:1.19.6",
              Ports: []apiv1.ContainerPort{
                {
                  Name:          "http",
                  Protocol:      apiv1.ProtocolTCP,
                  ContainerPort: 80,
                },
              },
            },
          },
        },
      },
    },
  }
  fmt.Println("Creating deployment...")
  result, err := deploymentsClient.Create(context.Background(), deployment, metav1.CreateOptions{})
  if err != nil {
    //panic(err)
  }
  fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
}      

8、調用client-go建立一個Service

// 建立一個Service
func createsvc(kubeconfig *string)  {
  config, _ := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  clientset, _ := kubernetes.NewForConfig(config)

  namespace := "default"
  var targetPort intstr.IntOrString
  targetPort.IntVal = 80

  service := &apiv1.Service{
    ObjectMeta: metav1.ObjectMeta{
      Name: "nginx-test",
      Labels: map[string]string{
        "app": "nginx-test",
      },
    },
    Spec: apiv1.ServiceSpec{
      Selector: map[string]string{
        "app": "nginx-test",
      },
      Type: "NodePort",

      Ports: []apiv1.ServicePort{
        {
          Name:     "http",
          Port:     80,
          NodePort: 30082,
          TargetPort: targetPort,
          Protocol: apiv1.ProtocolTCP,
        },
      },
    },
  }
  fmt.Println("Creating svc...")
  result, err := clientset.CoreV1().Services(namespace).Create(context.TODO(), service, metav1.CreateOptions{})
  if err != nil {
    //panic(err)
  }
  fmt.Printf("Created svc %q.\n", result.GetObjectMeta().GetName())

}      

繼續閱讀