package main
import (
"context"
"encoding/json"
"flag"
"fmt"
appsv1 "k8s.io/api/apps/v1"
coreV1 "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/homedir"
"path/filepath"
)
var clientset *kubernetes.Clientset = GetClientSet()
func GetClientSet() *kubernetes.Clientset {
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()
// TODO kubeconfig 需要从远程控制中拉取集群的.kube/config文件
//config, err := rest.InClusterConfig()
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// 创建 clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
return clientset
}
func main() {
//clientset := GetClientSet()
//CreateDeployment()
//CreateService()
//k8s.Handler()
}
func QueryNodePods() {
listOptions := metav1.ListOptions{
FieldSelector: "status.phase=Running,spec.nodeName=ais-master1",
//FieldSelector: "status.phase=Running", spec.nodeName=ais-master1
}
podList, err := clientset.CoreV1().Pods("").List(context.TODO(), listOptions)
if err != nil {
panic(err)
}
/*for _, pod := range podList.Items {
fmt.Println(pod.Name)
}*/
fmt.Println(len(podList.Items))
}
func QueryNodeLabel() {
//clientset.CoreV1().Nodes().Get(context.TODO(), "", metav1.GetOptions{})
//value := "16127"
/*labelSelector := metav1.LabelSelector{MatchLabels: map[string]string{"accelerator-memory":"16127"}}
listOptions := metav1.ListOptions{
LabelSelector: labels.Set(labelSelector.MatchLabels).String(),
Limit: 100,
}*/
listOptions := metav1.ListOptions{
LabelSelector: "accelerator-memory=16127",
}
nodeList, err := clientset.CoreV1().Nodes().List(context.TODO() ,listOptions)
if err != nil {
panic(err)
}
for _, node := range nodeList.Items {
fmt.Printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t,\n",
node.Name,
node.Status.Phase,
node.Status.Addresses,
node.Status.NodeInfo.OSImage,
node.Status.NodeInfo.KubeletVersion,
node.Status.NodeInfo.OperatingSystem,
node.Status.NodeInfo.Architecture,
)
}
}
func QueryNodeName() {
//获取node根据name
nodeName := "ais-master1"
node, err := clientset.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
if err != nil {
panic(err)
}
fmt.Printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t,\n",
node.Name,
node.Status.Phase,
node.Status.Addresses,
node.Status.NodeInfo.OSImage,
node.Status.NodeInfo.KubeletVersion,
node.Status.NodeInfo.OperatingSystem,
node.Status.NodeInfo.Architecture,
)
}
func QueryNodes() {
//获取node
fmt.Println("####### 获取node ######")
nodeList, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err)
}
for _, node := range nodeList.Items {
fmt.Printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t,\n",
node.Name,
node.Status.Phase,
node.Status.Addresses,
node.Status.NodeInfo.OSImage,
node.Status.NodeInfo.KubeletVersion,
node.Status.NodeInfo.OperatingSystem,
node.Status.NodeInfo.Architecture,
)
}
}
func int32Ptr(i int32) *int32 { return &i }
func CreateDeployment(){
namespace := "nzxy"
deploymentsClient := clientset.AppsV1().Deployments(namespace)
var r coreV1.ResourceRequirements
//r = new(*apiv1.ResourceRequirements)
//资源分配会遇到无法设置值的问题,故采用json反解析
j := `{"limits": {"cpu":"1000m", "memory": "1Gi"}, "requests": {"cpu":"1000m", "memory": "1Gi"}}`
json.Unmarshal([]byte(j), &r)
//var configMap *coreV1.ConfigMapVolumeSource
//configMap.Name = "configcm" //这样有错
deployment := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: "aialert-deployment",
},
Spec: appsv1.DeploymentSpec{
Replicas: int32Ptr(1),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"env": "dev",
},
},
Template: coreV1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"env": "dev",
},
},
Spec: coreV1.PodSpec{
Containers: []coreV1.Container{
{
Name: "aialert",
Image: "ai_alert_linux:v2.0",
Command: []string{"/bin/sh","-c","./aialertzxyv1"},
Resources: r,
Ports: []coreV1.ContainerPort{
{
Name: "http",
Protocol: coreV1.ProtocolTCP,
ContainerPort: 9090,
HostPort: 9090,
},
},
VolumeMounts: []coreV1.VolumeMount{
{
Name: "configmap-volume",
MountPath: "/ai_alert/src/config",
},
},
},
},
Volumes: []coreV1.Volume{
{
Name: "configmap-volume",
VolumeSource: coreV1.VolumeSource{
ConfigMap: &coreV1.ConfigMapVolumeSource{
LocalObjectReference: coreV1.LocalObjectReference{
Name: "configcm",
},
},
},
},
},
},
},
},
}
// Create Deployment
fmt.Println("Creating deployment...")
result, err := deploymentsClient.Create(context.TODO(), deployment, metav1.CreateOptions{})
if err != nil {
panic(err)
}
fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
}
func CreateService(){
namespace := "nzxy"
service := &coreV1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: "aialert-service",
Labels: map[string]string{
"env": "dev",
},
},
Spec: coreV1.ServiceSpec{
Selector: map[string]string{
"env": "dev",
},
Type: "NodePort",
Ports: []coreV1.ServicePort{
{
Name: "http",
Port: 30111,
TargetPort: intstr.IntOrString{
IntVal: *int32Ptr(9090),
},
NodePort: 9090,
Protocol: coreV1.ProtocolTCP,
},
},
},
}
serviceList, err := clientset.CoreV1().Services(namespace).Create(context.TODO(), service, metav1.CreateOptions{})
fmt.Println(err, serviceList)
}
module rbacDemo
go 1.16
require (
k8s.io/api v0.20.5
k8s.io/apimachinery v0.20.5
k8s.io/client-go v12.0.0+incompatible
)
replace k8s.io/client-go => k8s.io/client-go v0.20.5