暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 Kubebuilder 构建 Kubernetes 控制器以供应 PVC

云原生CTO 2021-11-11
1232

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]

参考资料

[1]

参考: 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


文章转载自云原生CTO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论