Slide 1

Slide 1 text

Custom Kubernetes Controllers at Mercari Yuki Ito (@mrno110) Kubernetes Casual Talk

Slide 2

Slide 2 text

Merpay / Mercoin Architect Mercari Microservices Platform CI/CD Yuki Ito @mrno110

Slide 3

Slide 3 text

Agenda ɾCustom Kubernetes Controllers ɾCode Generation

Slide 4

Slide 4 text

Agenda ɾCustom Kubernetes Controllers ɾCode Generation

Slide 5

Slide 5 text

spanner-autoscaler Autoscaler for the Google Cloud Spanner Instances

Slide 6

Slide 6 text

spanner-autoscaler apiVersion: spanner.mercari.com/v1alpha1 kind: SpannerAutoscaler metadata: name: spannerautoscaler-sample namespace: your-namespace spec: scaleTargetRef: projectId: your-gcp-project-id instanceId: your-spanner-instance-id minNodes: 1 maxNodes: 4 maxScaleDownNodes: 1 targetCPUUtilization: highPriority: 60 Autoscaler for the Google Cloud Spanner Instances

Slide 7

Slide 7 text

spanner-autoscaler Google Cloud Day 2020 https://cloudonair.withgoogle.com/events/google-cloud-day-digital?talk=d3-da07

Slide 8

Slide 8 text

Bootes Bootes Namespace: a Namespace: b app: foo app: bar app: foo app: bar app: foo app: bar Namespace: c xDS Control Plane Kubernetes Controller

Slide 9

Slide 9 text

Bootes xDS Control Plane Kubernetes Controller apiVersion: bootes.io/v1 kind: Cluster metadata: name: example-cluster namespace: foo spec: config: name: example-cluster connect_timeout: 1s type: EDS lb_policy: ROUND_ROBIN http2_protocol_options: {} eds_cluster_config: eds_config: ads: {}

Slide 10

Slide 10 text

Bootes Envoy Meetup Tokyo #2 https://envoytokyo.connpass.com/event/175256/

Slide 11

Slide 11 text

Pull Request Replication Controller

Slide 12

Slide 12 text

Service Routing Controller

Slide 13

Slide 13 text

Service Routing Controller Merpay Tech Fest 2021 https://events.merpay.com/techfest-2021/

Slide 14

Slide 14 text

Agenda ɾCustom Kubernetes Controllers ɾCode Generation

Slide 15

Slide 15 text

Agenda ɾCustom Kubernetes Controllers ɾCode Generation

Slide 16

Slide 16 text

De fi ne CRDs as Protocol Buffers message Repository { string owner = 1; string repository = 2; } type Repository struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Owner string `protobuf:...` Repository string `protobuf:...` } Protocol Buffers func (in *Repository) DeepCopyInto(out *Repository) { p := proto.Clone(in).(*Repository) *out = *p } func (in *Repository) DeepCopy() *Repository { if in == nil { return nil } out := new(Repository) in.DeepCopyInto(out) return out } protoc-gen-go protoc-gen-deepcopy

Slide 17

Slide 17 text

istio / tools / protoc-gen-deepcopy https://github.com/istio/tools/tree/master/cmd/protoc-gen-deepcopy

Slide 18

Slide 18 text

Generic protoc-gen-deepcopy https://github.com/protobuf-tools/protoc-gen-deepcopy

Slide 19

Slide 19 text

De fi ne CRDs as Protocol Buffers type Repository struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Owner string `protobuf:...` Repository string `protobuf:...` } Protocol Buffers protoc-gen-go type Repository struct { v1.TypeMeta v1.ObjectMeta // Proto Buffer Struct Spec apisv1alpha1.Repository } kubetype-gen

Slide 20

Slide 20 text

istio / tools / kubetype-gen https://github.com/istio/tools/tree/master/cmd/kubetype-gen

Slide 21

Slide 21 text

Generic kubetype-gen https://github.com/110y/kubetype-gen

Slide 22

Slide 22 text

De fi ne CRDs as Protocol Buffers Protocol Buffers protoc-gen-go / protoc-gen-deepcopy Protocol Buffer Go Struct (+ DeepCopy) Kubernetes Go Types Custom Resource De fi nitions (YAML) kubetype-gen controller-gen

Slide 23

Slide 23 text

De fi ne CRDs as Protocol Buffers Protocol Buffers Advanced Custom Resource De fi nitions (YAML) istio /tools / cue-gen