kubernetes 的管理之:deployment

kubernetes 是什么?

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。官方地址

client-go 又是什么?

client-go是一个调用kubernetes集群资源对象API的客户端,即通过client-go实现对kubernetes集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作。大部分对kubernetes进行前置API封装的二次开发都通过client-go这个第三方包来实现。
github 地址

如何实现deployment 管理的呢?

1、 创建clientset

ClientSet 是一个负责访问k8s集群 apiserver 的客户端。里面包含了各版本的api-group。

   // Clientset contains the clients for groups. Each group has exactly one
   // version included in a Clientset.
   type Clientset struct {
   		*discovery.DiscoveryClient
   		admissionregistrationV1beta1 *admissionregistrationv1beta1.AdmissionregistrationV1beta1Client
   		appsV1                       *appsv1.AppsV1Client
   		appsV1beta1                  *appsv1beta1.AppsV1beta1Client
   		appsV1beta2                  *appsv1beta2.AppsV1beta2Client
   		auditregistrationV1alpha1    *auditregistrationv1alpha1.AuditregistrationV1alpha1Client
   		authenticationV1             *authenticationv1.AuthenticationV1Client
   		authenticationV1beta1        *authenticationv1beta1.AuthenticationV1beta1Client
   		authorizationV1              *authorizationv1.AuthorizationV1Client
   		authorizationV1beta1         *authorizationv1beta1.AuthorizationV1beta1Client
   		autoscalingV1                *autoscalingv1.AutoscalingV1Client
   		autoscalingV2beta1           *autoscalingv2beta1.AutoscalingV2beta1Client
   		autoscalingV2beta2           *autoscalingv2beta2.AutoscalingV2beta2Client
   		batchV1                      *batchv1.BatchV1Client
   		batchV1beta1                 *batchv1beta1.BatchV1beta1Client
   		batchV2alpha1                *batchv2alpha1.BatchV2alpha1Client
   		certificatesV1beta1          *certificatesv1beta1.CertificatesV1beta1Client
   		coordinationV1beta1          *coordinationv1beta1.CoordinationV1beta1Client
   		coordinationV1               *coordinationv1.CoordinationV1Client
   		coreV1                       *corev1.CoreV1Client
   		eventsV1beta1                *eventsv1beta1.EventsV1beta1Client
   		extensionsV1beta1            *extensionsv1beta1.ExtensionsV1beta1Client
   		networkingV1                 *networkingv1.NetworkingV1Client
   		networkingV1beta1            *networkingv1beta1.NetworkingV1beta1Client
   		nodeV1alpha1                 *nodev1alpha1.NodeV1alpha1Client
   		nodeV1beta1                  *nodev1beta1.NodeV1beta1Client
   		policyV1beta1                *policyv1beta1.PolicyV1beta1Client
   		rbacV1                       *rbacv1.RbacV1Client
   		rbacV1beta1                  *rbacv1beta1.RbacV1beta1Client
   		rbacV1alpha1                 *rbacv1alpha1.RbacV1alpha1Client
   		schedulingV1alpha1           *schedulingv1alpha1.SchedulingV1alpha1Client
   		schedulingV1beta1            *schedulingv1beta1.SchedulingV1beta1Client
   		schedulingV1                 *schedulingv1.SchedulingV1Client
   		settingsV1alpha1             *settingsv1alpha1.SettingsV1alpha1Client
   		storageV1beta1               *storagev1beta1.StorageV1beta1Client
   		storageV1                    *storagev1.StorageV1Client
   		storageV1alpha1              *storagev1alpha1.StorageV1alpha1Client
   	}
   // 解析config
   config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
   if err != nil {
       panic(err.Error())
   }

   // 创建连接
   clientset, err := kubernetes.NewForConfig(config)
   if err != nil {
       panic(err.Error())
   }

kubeconfig参数为clientset 要是使用的config文件,里面描述了cluster地址,current 用户信息(有哪些权限),默认namespace等相关参数,这样clientset就拥有了kubeconfig的用户权限。

注: kuberconfig 默认路径 ~/.kube./config (记录了当前登陆用户的信息)

2、deployment 相关api 接口

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

上面描述了deployment 相关所有接口,包括Create(),Update(),updateStatus(),Delete(),DeleteCollection(),Get(),List(),Watch(),Patch()。

3、通过api接口,操作deployment 资源

3.1、构造deployment 实例
           deployment := &v1beta1.Deployment{
			  ObjectMeta: metav1.ObjectMeta{
			    Name: "demo-deployment",                  // 指定 deployment 名字
			  },
			  Spec: appsv1.DeploymentSpec{
			    Replicas: int32Ptr(2),                           // 指定副本数
			    Selector: &metav1.LabelSelector{       // 指定标签
			      MatchLabels: map[string]string{
			        "app": "demo",
			      },
			    },
			    Template: apiv1.PodTemplateSpec{     // 容器模板
			      ObjectMeta: metav1.ObjectMeta{
			        Labels: map[string]string{
			          "app": "demo",
			        },
			      },
			      Spec: apiv1.PodSpec{
			        ...
			      },
			    },
			  },
			}

其实上述结构信息,就是通命令行创建(kubectl apply -f yaml)时,yaml 描述文件里的信息。

3.2 向 apiserver 发送请求,对deployment进行操作
    //创建
     _,err = cli.AppsV1beta1().Deployments(application.Namespace).Create(&kubeDeployment)
	 if err != nil{
		 panic(err.Error())
	 } 

namespace 指定创建在哪个namespace下

    //删除
   _,err = cli.ExtensionsV1beta1().Deployments(namespace).Delete(name, &metav1.DeleteOptions{})
	 if err != nil{
		 panic(err.Error())
	 } 
   //更新
 _,err = cli.AppsV1beta1().Deployments(deployment.Namespace).Update(old)
    if err != nil{
   	 panic(err.Error())
    } 
   //查询
 _,err = cli.AppsV1beta1().Deployments(deployment.Namespace).get(&metav1.DeleteOptions{})
    if err != nil{
   	 panic(err.Error())
    } 

通过以上几个接口,就可以基本完成对deployment 的管理了,那么如何实时获取deployment 资源的变化呢?可以通过上面的watch 接口监听,client-go提供了一个更高级的接口,informer,后续在详细讨论

3.3 查询deployment 下 pod 和 container 状态
func GetDeploymentDetail(deployment *v1beta1.Deployment, indexer *client.CacheFactory) ([]Deployment, error) {
	pods, err := indexer.PodLister().Pods(deployment.Namespace).List(labels.SelectorFromSet(deployment.Spec.Template.Labels))
	if err != nil {
		logs.Error("get pod list err")
		return nil, err
	}
	deployments := make([]Deployment,0)
	for _, pod := range pods {
		deployments = append(deployments, Deployment{
			Name: pod.Name,
			Namespace: pod.Namespace,
			Status: string(pod.Status.Phase),
			Node: pod.Spec.NodeName,
			Labels: pod.Labels,
			Containers: toContainer(pod),
		})
	}

	return deployments,nil
}

func GetContainers(pod *v1.Pod) []Container {
	ret := make([]Container,0)
	containers := pod.Spec.Containers
	for i, index := range containers {
		ret = append(ret,Container{
			Name: index.Name,
			Image: index.Image,
			State: pod.Status.ContainerStatuses[i].State,
		})

	}
	return ret
}

查询deployment 关联pod 和 container相关操作,其实就是pod 的list 接口,通过label筛选。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值