实现调用client-go操作k8s集群,熟悉k8s二开基础。更多Golang开发学习资料:https://edu.51cto.com/course/31781.html
1、签发账号证书,创建kubeconfig文件
1、配置kubeconfig文件
# 签发learn证书
cfssl gencert \
-ca=/etc/kubernetes/pki/ca.crt \
-ca-key=/etc/kubernetes/pki/ca.key \
-config=/root/kubernetes/certjson/ca-config.json \
-profile=kubernetes \
-hostname=10.96.0.1,127.0.0.1,k8s.yunlearn.org,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local,192.168.1.10,192.168.1.11,192.168.1.12,192.168.1.13 \
/root/kubernetes/certjson/learn-csr.json | cfssljson -bare /etc/kubernetes/pki/learn
# json文件请查阅课程:https://edu.51cto.com/course/30386.html
2、设置一个集群项
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://k8s.yunlearn.org:6443 \
--kubeconfig=/etc/kubernetes/learn.conf
3、设置一个环境项,一个上下文
kubectl config set-credentials kubernetes-learn \
--client-certificate=/etc/kubernetes/pki/learn.pem \
--client-key=/etc/kubernetes/pki/learn-key.pem \
--embed-certs=true \
--kubeconfig=/etc/kubernetes/learn.conf
4、设置一个用户项
kubectl config set-context kubernetes-learn@kubernetes \
--cluster=kubernetes \
--user=kubernetes-learn \
--kubeconfig=/etc/kubernetes/learn.conf
5、设置默认环境
kubectl config use-context kubernetes-learn@kubernetes \
--kubeconfig=/etc/kubernetes/learn.conf
6、将learn.conf重命名为kubeconfig,拷到项目代码目录
2、main主函数
package main
import (
"bytes"
"context"
"crypto/cipher"
"crypto/des"
"crypto/md5"
"flag"
"fmt"
appsv1 "k8s.io/api/apps/v1"
apiv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/retry"
"time"
)
// 初始化并加载kubeconfi文件配置
func main() {
var kubeconfig *string
//if home := homedir.HomeDir(); home != "" {
// kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "kubeconfig"), "(optional) absolute path to the kubeconfig file")
//} else {
kubeconfig = flag.String("kubeconfig", "./kubeconfig", "absolute path to the kubeconfig file")
//}
flag.Parse()
//查询k8s集群版本号、node、default命名空间pod资源、default命名空间deployment资源
getk8s(kubeconfig)
//修改k8s集群default命名空间deployment资源应用副本数或镜像版本
updatedeployment(kubeconfig)
//删除一个deployment
deletedeployments(kubeconfig)
//删除一个svc
deletesvc(kubeconfig)
time.Sleep(15 * time.Second)
//创建一个deployment
createdeployment(kubeconfig)
//创建一个svc
createsvc(kubeconfig)
}
3、调用client-go查询k8s集群资源
// 查询集群资源,namespace、pod、node、deployment
func getk8s(kubeconfig *string){
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())
}
fmt.Println("查询k8s版本:")
version, err := clientset.ServerVersion()
fmt.Println("version=", version)
fmt.Println("*******************************************************")
fmt.Println("查询k8s集群命名空间:")
list, _ := clientset.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})
for _, item := range list.Items {
fmt.Println(item.Name)
}
fmt.Println("*******************************************************")
fmt.Println("查询k8s集群节点资源:")
//fmt.Println("node list ")
nodeList1, _ := clientset.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{})
for _, item := range nodeList1.Items {
fmt.Println(item.Name)
}
fmt.Println("*******************************************************")
fmt.Println("查询k8s集群default命名空间pod资源:")
//fmt.Println("pod list in default")
list1, _ := clientset.CoreV1().Pods("default").List(context.Background(), metav1.ListOptions{})
for _, item := range list1.Items {
fmt.Println(item.Name)
}
fmt.Println("*******************************************************")
fmt.Println("查询k8s集群default命名空间deployment资源:")
//fmt.Println("deployment list in default")
deploymentList1, _ := clientset.AppsV1().Deployments("default").List(context.Background(), metav1.ListOptions{})
for _, item := range deploymentList1.Items {
fmt.Println(item.Name)
}
}
func int32Ptr(i int32) *int32 { return &i }
4、调用client-go修改k8s集群default命名空间deployment资源nginx-test副本数或镜像版本
// 修改deployment
func updatedeployment(kubeconfig *string) {
fmt.Println("*******************************************************")
fmt.Println("修改k8s集群default命名空间deployment资源nginx-test副本数或镜像版本:")
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
//尝试更新资源
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
//获取Get()返回的“result"
deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
result, getErr := deploymentsClient.Get(context.Background(), "nginx-test", metav1.GetOptions{})
if getErr != nil {
panic(fmt.Errorf("Failed to get latest version of Deployment: %v", getErr))
}
result.Spec.Replicas = int32Ptr(2) // change replica count
//result.Spec.Template.Spec.Containers[0].Image = "nginx:1.19.6" // change nginx version
_,updateErr := deploymentsClient.Update(context.Background(), result, metav1.UpdateOptions{})
return updateErr
})
if retryErr != nil {
panic(fmt.Errorf("Update failed: %v", retryErr))
}
fmt.Println("Updated deployment success.")
}
5、源码调用client-go删除一个deployment
// 删除一个deployment
func deletedeployments(kubeconfig *string){
fmt.Println("*******************************************************")
fmt.Println("删除k8s集群default命名空间deployment名为nginx-demo资源:")
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
deletePolicy := metav1.DeletePropagationForeground
if err := deploymentsClient.Delete(context.Background(), "nginx-demo", metav1.DeleteOptions{
PropagationPolicy: &deletePolicy,
}); err != nil {
//anic(err)
}
fmt.Println("Deleted deployment nginx-demo success. ")
}
5、调用client-go删除一个deployment
// 删除一个deployment
func deletedeployments(kubeconfig *string){
fmt.Println("*******************************************************")
fmt.Println("删除k8s集群default命名空间deployment名为nginx-demo资源:")
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
deletePolicy := metav1.DeletePropagationForeground
if err := deploymentsClient.Delete(context.Background(), "nginx-demo", metav1.DeleteOptions{
PropagationPolicy: &deletePolicy,
}); err != nil {
//anic(err)
}
fmt.Println("Deleted deployment nginx-demo success. ")
}
6、调用client-go删除一个Service
// 删除一个Service
func deletesvc(kubeconfig *string){
fmt.Println("*******************************************************")
fmt.Println("删除k8s集群default命名空间svc名为nginx-demo资源:")
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
svcClient := clientset.CoreV1().Services(apiv1.NamespaceDefault)
deletePolicy := metav1.DeletePropagationForeground
if err := svcClient.Delete(context.Background(), "nginx-demo", metav1.DeleteOptions{
PropagationPolicy: &deletePolicy,
}); err != nil {
//panic(err)
}
fmt.Println("Deleted svc nginx-demo success. \n")
}
7、调用client-go创建一个deployment
// 创建一个deployment
func createdeployment(kubeconfig *string) {
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
// Create Deployment
deployment := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: "nginx-test",
},
Spec: appsv1.DeploymentSpec{
Replicas: int32Ptr(1),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "nginx-test",
},
},
Template: apiv1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "nginx-test",
},
},
Spec: apiv1.PodSpec{
Containers: []apiv1.Container{
{
Name: "web",
Image: "nginx:1.19.6",
Ports: []apiv1.ContainerPort{
{
Name: "http",
Protocol: apiv1.ProtocolTCP,
ContainerPort: 80,
},
},
},
},
},
},
},
}
fmt.Println("Creating deployment...")
result, err := deploymentsClient.Create(context.Background(), deployment, metav1.CreateOptions{})
if err != nil {
//panic(err)
}
fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
}
8、调用client-go创建一个Service
// 创建一个Service
func createsvc(kubeconfig *string) {
config, _ := clientcmd.BuildConfigFromFlags("", *kubeconfig)
clientset, _ := kubernetes.NewForConfig(config)
namespace := "default"
var targetPort intstr.IntOrString
targetPort.IntVal = 80
service := &apiv1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: "nginx-test",
Labels: map[string]string{
"app": "nginx-test",
},
},
Spec: apiv1.ServiceSpec{
Selector: map[string]string{
"app": "nginx-test",
},
Type: "NodePort",
Ports: []apiv1.ServicePort{
{
Name: "http",
Port: 80,
NodePort: 30082,
TargetPort: targetPort,
Protocol: apiv1.ProtocolTCP,
},
},
},
}
fmt.Println("Creating svc...")
result, err := clientset.CoreV1().Services(namespace).Create(context.TODO(), service, metav1.CreateOptions{})
if err != nil {
//panic(err)
}
fmt.Printf("Created svc %q.\n", result.GetObjectMeta().GetName())
}