【kubernetes/k8s API】k8s client go 接口

1 k8s client 创建

k8s client 客户端建立连接,主要是kube config 配置,默认在工作目录~/.kube文件下,包括k8s apiserver地址,认证等配置

apiVersion: v1
kind: Config
current-context: admin-cluster.local
preferences: {}
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5ekNDQWQrZ0F3SUJBZ0lKQUsxSFdXem4xU1FtTUEwR0NTcUdTSWIzRFFFQkN3VUFNQkl4RURBT0JnTlYKQkFNTUIydDFZbVV0WTJFd0hoY05NVGd3TkRJM01EazBPRFE0V2hjTk5EVXdPVEV5TURrME9EUTRXakFTTVJBdwpEZ1lEVlFRRERBZHJkV0psTFdOaE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCm94TFhUT2pOcDRFc0NBeGJNSTVQbkc4Mk5iaXcxQm9sWTk2eWdEQU54aVNUdFNMY0FCVDgyaUY1UWFsN2pLK3YKZUFkZzAvdWZ2dkxsWGcvOENkVEpaZmVDUFdydTJMS3czcnZTOElBcWxNME5OdUtPbUFSTXdCNTBodFM2c2RGbQo2RWpZTlc1Nm4ySE8zQmFtOGlyWjFEOGhtYU9QWXJoTzlDWUQxSisxZHN5ekVTTklLZ3gzTm1wRFlPc1hLengxCngwMDdsUThpOERmVFFOaWFISjRld1RtSUhrbCsrQm80b1J3Ym5jNk1yZFRnUmFqWHRVOURjVmJmSTNTeDVuT0kKRFA2bVVzcHJTYVdSRElPZWdmckszY1E2Ty80VkEwK3A2WDRvVnZ2VjJha1l1c3JJSTNwV2svRGJFTjVwd3FkYgpUZjNTV0pWSExicCthTC9kbm5UMGp3SURBUUFCbzFBd1RqQWRCZ05WSFE0RUZnUVVNdUZHZ0N6cmFjK2QyU1ZvCmpyZWgwRTIweXZjd0h3WURWUjBqQkJnd0ZvQVVNdUZHZ0N6cmFjK2QyU1ZvanJlaDBFMjB5dmN3REFZRFZSMFQKQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBb3JXc0JRNCtqNjhCZS9CMUpReVQrZE1aanU3dwpCZEZxNmVONTBvYWhLZlY0T0lwWDNpSEN0VGxYSll6U1pqWWJOK3NFVmFWNzI3VVdEcEtZR28xeGhvSWZiRkN2CnlVV0N0OURYQXc2UDVZcEZKTEYrUmJuNXBVZDcxUmF6NnYzb3ZyTGw4ekNSRERSYndDeXJYQlpUWXRNS1pBM1EKT0ZlMHBUUFplZUc4Q01pQmorVmhLcHBKQkkxZGJtYUpwSmVLRHUxU1cxdlpJbVZyRWZQdW5IUitwNHYwMFlSZgpBRXdRTlgvNFBsNWRHOExjTGJlZW8xRm9KdVpWMmRxYUlEelk2VWJKMWplaTJzWWdmak5XQ0txZkoyTUFCQmFSCnlvYlpnb0NCazYrb2tCOGswOEtqRzlvcGM1MEVCTFJvQS93eHlKTEhpcS9PbWlVcFhPcm85NzFrYnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://10.12.51.84:6443
name: cluster.local
contexts:
- context:
cluster: cluster.local
user: admin-cluster.local
name: admin-cluster.local
users:
- name: admin-cluster.local

建立客户端连接如下所示:

type KubeClient struct {
   kubeClientConfig *restclient.Config
   Clientset        *kubernetes.Clientset
}

func newKubeConfig() *restclient.Config {
   var kubeconfig *string
   if home := homedir.HomeDir(); home != "" {
      kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
   } else {
      kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
   }

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

   return config
}

func NewKubeClient() (*KubeClient, error) {
   kubeClient := &KubeClient{kubeClientConfig: newKubeConfig()}
   if err := kubeClient.CreateClient(); err != nil {
      return nil, err
   }

   return kubeClient, nil
}

func (kc *KubeClient) CreateClient() error {
   if kc.Clientset == nil {
      clientset, err := kubernetes.NewForConfig(kc.kubeClientConfig)
      if err != nil {
         return err
      }
      kc.Clientset = clientset
   }

   return nil
}

2 namespace 接口

