實作調用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())
}