際際滷

際際滷Share a Scribd company logo
Kubernetes Operator
for vSphere VM
悪顎恢艶姻稼艶岳艶壊から厩皆沿鞄艶姻艶の閣珂を恬撹してみる
VMware DevOps Meetup #3
書晩のお
KubernetesのOperatorを旋喘して、Kubernetes APIからvSphere貧に∀襯泪轡鵑鰈
ります。
B初する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
Master3
Master2
Node
Node
Master1 Node
Client
(kubectl)
API Server
Cluster State Store
(etcd)
kubelet
Container
Runtime
Pod
(Container)
Controller Manager
Controllers
Scheduler
Kubernetesのア`キテクチャ
KubernetesのReconciliation Loop
Observe
Analyze
Act
豚棋する彜BをF壓
の彜Bを曳^
彜Bの餓を
托める
API Serverへ
F壓の彜Bを
い栽わせる
¢ Deployment
¢ ReplicaSet
¢ StatefulSet
¢ ...etc
Operatorとは
Operatorは ̄Custom Resource Defnition ̄と ̄Custom Controller ̄のMみ栽わせ。
ステ`トフルなアプリケ`ション吉にする\喘のナレッジをコ`ド晒し、Kubernetes
API貧でアプリケ`ションライフサイクルの砿尖をgFする。
Operator CRD
(Custom Resource Definition)
Controller
(Custom Controller)

¢ Custom Resource Definition : KubernetesのAPI貧に販吭のリソ`スを弖紗する
¢ Custom Controller : CRDによって協xされたカスタムリソ`スのライフサイクルを砿尖する
https://coreos.com/blog/introducing-operators.html
Introducing Operators: Putting Operational Knowledge into Software
2016/11/3 Brandon Philips
Operatorの箭
¢ MySQL
¢ Elasticsearch
¢ Kafka
¢ Istio
¢ Sysdig Agent
¢ Velero
¢ Amazon RDS
¢ etc...
https://operatorhub.io/
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
VmGroup(vg)をCRDとして協xする。
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
Controllerの恬撹 - Operator Frameworkの旋喘
¢ kopf : Kubernetes Operator Pythonic Framework
$ https://github.com/zalando-incubator/kopf
$ Kubernetes APIのを岑らなくても Reconsilication Logicがg廾辛嬬
$ 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,
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のg廾
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
デモ
Project Pacific ここ
Project Pacific C Technical Overview : https://blogs.vmware.com/vsphere/2019/08/project-pacific-technical-overview.html

More Related Content

Kubernetes Operator for vSphere VM

  • 1. Kubernetes Operator for vSphere VM 悪顎恢艶姻稼艶岳艶壊から厩皆沿鞄艶姻艶の閣珂を恬撹してみる VMware DevOps Meetup #3
  • 2. 書晩のお KubernetesのOperatorを旋喘して、Kubernetes APIからvSphere貧に∀襯泪轡鵑鰈 ります。 B初する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
  • 3. Master3 Master2 Node Node Master1 Node Client (kubectl) API Server Cluster State Store (etcd) kubelet Container Runtime Pod (Container) Controller Manager Controllers Scheduler Kubernetesのア`キテクチャ
  • 5. Operatorとは Operatorは ̄Custom Resource Defnition ̄と ̄Custom Controller ̄のMみ栽わせ。 ステ`トフルなアプリケ`ション吉にする\喘のナレッジをコ`ド晒し、Kubernetes API貧でアプリケ`ションライフサイクルの砿尖をgFする。 Operator CRD (Custom Resource Definition) Controller (Custom Controller) ¢ Custom Resource Definition : KubernetesのAPI貧に販吭のリソ`スを弖紗する ¢ Custom Controller : CRDによって協xされたカスタムリソ`スのライフサイクルを砿尖する https://coreos.com/blog/introducing-operators.html Introducing Operators: Putting Operational Knowledge into Software 2016/11/3 Brandon Philips
  • 6. Operatorの箭 ¢ MySQL ¢ Elasticsearch ¢ Kafka ¢ Istio ¢ Sysdig Agent ¢ Velero ¢ Amazon RDS ¢ etc... https://operatorhub.io/
  • 7. 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
  • 8. VmGroup(vg)をCRDとして協xする。 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
  • 9. Controllerの恬撹 - Operator Frameworkの旋喘 ¢ kopf : Kubernetes Operator Pythonic Framework $ https://github.com/zalando-incubator/kopf $ Kubernetes APIのを岑らなくても Reconsilication Logicがg廾辛嬬 $ 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,
  • 10. 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のg廾
  • 11. 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
  • 13. Project Pacific ここ Project Pacific C Technical Overview : https://blogs.vmware.com/vsphere/2019/08/project-pacific-technical-overview.html