kubernetes Deployment【4】 client-go 管理 deployment

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: kubernetes Deployment【4】 client-go 管理 deployment

kubernetes client-go 管理 deployment

tags: client-go,Deployment

文章目录

kubernetes client-go 管理 deployment

1. deployment控制器实现流程:

2. 操作deployment查看创建

2.1 go.mod

2.2 client.go

Kubernetes Deployment【1】管理与编排入门

Kubernetes Deployment【2】原理深入详解

Kubernetes Deployment【3】管理高级技巧详解

Kubernetes Deployment【4】client-go 管理 deployment

云原生圣经

1. deployment控制器实现流程:

Deployment 控制器从 Etcd 中获取到所有携带了“app: nginx”标签的 Pod,然后统计它们的数量,这就是实际状态;

Deployment 对象的 Replicas 字段的值就是期望状态;

Deployment 控制器将两个状态做比较,然后根据比较结果,确定是创建 Pod,还是删除已有的 Pod

可以看到,一个 Kubernetes 对象的主要编排逻辑,实际上是在第三步的“对比”阶段完成的。这个操作,通常被叫作调谐(Reconcile)。这个调谐的过程,则被称作“Reconcile Loop”(调谐循环)或者“Sync Loop”(同步循环)。我们社区交流也称为“控制循环”,

2. 操作deployment查看创建

注意:

Apps/v1beta1 1.16版本以上不再支持,而是Apps/v1

deployments, err := clientset.Appv1().Deployments("").List(metav1.ListOptions{})

2.1 go.mod

module createdeployment
go 1.13
require (
  github.com/evanphx/json-patch v4.9.0+incompatible // indirect
  github.com/fsnotify/fsnotify v1.4.9 // indirect
  github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirect
  github.com/golang/protobuf v1.4.2 // indirect
  github.com/googleapis/gnostic v0.4.0 // indirect
  github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
  github.com/imdario/mergo v0.3.11 // indirect
  github.com/json-iterator/go v1.1.10 // indirect
  github.com/pkg/errors v0.9.1 // indirect
  golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect
  golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 // indirect
  golang.org/x/text v0.3.3 // indirect
  golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
  google.golang.org/protobuf v1.24.0 // indirect
  k8s.io/apimachinery v0.17.0
  k8s.io/client-go v0.17.0
  k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac // indirect
  k8s.io/klog/v2 v2.2.0 // indirect
  k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
  sigs.k8s.io/structured-merge-diff/v4 v4.0.1 // indirect
)

2.2 client.go

package main
import (
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/kubernetes"
    appsv1 "k8s.io/api/apps/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    apiv1 "k8s.io/api/core/v1"
    "k8s.io/client-go/kubernetes/typed/apps/v1"
    "flag"
    "fmt"
    "encoding/json"
)
func main() {
    //kubelet.kubeconfig  是文件对应地址
    kubeconfig := flag.String("kubeconfig", "/root/.kube/config", "(optional) absolute path to the kubeconfig file")
    flag.Parse()
    // 解析到config
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err.Error())
    }
    // 创建连接
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    deploymentsClient := clientset.AppsV1().Deployments("default")
    //创建deployment
    createDeployment(deploymentsClient)
    //监听deployment
    startWatchDeployment(deploymentsClient)
}
//监听Deployment变化
func startWatchDeployment(deploymentsClient v1.DeploymentInterface) {
    w, _ := deploymentsClient.Watch(metav1.ListOptions{})
    for {
        select {
        case e, _ := <-w.ResultChan():
            fmt.Println(e.Type, e.Object)
        }
    }
}
//创建deployemnt,需要谨慎按照部署的k8s版本来使用api接口
func createDeployment(deploymentsClient v1.DeploymentInterface)  {
    var r apiv1.ResourceRequirements
    //r  =  new(*apiv1.ResourceRequirements)
    //资源分配会遇到无法设置值的问题,故采用json反解析
    j := `{"limits": {"cpu":"200m", "memory": "1Gi"}, "requests": {"cpu":"200m", "memory": "1Gi"}}`
    json.Unmarshal([]byte(j), &r)
    deployment := &appsv1.Deployment{
        ObjectMeta: metav1.ObjectMeta{
            Name: "nginx",
            Labels: map[string]string{
                "app": "nginx",
            },
        },
        Spec: appsv1.DeploymentSpec{
            Replicas: int32Ptr2(1),
            Selector: &metav1.LabelSelector{
    MatchLabels: map[string]string{
    "app": "nginx",
    },
      },
            Template: apiv1.PodTemplateSpec{
                ObjectMeta: metav1.ObjectMeta{
                    Labels: map[string]string{
                        "app": "nginx",
                    },
                },
                Spec: apiv1.PodSpec{
                    Containers: []apiv1.Container{
                        {   Name:               "nginx",
                            Image:           "nginx:1.13.5-alpine",
                            Resources: r,
                            ImagePullPolicy: "IfNotPresent",
                            Ports: []apiv1.ContainerPort{
                                {
                                   Name: "http",
                                   Protocol: apiv1.ProtocolTCP,
                                   ContainerPort: 80,
                        },
                    },
                },
            },
        },
      },
     }, 
    }
    fmt.Println("Creating deployment...")
    result, err := deploymentsClient.Create(deployment)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Created deployment %s.\n", result.GetObjectMeta().GetName())
}
func int32Ptr2(i int32) *int32 { return &i }

参考资料:


https://godoc.org/k8s.io/client-go/kubernetes#Clientset

https://godoc.org/k8s.io/client-go/kubernetes/typed/core/v1

https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/volume/persistentvolume/pv_controller_base.go

https://github.com/openshift/origin/blob/master/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go

https://www.bookstack.cn/read/huweihuang-kubernetes-notes/develop-client-go.md



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
|
8天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
|
2月前
|
Kubernetes Go Docker
在K8s编程中如何使用Go
一文带你了解在K8s编程中如何使用Go
78 3
|
3月前
|
Kubernetes 容器 Perl
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
在K8S中,Deployment⽀持扩容吗?它与HPA有什么区别?
|
3月前
|
Kubernetes 监控 Cloud Native
"解锁K8s新姿势!Cobra+Client-go强强联手,打造你的专属K8s监控神器,让资源优化与性能监控尽在掌握!"
【8月更文挑战第14天】在云原生领域,Kubernetes以出色的扩展性和定制化能力引领潮流。面对独特需求,自定义插件成为必要。本文通过Cobra与Client-go两大利器,打造一款监测特定标签Pods资源使用的K8s插件。Cobra简化CLI开发,Client-go则负责与K8s API交互。从初始化项目到实现查询逻辑,一步步引导你构建个性化工具,开启K8s集群智能化管理之旅。
53 2
|
3月前
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?
|
3月前
|
Kubernetes API 开发工具
在K8S中,Deployment的升级过程是什么?
在K8S中,Deployment的升级过程是什么?
|
3月前
|
存储 Kubernetes 调度
在K8S中,deployment的创建过程包括什么?
在K8S中,deployment的创建过程包括什么?
|
3月前
|
Kubernetes API 容器
在K8S中,deployment的yaml文件如何编写呢?
在K8S中,deployment的yaml文件如何编写呢?
|
3月前
|
Kubernetes 容器 Perl
在k8S中,deployment升级策略是什么?
在k8S中,deployment升级策略是什么?