// NamespaceInterface has methods to work with Namespace resources.
type NamespaceInterface interface {
   Create(*v1.Namespace) (*v1.Namespace, error)
   Update(*v1.Namespace) (*v1.Namespace, error)
   UpdateStatus(*v1.Namespace) (*v1.Namespace, error)
   Delete(name string, options *meta_v1.DeleteOptions) error
   DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error
   Get(name string, options meta_v1.GetOptions) (*v1.Namespace, error)
   List(opts meta_v1.ListOptions) (*v1.NamespaceList, error)
   Watch(opts meta_v1.ListOptions) (watch.Interface, error)
   Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Namespace, err error)
   NamespaceExpansion
}

例如使用namespace创建接口,namespace 属于core v1版本,把Namespace结构体填充,调用接口即可

func (ns *Namespace) Create() error {
   klog.Infof("Create kube namespaces: %v", ns.name)

   if err := ns.kubeClient.CreateClient(); err != nil {
      return err
   }

   namespaces := &v1.Namespace{}
   namespaces.Kind = kindNamespace
   namespaces.Name = ns.name

   _, err := ns.kubeClient.Clientset.CoreV1().Namespaces().Create(namespaces)
   return err
}

3 deployment 接口

// DeploymentInterface has methods to work with Deployment resources.
type DeploymentInterface interface {
   Create(*v1.Deployment) (*v1.Deployment, error)
   Update(*v1.Deployment) (*v1.Deployment, error)
   UpdateStatus(*v1.Deployment) (*v1.Deployment, error)
   Delete(name string, options *meta_v1.DeleteOptions) error
   DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error
   Get(name string, options meta_v1.GetOptions) (*v1.Deployment, error)
   List(opts meta_v1.ListOptions) (*v1.DeploymentList, error)
   Watch(opts meta_v1.ListOptions) (watch.Interface, error)
   Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Deployment, err error)
   DeploymentExpansion
}

示例创建deployment,主要复杂的就是填充deployment结构体,其主要是创建容器的image,cpu memory 资源限制request以及limit,volume,readiness,liveiness等

func (d *Deployment) Create() error {
   klog.Infof("Create deployment: %s to k8s", d.template.Name)

   deployment, err := getDeploymentStruct(d)
   if err != nil {
      return err
   }

   if err := d.kubeClient.CreateClient(); err != nil {
      return err
   }

   _, err = d.kubeClient.Clientset.AppsV1().
      Deployments(d.namespaceName).
      Create(deployment)
   if err != nil {
      return err
   }

   return nil
}

4 service 接口

// ServiceInterface has methods to work with Service resources.
type ServiceInterface interface {
   Create(*v1.Service) (*v1.Service, error)
   Update(*v1.Service) (*v1.Service, error)
   UpdateStatus(*v1.Service) (*v1.Service, error)
   Delete(name string, options *meta_v1.DeleteOptions) error
   DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error
   Get(name string, options meta_v1.GetOptions) (*v1.Service, error)
   List(opts meta_v1.ListOptions) (*v1.ServiceList, error)
   Watch(opts meta_v1.ListOptions) (watch.Interface, error)
   Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Service, err error)
   ServiceExpansion
}

示例创建service,主要是pod的端口设置

func (s *Service) Create() error {
   klog.Infof("Create service: %s to k8s", s.template.Name)
   service := getServiceStruct(s)
   if err := s.kubeClient.CreateClient(); err != nil {
      return err
   }

   if _, err := s.kubeClient.Clientset.CoreV1().
      Services(s.namespaceName).
      Create(service); err != nil {
      return err
   }
   return nil
}

5 ingress 接口

// IngressInterface has methods to work with Ingress resources.
type IngressInterface interface {
   Create(*v1beta1.Ingress) (*v1beta1.Ingress, error)
   Update(*v1beta1.Ingress) (*v1beta1.Ingress, error)
   UpdateStatus(*v1beta1.Ingress) (*v1beta1.Ingress, error)
   Delete(name string, options *v1.DeleteOptions) error
   DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
   Get(name string, options v1.GetOptions) (*v1beta1.Ingress, error)
   List(opts v1.ListOptions) (*v1beta1.IngressList, error)
   Watch(opts v1.ListOptions) (watch.Interface, error)
   Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.Ingress, err error)
   IngressExpansion
}

主要使用对外暴露 地址设置访问后端的service port服务

func (ing *Ingress) Create() error {
   klog.Infof("Create kube ingress: %s", ing.template.Name)
   ingress := getIngressStruct(ing)
   if err := ing.kubeClient.CreateClient(); err != nil {
      return err
   }

   if _, err := ing.kubeClient.Clientset.
      ExtensionsV1beta1().
      Ingresses(ing.namespaceName).
      Create(ingress); err != nil {
      return err
   }
   return nil
}


猜你喜欢

转载自blog.csdn.net/zhonglinzhang/article/details/80697766