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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 紧接client-go连接kubernetes集群-connect and list,client-go连接kubernetes集群-create相关操作。实例都是拿namespace 和deployment两个为代表进行展开延伸的(个人环境中deployment还是具有代表性的),前面创建了namespace deployment,正常的流程下一步就是修改namespace and deployment 了!

背景:

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

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

1. namespace的update

参照create

先看一眼&corev1.Namespace metav1.ObjectMeta中都有哪些配置可以修改,metav1.ObjectMeta{}填充一下所有字段:

Name还是默认的zhangpeng namespace了,我添加一个labels?

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

登录某云后台确认生成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)

}

}

kubectl get resourcequotas -n zhangpeng

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: {}


现在如果直接运行肯定是already exists的!

修改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

kubectl get deployments -n zhangpeng -o yaml

强调:

  1. context.Background()  context.TODO()还是有点懵 分不清什么时候用......
  2. 执行结果的返回没有一致格式化输出,以及一下错误的处理?
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
11天前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
70 17
|
4天前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
61 1
|
9天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
30 1
|
9天前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
26 1
|
14天前
|
Kubernetes Cloud Native Ubuntu
云原生之旅:Kubernetes集群搭建与应用部署
【8月更文挑战第65天】本文将带你进入云原生的世界,通过一步步指导如何在本地环境中搭建Kubernetes集群,并部署一个简单的应用。我们将使用Minikube和Docker作为工具,探索云原生技术的魅力所在。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和实践技巧。
|
18天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
|
5天前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
29 0
|
6天前
|
弹性计算 Kubernetes Linux
如何使用minikube搭建k8s集群
如何使用minikube搭建k8s集群
|
8天前
|
Kubernetes 网络协议 物联网
桥接物联网和云:在 Kubernetes 中增强与 Kong 的 TCPIngress 的连接
桥接物联网和云:在 Kubernetes 中增强与 Kong 的 TCPIngress 的连接
19 0
|
10天前
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。