go client [gin、k8s]
main.gopackage mainimport ("fmt""html/template""log""net/http""strings")func sayhelloName(w http.ResponseWriter, r *http.Request) {r.ParseForm() //解析 url 传递的参数,对于 POST 则解析响应包的主体(request body)//注意:如果没有
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
更多推荐
所有评论(0)