Using kubeconfig
You can request Botkube to generate and pass kubeconfig file to your plugin by adding RBAC section
to your plugin configuration. The following example requests a kubeconfig that impersonates
user User.rbac.authorization.k8s.io read-only-user
. For more information refer to the
RBAC section. The example is for executor plugins, source plugins
can access kubeconfig in their Stream()
function in source.StreamInput
.
RBAC config for an example plugin:
executors:
"reader-team-a":
kube-reader:
enabled: true
context:
user:
type: Static
static:
value: read-only-user
The kubeconfig is available in executor.ExecuteInput
as a slice of bytes.
There are two options to instantiate a Kubernetes Go client with this config.
- From bytes
import (
"context"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/kubernetes"
"github.com/kubeshop/botkube/pkg/api/executor"
"github.com/kubeshop/botkube/pkg/pluginx"
)
func (ReaderExecutor) Execute(_ context.Context, in executor.ExecuteInput) (executor.ExecuteOutput, error) {
config, err := clientcmd.RESTConfigFromKubeConfig(in.Context.KubeConfig)
if err != nil {
return executor.ExecuteOutput{}, err
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return executor.ExecuteOutput{}, err
}
...
}
- From file
import (
"context"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/kubernetes"
"github.com/kubeshop/botkube/pkg/api/executor"
"github.com/kubeshop/botkube/pkg/pluginx"
)
func (ReaderExecutor) Execute(ctx context.Context, in executor.ExecuteInput) (executor.ExecuteOutput, error) {
kubeConfigPath, deleteFn, err := pluginx.PersistKubeConfig(ctx, in.Context.KubeConfig)
if err != nil {
return executor.ExecuteOutput{}, fmt.Errorf("while writing kubeconfig file: %w", err)
}
defer func() {
if deleteErr := deleteFn(ctx); deleteErr != nil {
fmt.Fprintf(os.Stderr, "failed to delete kubeconfig file %s: %v", kubeConfigPath, deleteErr)
}
}()
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
if err != nil {
return executor.ExecuteOutput{}, err
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return executor.ExecuteOutput{}, err
}
...
}