侧边栏壁纸
博主头像
汪洋

即使慢,驰而不息,纵会落后,纵会失败,但一定可以达到他所向的目标。 - 鲁迅

  • 累计撰写 191 篇文章
  • 累计创建 74 个标签
  • 累计收到 112 条评论

kubernetes - kubectl plugin 插件机制

汪洋
2024-02-19 / 0 评论 / 1 点赞 / 257 阅读 / 3,430 字

一、什么是 kubectl plugin 以及其有什么作用?

kubectl 插件是一种扩展 kubectl 命令行工具的方法,允许用户添加新的子命令或修改现有命令的行为。这些插件可以用于各种用途,包括提供额外的功能、简化常见任务、封装复杂操作等。

kubectl 插件通常以独立的可执行文件的形式存在,并通过 kubectl 命令进行调用。它们可以被放置在系统的 PATH 中,使得在命令行中可以直接调用。

以下是一些常见的 kubectl 插件用途:

  • 资源查看和管理:提供更方便的方式来查看和管理 Kubernetes 资源,例如 kubectl get, kubectl describe, kubectl edit 等。
  • 日志查看和管理:提供更方便的方式来查看 Pod 的日志,例如 kubectl logs 命令的增强版本。
  • 调试和故障排查:提供调试和故障排查工具,例如连接到运行中的容器进行调试、获取容器状态等。
  • 资源操作和批量任务:提供用于创建、更新、删除资源的命令,以及执行批量任务的命令。
  • 自定义资源类型:提供用于管理自定义资源类型的命令,例如 kubectl get crd, kubectl describe crd, kubectl create -f crd.yaml 等。
  • 集群状态和监控:提供查看集群状态和监控信息的命令,例如查看节点状态、查看集群事件等。

kubectl 插件可以使用各种编程语言编写,包括 Bash、Python、Go 等。开发插件的方法包括编写独立的可执行文件、编写脚本并添加到系统的 PATH 中、使用 Kubernetes 提供的插件机制等。

总的来说,kubectl 插件提供了一种简单而灵活的方式来扩展和定制 kubectl 命令行工具,以满足各种不同的使用场景和需求。

二、开发自己的 kubectl plugin

1、小试牛刀

# cat /usr/local/bin/kubectl-whoami
#!/bin/bash

# 执行 kubectl 命令获取当前用户信息
kubectl config view --minify -o jsonpath='{.users[0].name}' | xargs -I {} echo "Current user: {}"

注意:开发的 kubectl plugin 命名是有要求的,格式必须为 kubectl-xxxx,放置在 $PATH 路径中即可

# 查看 kubectl 是否捕获
$ kubectl plugin list
# 结果查看
[root@k8s-master01 ~]# kubectl whoami 
Current user: kubernetes-admin

2、基于 golang 的开发

a、安装 golang 环境

# 查看此 kubernetes 集群的 golang 版本
[root@k8s-master01 ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.1", GitCommit:"bc401b91f2782410b3fb3f9acf43a995c4de90d2", GitTreeState:"clean", BuildDate:"2024-01-17T15:49:02Z", **GoVersion:"go1.21.6"**, Compiler:"gc", Platform:"linux/amd64"}

# 下载对应版本的 golang 环境并配置
$ wget https://studygolang.com/dl/golang/go1.21.6.linux-amd64.tar.gz
$ echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
$ mkdir /go
$ cd /go && mkdir {src, pkg, bin}
$ cd /go/src
$ mkdir kubectl-showip
$ cd kubectl-showip

b、创建代码,编译安装

# vi main.go
package main

import (
    "fmt"
    "os"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "context"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func main() {
    kubeconfig := os.Getenv("HOME") + "/.kube/config"  // 使用当前用户的 kubeconfig 文件配置 Kubernetes 客户端
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        panic(err.Error())
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("Listing pods with their IPs:")
    for _, pod := range pods.Items {
        fmt.Printf("%s\t%s\t%s\n", pod.Status.PodIP, pod.Namespace, pod.Name)
    }
}
# 初始化项目文件
$ go mod init kubectl-whoami
# 设置国内 mod 代理
$ export GOPROXY=https://goproxy.cn,direct
# 下载所需库
$ go tidy
# 编译
$ go build .
# 拷贝执行文件至 PATH 变量
$ cp kubectl-showip /usr/local/bin

c、展示结果

[root@k8s-master01 ~]# kubectl showip
Listing pods with their IPs:
10.244.32.133 kube-system calico-kube-controllers-558d465845-q7m2c
192.168.10.13 kube-system calico-node-7dzjn
192.168.10.11 kube-system calico-node-cvjgs
192.168.10.12 kube-system calico-node-twljx
192.168.10.12 kube-system calico-typha-5b56944f9b-rmhtx
10.244.32.132 kube-system coredns-857d9ff4c9-dsw5w
10.244.32.131 kube-system coredns-857d9ff4c9-fvcqm
192.168.10.11 kube-system etcd-k8s-master01
192.168.10.11 kube-system kube-apiserver-k8s-master01
192.168.10.11 kube-system kube-controller-manager-k8s-master01
192.168.10.13 kube-system kube-proxy-6dq8p
192.168.10.11 kube-system kube-proxy-lfslc
192.168.10.12 kube-system kube-proxy-xtr4g
192.168.10.11 kube-system kube-scheduler-k8s-master01

所有代码已上传至 gitee:https://gitee.com/rocrunning/kubectl-plugin.git

0

评论区