go client [gin、k8s]

k8s client

K8s api文档:http://kubernetes.kansea.com/docs/api/

k8s client接口参考文章:使用client-go实现对K8S集群资源得CRUD操作及源码分析
【kubernetes/k8s API】k8s client go 接口
client-go开发k8s:列出所有pods并且判断是否存在

1.确保端口通
在这里插入图片描述
2.kube 配置文件获取
主要是kube config 配置,默认在工作目录~/.kube文件下,包括k8s apiserver地址,认证等配置。
在这里插入图片描述
参考文章:client-go开发k8s:列出所有pods并且判断是否存在

3.k8s client代码

package main
 
import (
	"flag"
	"fmt"
	"os"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"context"
)
 
func main() {
	// 配置 k8s 集群外 kubeconfig 配置文件,默认位置 $HOME/.kube/config
	var kubeconfig *string
	if home := homeDir(); home != "" {  
		kubeconfig = flag.String("kubeconfig", "kubelet.conf", "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()
	//在 kubeconfig 中使用当前上下文环境,config 获取支持 url 和 path 方式
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}
	// 根据指定的 config 创建一个新的 clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
 
	// 通过实现 clientset 的 CoreV1Interface 接口列表中的 PodsGetter 接口方法 Pods(namespace string) 返回 PodInterface
	// PodInterface 接口拥有操作 Pod 资源的方法,例如 Create、Update、Get、List 等方法
	// 注意:Pods() 方法中 namespace 不指定则获取 Cluster 所有 Pod 列表
	pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
	// 获取指定 namespace 中的 Pod 列表信息
	namespace := "uc-dev"
	pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(),metav1.ListOptions{})
	if err != nil {
		panic(err)
	}
	fmt.Printf("There are %d pods in namespaces %s\n", len(pods.Items), namespace)
	for _, pod := range pods.Items {
		fmt.Printf("Name: %s, Status: %s, CreateTime: %s\n", pod.ObjectMeta.Name, pod.Status.Phase, pod.ObjectMeta.CreationTimestamp)
	}
	//获取指定 namespaces 和 podName 的详细信息,使用 error handle 方式处理错误信息
	namespace = "uc-dev"
	podName := "datashare-log-56b5b65d74-mpm48"
	pod, err := clientset.CoreV1().Pods(namespace).Get(context.TODO(),podName,metav1.GetOptions{})
	if err != nil {
		fmt.Printf("Error getting pod %s in namespace %s: %v\n",
			podName, namespace, err)
	}else{
		fmt.Printf("\nFound pod %s in namespace %s\n", podName, namespace)
		fmt.Printf("%v",pod)
		maps := map[string]interface{}{
			"Name":        pod.ObjectMeta.Name,
			"Namespaces":  pod.ObjectMeta.Namespace,
			"NodeName":    pod.Spec.NodeName,
			"Annotations": pod.ObjectMeta.Annotations,
			"Labels":      pod.ObjectMeta.Labels,
			"SelfLink":    pod.ObjectMeta.SelfLink,
			"Uid":         pod.ObjectMeta.UID,
			"Status":      pod.Status.Phase,
			"IP":          pod.Status.PodIP,
			"Image":       pod.Spec.Containers[0].Image,
		}
		prettyPrint(maps)
	}
 
	// time.Sleep(10 * time.Second)
 
}
 
func prettyPrint(maps map[string]interface{}) {
	lens := 0
	for k, _ := range maps {
		if lens <= len(k) {
			lens = len(k)
		}
	}
	for key, values := range maps {
		spaces := lens - len(key)
		v := ""
		for i := 0; i < spaces; i++ {
			v += " "
		}
		fmt.Printf("%s: %s%v\n", key, v, values)
	}
}
 
func homeDir() string {
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	return os.Getenv("USERPROFILE") // windows
}

报错:The connection to the server localhost:8080 was refused - did you specify the right host or port?
参考文章:Kubernetes-kubectl命令出现错误
【The connection to the server localhost:8080 was refused - did you specify the right host or port?】

*go mod 设置
在这里插入图片描述

go CS 客户端 服务端

gin: “github.com/gin-gonic/gin”
cilent端post,get请求
post请求

$.post("/appconfig",
{
   provisionType:prokind_1,
   proSubVersion1:prosubversion1,
   proSubVersion2:prosubversion2,
},
function(data,status){
   console.log(data)
   alert("数据:" + data + "\n状态:" + status);
});

get请求

$.get("/devopsdw",   
function(data,status){
    console.log(data)
    alert("数据:" + data + "\n状态:" + status);
});

server端

func Appconfig(c *gin.Context) {
	password := c.PostForm("password") 
	hosts := c.PostForm("hosts") 
	user := "root"
	fmt.Println(user,password,hosts)
}

func main() {
	gin.SetMode(gin.ReleaseMode)
	r := gin.Default() // 默认路由引擎

	//1.服务配置解析
	r.POST("/appconfig",Appconfig)
	//2.安装包下载
	r.POST("/devopsdw",Appconfig)

	r.LoadHTMLGlob("templates/**/*")
	r.GET("/posts/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "posts/prodep.html", gin.H{
			"title": "yyy",
		})
	})

	r.GET("/prodep", func(c *gin.Context) {
		c.HTML(http.StatusOK, "pro/prodep.html", gin.H{  
			"title": "pro/prodep",
		})
	})

	r.Run(":8080") // 监听并在 0.0.0.0:8080 上启动服务
}

main.go

package main
import (
 "fmt"
 "html/template"
 "log"
 "net/http"
 "strings"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
	r.ParseForm() //解析 url 传递的参数,对于 POST 则解析响应包的主体(request body)
	//注意:如果没有调用 ParseForm 方法,下面无法获取表单的数据
	fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
	fmt.Println("path", r.URL.Path)
	fmt.Println("scheme", r.URL.Scheme)
	fmt.Println(r.Form["url_long"])
	for k, v := range r.Form {
		fmt.Println("key:", k)
		fmt.Println("val:", strings.Join(v, ""))
	}
	fmt.Fprintf(w, "Hello astaxie!") //这个写入到 w 的是输出到客户端的 
}
func login(w http.ResponseWriter, r *http.Request) {
	fmt.Println("method:", r.Method) //获取请求的方法
	if r.Method == "GET" {
	t, _ := template.ParseFiles("login.html")
	t.Execute(w, nil)
	} else {
	//请求的是登陆数据,那么执行登陆的逻辑判断
	r.ParseForm()
	fmt.Println("username:", r.Form["username"])
	fmt.Println("password:", r.Form["password"])
	fmt.Println("password:", r)
	} 
}
func main() {
	http.HandleFunc("/", sayhelloName) //设置访问的路由
	http.HandleFunc("/login", login) //设置访问的路由
	err := http.ListenAndServe(":9090", nil) //设置监听的端口
	if err != nil {
	log.Fatal("ListenAndServe: ", err)
	} 

login.html

<html>
<head>
<title></title>
</head>
<body>
<form action="http://127.0.0.1:9090/login" method="post">
 用户名:<input type="text" name="username">
 密码:<input type="password" name="password">
 <input type="submit" value="登陆">
</form>
</body>
</html>

在这里插入图片描述
参考文章:利用golang的template模板包进行web开发
前端可以参考:前端 html 基础 jQuery

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