关注微信公众号《云原生CTO》更多云原生干货等你来探索
专注于 云原生技术
分享
提供优质 云原生开发
视频技术培训
面试技巧
,及技术疑难问题 解答

云原生技术分享不仅仅局限于Go
、Rust
、Python
、Istio
、containerd
、CoreDNS
、Envoy
、etcd
、Fluentd
、Harbor
、Helm
、Jaeger
、Kubernetes
、Open Policy Agent
、Prometheus
、Rook
、TiKV
、TUF
、Vitess
、Argo
、Buildpacks
、CloudEvents
、CNI
、Contour
、Cortex
、CRI-O
、Falco
、Flux
、gRPC
、KubeEdge
、Linkerd
、NATS
、Notary
、OpenTracing
、Operator Framework
、SPIFFE
、SPIRE
和 Thanos
等


使用 Kubebuilder 构建 Kubernetes 控制器以供应 PVC
控制器跟踪至少一种 Kubernetes
资源类型。这些对象有一个表示所需状态的 spec
字段。该资源的控制器负责使当前状态更接近所需状态。
如果您想了解有关 Kubernetes
控制器的更多详细信息,请查看此链接:
[ https://kubernetes.io/docs/concepts/architecture/controller/ ]
演示
在本示例中,我们要创建一个控制器
控制器流程图
先决条件
Kubebuilder v3.1.0 kubectl v1.21.2 Go v1.16.7 一个k8s节点启动并运行
创建项目和 API
创建一个目录,然后在其中运行 init
命令以初始化一个新项目。
mkdir pod-pvc
cd pod-pvc
go mod init pod-pvc
kubebuilder init --domain example.com
运行以下命令以创建一个新的 API
(组/版本)batch/v1
及其上的新种类(CRD
)PvcCon
:
kubebuilder create api --group batch--version v1 --kind PvcCon
实现控制器逻辑
现在要实现控制器逻辑,请转到文件controllers/pvccon_controller.go
,然后在“Reconcile
”功能中添加控制器逻辑,如下所示:
首先,获取所有 pod
的列表:
podList := &v1.PodList{}
if err := r.Client.List(context.TODO(), podList, client.InNamespace(req.Namespace)); err != nil {
log.Error(err, "unable to fetch Pod")
return ctrl.Result{}, err
}
现在获取所有处于挂起状态的pod
:
var pendingPods []*v1.Pod
for i, pod := range podList.Items {
if pod.Status.Phase == "Pending" {
pendingPods = append(pendingPods, &podList.Items[i])
}
}
为每个 pod
配置 PVC
:
for _, pod := range pendingPods {
pvc := &v1.PersistentVolumeClaim{}
r.Get(ctx, req.NamespacedName, pvc)
pvc = &v1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: pod.Spec.Volumes[0].PersistentVolumeClaim.ClaimName,
Namespace: req.Namespace,
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("1Gi"),
},
},
},
}
log.Info("Creating PVC ", "Name: ", pod.Spec.Volumes[0].PersistentVolumeClaim.ClaimName)
r.Create(ctx, pvc)
}
控制器将在本地运行。在此阶段,如果您创建任何需要任何 PVC
的 Pod
或部署,则控制器将为每个 Pod
提供具有默认大小的 PVC
。
在集群上运行
要在任何远程机器上运行控制器,我们需要创建docker
并部署它。
make docker-build docker-push IMG=<some-registry>/<project-name>:tag
make deploy IMG=<some-registry>/<project-name>:tag
你可以在 Github
上的文章中获取代码和测试文件。
[ https://github.com/acumino/kubernetes-controller ]
5.3 参考资料
参考[1]
参考[2]
参考[3]
参考资料
参考: https://book.kubebuilder.io
[2]参考: https://kubernetes.io/docs/concepts/architecture/controller/
[3]参考: https://sonu-singh.medium.com/build-kubernetes-controller-to-provision-pvc-using-kubebuilder-feb04d114a4a




