client-go连接kubernetes集群-update相关操作

背景:

紧接client-go连接kubernetes集群-connect and listclient-go连接kubernetes集群-create相关操作。实例都是拿namespacedeployment两个为代表进行展开延伸的(个人环境中deployment还是具有代表性的),前面创建了namespace deployment,正常的流程下一步就是修改namespace and deployment 了!

client-go连接kubernetes集群-update相关操作

1. namespace的update

参照create
image.png
先看一眼&corev1.Namespace metav1.ObjectMeta中都有哪些配置可以修改,metav1.ObjectMeta{}填充一下所有字段:
image.png
Name还是默认的zhangpeng namespace了,我添加一个labels?
image.png
image.png
image.png
main.go

package main

import (
    "context"
    "flag"
    "fmt"
    corev1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "path/filepath"
)

func main() {
    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")
    }
    flag.Parse()
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err.Error())
    }

    // create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    namespace := &corev1.Namespace{
        ObjectMeta: metav1.ObjectMeta{
            Name:                       "zhangpeng",
            GenerateName:               "",
            Namespace:                  "",
            SelfLink:                   "",
            UID:                        "",
            ResourceVersion:            "",
            Generation:                 0,
            CreationTimestamp:          metav1.Time{},
            DeletionTimestamp:          nil,
            DeletionGracePeriodSeconds: nil,
            Labels: map[string]string{
                "dev": "test",
            },
            Annotations:     nil,
            OwnerReferences: nil,
            Finalizers:      nil,
            ClusterName:     "",
            ManagedFields:   nil,
        },
    }
    result, _ := clientset.CoreV1().Namespaces().Update(context.TODO(), namespace, metav1.UpdateOptions{})
    fmt.Println(result)
}

运行main.go
image.png
image.png
登录某云后台确认生成label!这里正好看到了自愿配额与限制?正巧最近在看文章的时候看到一个这样的例子:基于client-go操作namespace资源配额设计

2. 扩展一下resourcequotas

main.go

package main

import (
    "context"
    "flag"
    "fmt"
    corev1 "k8s.io/api/core/v1"
    "k8s.io/apimachinery/pkg/api/resource"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "path/filepath"
)

func main() {
    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")
    }
    flag.Parse()
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err.Error())
    }

    // create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    namespace := &corev1.Namespace{
        ObjectMeta: metav1.ObjectMeta{
            Name:                       "zhangpeng",
            GenerateName:               "",
            Namespace:                  "",
            SelfLink:                   "",
            UID:                        "",
            ResourceVersion:            "",
            Generation:                 0,
            CreationTimestamp:          metav1.Time{},
            DeletionTimestamp:          nil,
            DeletionGracePeriodSeconds: nil,
            Labels: map[string]string{
                "dev": "test",
            },
            Annotations:     nil,
            OwnerReferences: nil,
            Finalizers:      nil,
            ClusterName:     "",
            ManagedFields:   nil,
        },
    }
    result, _ := clientset.CoreV1().Namespaces().Update(context.TODO(), namespace, metav1.UpdateOptions{})
    fmt.Println(result)
    quotaTest := clientset.CoreV1().ResourceQuotas("zhangpeng")
    quota := &corev1.ResourceQuota{
        ObjectMeta: metav1.ObjectMeta{
            Name: "quota-namespace",
        },
        Spec: corev1.ResourceQuotaSpec{
            Hard: map[corev1.ResourceName]resource.Quantity{
                corev1.ResourceLimitsCPU:      resource.MustParse("200m"),
                corev1.ResourceLimitsMemory:   resource.MustParse("200M"),
                corev1.ResourceRequestsCPU:    resource.MustParse("1000m"),
                corev1.ResourceRequestsMemory: resource.MustParse("1Gi"),
            },
        },
    }

    result1, err := quotaTest.Create(context.TODO(), quota, metav1.CreateOptions{})
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(result1)
    }
}

image.png

kubectl get resourcequotas -n zhangpeng

