Kubebuilder

kubebuilder install

go安装

1
参照网站:[<https://golang.org/>](<https://golang.org/>)

docker安装

1
2
3
参照网站:[<https://docs.docker.com/engine/install/>](<https://docs.docker.com/engine/install/>)

bug fix参见docker:[<https://www.notion.so/docker-70e41d6ca1bd4b2b966c9d247ce628a4>](<https://www.notion.so/docker-70e41d6ca1bd4b2b966c9d247ce628a4>)

SIG CLI 安装

1
参照网站:[<https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/>](<https://kubectl.docs.kubernetes.io/installation/>)

​ kind 安装:

1
2
3
curl -Lo ./kind <https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64>
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

​ kustome 安装:

1
GOBIN=$(pwd)/ GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3

kubebuilder安装

1
2
3
4
5
6
7
8
9
10
11
12
os=$(go env GOOS)
arch=$(go env GOARCH)

# 下载 kubebuilder 并解压到 tmp 目录中
curl -L <https://go.kubebuilder.io/dl/2.3.1/${os}/${arch}> | tar -xz -C /tmp/

# 将 kubebuilder 移动到一个长期的路径,并将其加入环境变量 path 中
# (如果你把 kubebuilder 放在别的地方,你需要额外设置 KUBEBUILDER_ASSETS 环境变量)

sudo mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/kubebuilder
export PATH=$PATH:/usr/local/kubebuilder/bin
# 或者添加到/etc/profile

First Program

https://cloudnative.to/kubebuilder/quick-start.html

development a demo

go安装

1
参照网站:[<https://golang.org/>](<https://golang.org/>)

docker安装

1
2
3
参照网站:[<https://docs.docker.com/engine/install/>](<https://docs.docker.com/engine/install/>)

bug fix参见docker:[<https://www.notion.so/docker-70e41d6ca1bd4b2b966c9d247ce628a4>](<https://www.notion.so/docker-70e41d6ca1bd4b2b966c9d247ce628a4>)

SIG CLI 安装

1
参照网站:[<https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/>](<https://kubectl.docs.kubernetes.io/installation/>)

​ kind 安装:

1
2
3
curl -Lo ./kind <https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64>
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

​ kustome 安装:

1
GOBIN=$(pwd)/ GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3

kubebuilder安装

1
2
3
4
5
6
7
8
9
10
11
12
os=$(go env GOOS)
arch=$(go env GOARCH)

# 下载 kubebuilder 并解压到 tmp 目录中
curl -L <https://go.kubebuilder.io/dl/2.3.1/${os}/${arch}> | tar -xz -C /tmp/

# 将 kubebuilder 移动到一个长期的路径,并将其加入环境变量 path 中
# (如果你把 kubebuilder 放在别的地方,你需要额外设置 KUBEBUILDER_ASSETS 环境变量)

sudo mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/kubebuilder
export PATH=$PATH:/usr/local/kubebuilder/bin
# 或者添加到/etc/profile

Demo 实现

kind 搭建多节点集群

1
2
3
4
5
6
7
8
9
# cluster with 1 control-plane nodes and 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
kind create cluster --config kind-1-3.yaml

​ 创建好一个单控制节点,多计算节点集群

创建kubebuilder项目

1
2
kubebuilder init --domain demo.org
kubebuilder create api --group system --version v1 --kind Sysctl

​ 修改基本的逻辑,我们希望调用api的时候,检测spec数据结构的值,根据值做出相应的系统调用实现,现在做sysctl的系统调用,并且我们把它给打印到日志里边儿。

  • 数据结构
1
2
// SysctlCall 检查值进行系统调用
SysctlCall string `json:"sysctl_call,omitempty"`
  • Reconcile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
func (r *SysctlReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
l := log.FromContext(ctx)
l.V(0).Info("demo start")
var sysctlCall systemv1.Sysctl
if err := r.Get(ctx, req.NamespacedName, &sysctlCall); err != nil {
l.Error(err, "unable to fetch sysctlCall")
return ctrl.Result{}, client.IgnoreNotFound(err)
}

l.V(0).Info("r.Get returns value", "sysctlCall", sysctlCall)
if strings.EqualFold(sysctlCall.Spec.SysctlCall, "Y") {
var whoami []byte
var cmd *exec.Cmd
var err error

cmd = exec.Command("whoami")
if whoami, err = cmd.Output(); err != nil {
fmt.Println(err)
os.Exit(1)
}
l.V(0).Info("sysctl called", "bash/whoami", string(whoami))
} else {
l.V(0).Info("sysctl not called")
}
l.V(0).Info("demo end")
// your logic here
return ctrl.Result{}, nil
}
  • system_v1_sysctl.yaml
1
2
3
4
5
6
7
apiVersion: system.demo.org/v1
kind: Sysctl
metadata:
name: sysctl-sample
spec:
# Add fields here
sysctl_call: Y

运行结果

  • 窗口一
1
2
3
make
make install
make run
  • 窗口二
1
kubectl apply -f config/samples/system_v1_sysctl.yaml
  • 结果

实现结果


Kubebuilder
https://www.bencorn.com/2022/01/22/Kubebuilder/
作者
Bencorn
发布于
2022年1月22日
许可协议