Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes Operator for vSphere VM

masanara
September 18, 2019

Kubernetes Operator for vSphere VM

KubernetesからvSphereのVMを作成してみる

masanara

September 18, 2019
Tweet

More Decks by masanara

Other Decks in Technology

Transcript

  1. 今日のお話 KubernetesのOperatorを利用して、Kubernetes APIからvSphere上に仮想マシンを作 ります。 紹介するOperatorはPoC向けでありプロダクション向けのものではありません。 VMworld 2019 Session: Kubernetes Operators

    for VMware Enterprise PKS and VMware Cloud PKS [CODE1360U] の内容をベースにしています。 • Streaming : https://videos.vmworld.com/global/2019/videoplayer/27913 • Presentation : https://cms.vmworldonline.com/event_data/12/session_notes/CODE1360U.pdf • Github : https://github.com/embano1/kopf-operator-vmworld
  2. Master3 Master2 Node Node Master1 Node Client (kubectl) API Server

    Cluster State Store (etcd) kubelet Container Runtime Pod (Container) Controller Manager Controllers Scheduler Kubernetesのアーキテクチャ
  3. KubernetesのReconciliation Loop Observe Analyze Act 期待する状態を現在 の状態を比較 状態の差異を 埋める API

    Serverへ 現在の状態を 問い合わせる • Deployment • ReplicaSet • StatefulSet • ...etc
  4. Operatorとは Operatorは”Custom Resource Defnition”と”Custom Controller”の組み合わせ。 ステートフルなアプリケーション等に対する運用のナレッジをコード化し、Kubernetes API上でアプリケーションライフサイクルの管理を実現する。 Operator CRD (Custom

    Resource Definition) Controller (Custom Controller) + = • Custom Resource Definition : KubernetesのAPI上に任意のリソースを追加する • Custom Controller : CRDによって定義されたカスタムリソースのライフサイクルを管理する https://coreos.com/blog/introducing-operators.html Introducing Operators: Putting Operational Knowledge into Software 2016/11/3 Brandon Philips
  5. Operatorの例 • MySQL • Elasticsearch • Kafka • Istio •

    Sysdig Agent • Velero • Amazon RDS • etc... https://operatorhub.io/
  6. Master3 Master2 Node Node Master1 Node Client (kubectl) API Server

    Cluster State Store (etcd) kubelet Container Runtime Pod (Container) Controller Manager Controllers Scheduler vSphereへの対応 Custom Controller CRD
  7. VmGroup(vg)をCRDとして定義する。 Custom Resource Definition(CRD) apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name:

    vmgroups.vsphere.vmware.com spec: scope: Namespaced group: vsphere.vmware.com versions: - name: v1alpha1 served: true storage: true names: kind: VmGroup plural: vmgroups singular: vmgroup shortNames: - vg additionalPrinterColumns: - name: Template type: string priority: 0 JSONPath: .spec.template description: Template this VM group is based on - name: Desired type: integer priority: 0 JSONPath: .spec.replicas description: The number of configured replicas in this VM group - name: Available type: string priority: 0 JSONPath: .status.vm_operator.currentReplicas description: The number of available replicas in this VM group - name: Phase type: string priority: 0 JSONPath: .status.vm_operator.phase description: Deployment status of this VM group
  8. Controllerの作成 - Operator Frameworkの利用 • kopf : Kubernetes Operator Pythonic

    Framework ◦ https://github.com/zalando-incubator/kopf ◦ Kubernetes APIの詳細を知らなくても Reconsilication Logicが実装可能 ◦ Supported Language : Python • その他のFramework ◦ Operator Framework - https://github.com/operator-framework ▪ Supported Languanges : Golang (HelmチャートやAnsible Playbookの再利用が可能) ◦ Kubebuilder - https://github.com/kubernetes-sigs/kubebuilder ▪ Supported Languages: Golang ◦ Google Metacontroller - https://metacontroller.app ▪ Supported Languages: Python, JavaScript,
  9. Kopfを使って、Kubernetes API上でVmGroup(vg)をCRDのライフサイクルを管理する ためのコントローラーを作成する。 Custom Controller import kopf from pyVim.connect import

    Disconnect from pyVmomi import vim @kopf.on.event('vsphere.vmware.com', 'v1alpha1', 'vmgroups') def vm_operator(event, spec, meta, status, logger, **_): sleep(3) if event_type == "DELETED": delete_vm_group(vmgroup, logger) return try: phase = status['vm_operator']['phase'] except KeyError: phase = "PENDING" if phase == "PENDING": exists = vm_group_exists(vmgroup) ... https://github.com/embano1/kopf-operator-vmworld/blob/master/controller.py ... def create_vm_group (vmgroup_name: str, vmgroup_spec: Dict[str, str], logger: logging.Logger) -> int: try: vsphere.create_folder(dc, vmgroup_name) except vsphere.ObjectAlreadyExists as e: logger.warn(str(e)) return try: created = vsphere.clone_vm(content, dc, CLUSTER, DATASTORE, vmgroup_name, vmgroup_spec, logger) except vsphere.CloneError as e: logger.warn(str(e)) return -1 return created Reconciliation Loopの実装
  10. Custom Resourceの作成 CRDとして作成した VmGroup リソースを作成する。 apiVersion: vsphere.vmware.com/v1alpha1 kind: VmGroup metadata:

    name: kopf-example labels: vmdevops: "0918" spec: cpu: 1 memory: 1 template: kopf-vm-template replicas: 3 # kubectl apply -f demo.yaml vmgroup.vsphere.vmware.com/kopf-example created # kubectl get vmgroup NAME TEMPLATE DESIRED AVAILABLE PHASE kopf-example kopf-vm-template 3 3 READY