1. client-go 安装
$ go get k8s.io/client-go/…
$ go get -u k8s.io/apimachinery/…
2. 在 k8s 集群外操作资源
func main() {
// 配置 k8s 集群外 kubeconfig 配置文件
var kubeconfig *string
kubeconfig = flag.String("kubeconfig", "/Users/zhaojiahui/.kube/qz-ci.conf",
"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())
}
//连接成功,然后就可以随意操作资源了!
//如更新node标签,具体实现见下
coreV1 := clientset.CoreV1()
UpdateNodeLabels(coreV1,"19.177.16.24","level","red")
}
3. 在 k8s 集群内操作资源
func main() {
// 通过集群内部配置创建 k8s 配置信息,通过 KUBERNETES_SERVICE_HOST 和 KUBERNETES_SERVICE_PORT 环境变量方式获取
// 若集群使用 TLS 认证方式,则默认读取集群内部 tokenFile 和 CAFile
config, err := rest.InClusterConfig()
if err != nil {
log.Fatal(err)
}
// 根据指定的 config 创建一个新的 clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatal(err)
}
//连接成功,然后就可以随意操作资源了!
//如List所有node上的标签
nodes, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
for _, node := range nodes.Items {
log.Printf("Name: %s Labels: %s\n", node.ObjectMeta.Name,
node.Labels)
}
if err != nil {
log.Fatal(err)
}
}
4. Patch更新Node
//更新node标签
func UpdateNodeLabels(coreV1 v1.CoreV1Interface, nodeName string, labelKey string, labelNewValue string) {
ctx := context.TODO()
node, err := coreV1.Nodes().Get(ctx, nodeName, metav1.GetOptions{})
if err != nil {
log.Printf("[ModifyNodeLabels] modify node %v fail %v\n", nodeName, err)
}
labels := node.Labels
labels[labelKey] = labelNewValue
patchData := map[string]interface{}{"metadata": map[string]map[string]string{"labels": labels}}
playLoadBytes, _ := json.Marshal(patchData)
_, err = coreV1.Nodes().Patch(ctx, nodeName, types.StrategicMergePatchType, playLoadBytes, metav1.PatchOptions{})
if err != nil {
log.Printf("[ModifyNodeLabels] %v node Patch fail %v\n", nodeName, err)
log.Printf("error:%s", err)
}
log.Printf("modify node %s label %s to %s", nodeName, labelKey, labelNewValue)
}
//调用方法见上第二节