一、什么是 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
评论区