image.png

3. update deployment

参照:client-go连接kubernetes集群-create相关操作生成yaml读取文件流的方式
修改nginx镜像tag为1.16
src/yamls/nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
        - image: nginx:1.16
          name: nginx
          resources: {}
status: {}

image.png
现在如果直接运行肯定是already exists的!
image.png
修改main.go如下:

package main

import (
    "context"
    "encoding/json"
    "flag"
    "fmt"
    "io/ioutil"
    v1 "k8s.io/api/apps/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/util/yaml"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "path/filepath"
)

func main() {
    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")
    }
    flag.Parse()
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err.Error())
    }

    // create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    b, err := ioutil.ReadFile("src/yamls/nginx.yaml")
    nginxDep := &v1.Deployment{}
    nginxJson, _ := yaml.ToJSON(b)
    if err = json.Unmarshal(nginxJson, nginxDep); err != nil {
        return
    }
    if _, err = clientset.AppsV1().Deployments("zhangpeng").Update(context.Background(), nginxDep, metav1.UpdateOptions{}); err != nil {
        fmt.Println(err)
        return
    }
}

运行main.go
image.png

kubectl get deployments -n zhangpeng -o yaml

image.png

强调:

  1. context.Background() context.TODO()还是有点懵 分不清什么时候用......
  2. 执行结果的返回没有一致格式化输出,以及一下错误的处理?

29 声望
9 粉丝
0 条评论
推荐阅读
Ubuntu20.4 docker运行stable diffusion webui
环境前提系统环境ubuntu20.04 {代码...} nvida cuda显卡驱动默认已经安装成功 {代码...} 安装配置dockerupgrade系统更新系统依赖: {代码...} 卸载之前的Docker环境确认是否之前安装过docker并卸载: {代码...} ...

对你无可奈何阅读 84

Helm3-安装RabbitMQ
最近在使用k8s搭建微服务时,发现需要手动修改yaml文件里面的pod name、pod image、svc name、ingress tls等等,非常麻烦,但是有了helm之后情况就不一样了,helm是k8s的包管理器,类似ubuntu的apt-get,centos的...

Awbeci阅读 9.6k

Kubernetes Gateway API 深入解读和落地指南
Kubernetes Gateway API 是 Kubernetes 1.18 版本引入的一种新的 API 规范,是 Kubernetes 官方正在开发的新的 API,Ingress 是 Kubernetes 已有的 API。Gateway API 会成为 Ingress 的下一代替代方案。Gateway A...

Rainbond2阅读 444

Jvm调优与微服务资源分配
在没有接触微服务之前,我们的java程序一般都部署在WebLogic、Tomcat这类应用服务器上,这些应用服务器本身也是基于Jvm虚拟机的。一般我们统一对应用服务器做Jvm参数调优(分配多大内存,线程池限制等),而不用...

KerryWu阅读 6.1k

K8S-使用Helm安装RabbitMQ和Redis的总结
记得去年2021上半年的时候自学了k8s并且使用helm安装了rabbitmq和redis,可以在开发、测试和生产环境上用起来,但是下半年之后就没有用,再拾起来的时候发现好多知识点都忘了,这篇文章就是总结使用helm安装rabbm...

Awbeci1阅读 1.9k

Kubernetes v1.27 新特性一览
Kubernetes v1.27 是 2023 年的第一个大版本更新,包含了近 60 项主要的更新。 而 1.26 只有 37 项,所以这个版本可以说是一个变化非常显著的版本了。

张晋涛1阅读 1.1k

封面图
实战:用“廉价”的NFS作为K8S后端存储
大家都知道,NFS是一种基于网络的文件系统协议,允许在不同的机器之间共享文件系统资源。在K8S中,可以使用NFS作为后端存储,以提供持久化存储和共享存储卷。但是否适合在生产环境使用NFS作为后端存储,这取决于...

不背锅运维2阅读 759

29 声望
9 粉丝
宣传栏