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筛选。