Go:client-go

时间:April 11, 2021 分类:

目录:

初始化Client

添加数据

参考

Create(ctx context.Context, endpoints *v1.Endpoints, opts metav1.CreateOptions) (*v1.Endpoints, error)

详细代码

    job := &batch_v1.Job{}
    job.Name = contaner_name
    job.Spec.Completions = &completion
    // 对于这种需要单独实例化
    container := core_v1.Container{
        Name:            contaner_name,
        Image:           image,
        Args:            []string{hostname, idc, ip},
        ImagePullPolicy: "Always",
    }
    job.Spec.Template.Spec.Containers = append(job.Spec.Template.Spec.Containers, container)
    job.Spec.Template.Spec.RestartPolicy = "OnFailure"
    _, err := kubectl.BatchV1().Jobs("cronjob").Create(context.TODO(), job, meta_v1.CreateOptions{})
    if err != nil {
        glog.Errorf("Node expansion create job ns: cronjob, name: %s, err: %s", contaner_name, err.Error())
    } else {
        glog.Infof("Node expansion create job ns: cronjob, name: %s", contaner_name)
    }

获取数据

获取数据分Get和List

Get

参考

Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Endpoints, error)

详细代码

    svc, err := kubeclient.CoreV1().Services(namespace).Get(context.TODO(), servicename, meta_v1.GetOptions{})
    if err != nil {
        glog.Error(fmt.Sprintf("获取集群的svc失败,svc: %s, err: %s", servicename, err.Error()))
    } else {
        glog.Info(fmt.Sprintf("获取集群的svc成功,svc: %s", servicename))
    }

List

参考

List(ctx context.Context, opts metav1.ListOptions) (*v1.EndpointsList, error)

meta_v1.GetOptions{}可以添加查询的条件

详细代码

nodelist, err := toClient.CoreV1().Nodes().List(context.TODO(),
        meta_v1.ListOptions{
            LabelSelector: "node-role.kubernetes.io/ingress=true",
        },
    )

更新数据

这里有Patch和Update之分

Update

更新需要在原来的数据基础之上

详细代码

    // 删除一个svc的selector
    delete(svc.Spec.Selector, "env")
    // 清空
    // svc.Spec.Selector = make(map[string]string)
    _, err = toClient.CoreV1().Services(namespace).Update(context.TODO(), svc, meta_v1.UpdateOptions{})
    if err != nil {
        fmt.Println(fmt.Sprintf("更新svc失败,svc: %s, err: %s", svc, err.Error()))
        os.Exit(1)
    } else {
        fmt.Println(fmt.Sprintf("更新svc成功,svc: %s", svc))
    }

Patch

补丁直接提交需要修改的数据,所以对于需要删除一些数据的功能是无法实现的

详细代码

    tsSelector = make(map[string]string)
    tsSelector["env"] = "online"
    tsPatchData := map[string]interface{}{
        "spec": map[string]interface{}{
            "selector": tsSelector,
        },
    }
    tsPausePatchBytes, _ := json.Marshal(tsPausePatchData)
    _, err = toClient.CoreV1().Services(namespace).Patch(context.TODO(), pauseService, types.MergePatchType, tsPausePatchBytes, meta_v1.PatchOptions{})

也可以直接写字符串的json数据,通过[]byte()转换成bytes

删除数据

参考

Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error

informer

其他

获取Node对应的IP地址

func node2ip(n *core_v1.Node) (string, error) {
    for _, i := range n.Status.Addresses {
        if i.Type == "InternalIP" {
            return i.Address, nil
        }
    }
    return "", errors.New("没有获取到InternalIP")
}