client-go连接kubernetes集群-create
背景
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的方式.....
总结
- create就写这两个有代表性的了namespace and deployment.deployment还是很有代表性的......
- yaml的方式还是很方便,还是喜欢文件流的方式。
- 先简单搞一下crud。增删改查。然后想一下怎么整合一下一步一步来吧
29 声望
9 粉丝
推荐阅读
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...
Rainbond赞 2阅读 444
Jvm调优与微服务资源分配
在没有接触微服务之前,我们的java程序一般都部署在WebLogic、Tomcat这类应用服务器上,这些应用服务器本身也是基于Jvm虚拟机的。一般我们统一对应用服务器做Jvm参数调优(分配多大内存,线程池限制等),而不用...
KerryWu阅读 6.1k
K8S-使用Helm安装RabbitMQ和Redis的总结
记得去年2021上半年的时候自学了k8s并且使用helm安装了rabbitmq和redis,可以在开发、测试和生产环境上用起来,但是下半年之后就没有用,再拾起来的时候发现好多知识点都忘了,这篇文章就是总结使用helm安装rabbm...
Awbeci赞 1阅读 1.9k
Kubernetes v1.27 新特性一览
Kubernetes v1.27 是 2023 年的第一个大版本更新,包含了近 60 项主要的更新。 而 1.26 只有 37 项,所以这个版本可以说是一个变化非常显著的版本了。
张晋涛赞 1阅读 1.1k
实战:用“廉价”的NFS作为K8S后端存储
大家都知道,NFS是一种基于网络的文件系统协议,允许在不同的机器之间共享文件系统资源。在K8S中,可以使用NFS作为后端存储,以提供持久化存储和共享存储卷。但是否适合在生产环境使用NFS作为后端存储,这取决于...
不背锅运维赞 2阅读 759
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。