【kubernetes/k8s API】k8s client go 接口

本文介绍如何通过 Kubernetes API 客户端进行资源操作,包括客户端配置、多种核心资源(如 Namespace、Deployment、Service 和 Ingress)的创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
}


I0320 23:13:57.319046 26949 cmdutil.go:80] Using kubeconfig file: /root/.kube/config I0320 23:13:57.320460 26949 token.go:367] [token] preparing selector for bootstrap token I0320 23:13:57.320486 26949 token.go:380] [token] retrieving list of bootstrap tokens Get "https://10.101.31.134:6443/api/v1/namespaces/kube-system/secrets?fieldSelector=type%3Dbootstrap.kubernetes.io%2Ftoken": x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes") failed to list bootstrap tokens k8s.io/kubernetes/cmd/kubeadm/app/cmd.RunListTokens /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/cmd/kubeadm/app/cmd/token.go:383 k8s.io/kubernetes/cmd/kubeadm/app/cmd.newCmdToken.func2 /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/cmd/kubeadm/app/cmd/token.go:174 k8s.io/kubernetes/vendor/github.com/spf13/cobra.(*Command).execute /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/spf13/cobra/command.go:850 k8s.io/kubernetes/vendor/github.com/spf13/cobra.(*Command).ExecuteC /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/spf13/cobra/command.go:958 k8s.io/kubernetes/vendor/github.com/spf13/cobra.(*Command).Execute /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/spf13/cobra/command.go:895 k8s.io/kubernetes/cmd/kubeadm/app.Run /workspace/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/cmd/kubeadm/app/kubeadm.go:50 main.main _output/dockerized/go/src/k8s.io/kubernetes/cmd/kubeadm/kubeadm.go:25 runtime.main /usr/local/go/src/runtime/proc.go:204 runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1374
最新发布
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值