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

简介: client-go连接kubernetes集群-connect and list。都是查看获取list列表的。现在想用client-go创建应用该如何操作呢?

背景

client-go连接kubernetes集群-connect and list。都是查看获取list列表的。现在想用client-go创建应用该如何操作呢?

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

创建一个namespace:

clientset.CoreV1().Namespaces().Create

package main


import (

"context"

"flag"

"fmt"

v1 "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 := &v1.Namespace{

ObjectMeta: metav1.ObjectMeta{

  Name: "zhangpeng",

},

}

result, err := clientset.CoreV1().Namespaces().Create(context.TODO(), namespace, metav1.CreateOptions{})

if err != nil {

fmt.Println(err)

} else {

fmt.Printf("Create ns %s SuccessFul !", result.ObjectMeta.Name)

list, _ := clientset.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})

for _, item := range list.Items {

  fmt.Println(item.Name)


}

}

//fmt.Println(clientset.ServerVersion())

//list, _ := clientset.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})

//for _, item := range list.Items {

// fmt.Println(item.Name)

//

//}

//fmt.Println("pod list in develop")

//list1, _ := clientset.CoreV1().Pods("develop").List(context.Background(), metav1.ListOptions{})

//for _, item := range list1.Items {

// fmt.Println(item.Name)

//

//}

clientset.AppsV1()


}

嗯打印在一起了 也可以加个换行符?

创建一个deployment

deployment是属于appv1的apiversion.当然了Goland中corev1().后面可以试一下补全是没有deployment的选项的!

*v1.Deployment怎么处理呢?单独写一个deployment的yaml文件然后文件流读取?或者直接在go文件中定义deployment的配置?

生成yaml读取文件流的方式:

生成yaml文件

kubectl create deployment nginx --image=nginx -o yaml --dry-run=client >nginx.yaml

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

       name: nginx

       resources: {}

status: {}

将文件保存为src/yamls/nginx.yaml

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").Create(context.Background(), nginxDep, metav1.CreateOptions{}); err != nil {

fmt.Println(err)

return

}

}

go run main.go

go run main.go再运行一遍

运行第二次就报错已经创建了,基本达到目标,其他的问题以后处理!

go文件中直接定义deployment的配置

package main


import (

"context"

"flag"

"fmt"

v1 "k8s.io/api/apps/v1"

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 := "default"

var replicas int32 = 1

deployment := &v1.Deployment{

ObjectMeta: metav1.ObjectMeta{

  Name: "nginx",

  Labels: map[string]string{

  "app": "nginx",

  "env": "dev",

  },

},

Spec: v1.DeploymentSpec{

  Replicas: &replicas,

  Selector: &metav1.LabelSelector{

  MatchLabels: map[string]string{

    "app": "nginx",

    "env": "dev",

  },

  },

  Template: corev1.PodTemplateSpec{

  ObjectMeta: metav1.ObjectMeta{

    Name: "nginx",

    Labels: map[string]string{

    "app": "nginx",

    "env": "dev",

    },

  },

  Spec: corev1.PodSpec{

    Containers: []corev1.Container{

    {

      Name:  "nginx",

      Image: "nginx:1.16.1",

      Ports: []corev1.ContainerPort{

      {

        Name:          "http",

        Protocol:      corev1.ProtocolTCP,

        ContainerPort: 80,

      },

      },

    },

    },

  },

  },

},

}

deploymentList, err := clientset.AppsV1().Deployments(namespace).Create(context.TODO(), deployment, metav1.CreateOptions{})

fmt.Println(err, deploymentList)


}


参照:https://blog.csdn.net/xujiamin0022016/article/details/123434916

以上两种方式我还是喜欢单独写yaml的方式.....

总结

  1. create就写这两个有代表性的了namespace and deployment.deployment还是很有代表性的......
  2. yaml的方式还是很方便,还是喜欢文件流的方式。
  3. 先简单搞一下crud。增删改查。然后想一下怎么整合一下一步一步来吧
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
9天前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
37 1
|
30天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
1月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
1月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
609 1
|
1月前
|
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容器编排
76 3
|
1月前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
114 1
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
57 1
|
1月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
155 0
|
1月前
|
弹性计算 Kubernetes Linux
如何使用minikube搭建k8s集群
如何使用minikube搭建k8s集群
|
1月前
|
Kubernetes 网络协议 物联网
桥接物联网和云:在 Kubernetes 中增强与 Kong 的 TCPIngress 的连接
桥接物联网和云:在 Kubernetes 中增强与 Kong 的 TCPIngress 的连接
35 0
下一篇
无影云桌面