前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Metacontroller介绍及使用

Metacontroller介绍及使用

作者头像
有点技术
发布2020-07-14 16:43:19
1.2K0
发布2020-07-14 16:43:19
举报
文章被收录于专栏:有点技术有点技术

简介

Metacontroller是GKE为k8s开发的一个附加组件,用简单的脚本便可以方便的管理自定义控制器。

概念

  • CRD 自定义资源
  • Metacontroller Metacontroller控制器本身
  • DecoratorController Metacontroller中用于向现有资源添加新行为
  • CompositeController Metacontroller中用于通过父对象管理子对象

安装

代码语言:javascript
复制
# 创建命名空间
kubectl create namespace metacontroller
# 创建serviceaccount和rolebiding
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/metacontroller/master/manifests/metacontroller-rbac.yaml
# 创建metacontroller crd 和 metacontroller statefulset
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/metacontroller/master/manifests/metacontroller.yaml

创建一个控制器

目标

通过HelloWorld自定义资源来创建pod,打印hello

创建HelloWorld CRD

代码语言:javascript
复制
cat << EOF | kubectl apply -f -
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: helloworlds.example.com
spec:
  group: example.com
  version: v1
  names:
    kind: HelloWorld
    plural: helloworlds
    singular: helloworld
  scope: Namespaced
EOF

创建CompositeController

代码语言:javascript
复制
cat << EOF | kubectl apply -f -
apiVersion: metacontroller.k8s.io/v1alpha1
kind: CompositeController
metadata:
  name: hello-controller
spec:
# 生成标签,模拟内置job,防止夸资源共享pod
  generateSelector: true
# watch的父资源
  parentResource:
    apiVersion: example.com/v1
    resource: helloworlds
# 生成的子资源
  childResources:
  - apiVersion: v1
    resource: pods
    updateStrategy:
      method: Recreate
# 钩子
  hooks:
    sync:
      webhook:
        url: http://hello-controller.hello/sync
EOF

实现自己的webhook

webhook流程

创建crd resource –>metacontroller收到变化通知—>发送crd和期望pod数量到webhook —> webhook解析crd返回pod列表,及请求状态(pod数量)—>metacontroller判断状态正常—>创建pod

webhook示例:
代码语言:javascript
复制
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import json

class Controller(BaseHTTPRequestHandler):
  def sync(self, parent, children):
    # Compute status based on observed state.
    desired_status = {
      "pods": len(children["Pod.v1"])
    }

    # Generate the desired child object(s).
    who = parent.get("spec", {}).get("who", "World")
    desired_pods = [
      {
        "apiVersion": "v1",
        "kind": "Pod",
        "metadata": {
          "name": parent["metadata"]["name"]
        },
        "spec": {
          "restartPolicy": "OnFailure",
          "containers": [
            {
              "name": "hello",
              "image": "busybox",
              "command": ["echo", "Hello, %s!" % who]
            }
          ]
        }
      }
    ]

    return {"status": desired_status, "children": desired_pods}

  def do_POST(self):
    # Serve the sync() function as a JSON webhook.
    observed = json.loads(self.rfile.read(int(self.headers.getheader("content-length"))))
    desired = self.sync(observed["parent"], observed["children"])

    self.send_response(200)
    self.send_header("Content-type", "application/json")
    self.end_headers()
    self.wfile.write(json.dumps(desired))

HTTPServer(("", 80), Controller).serve_forever()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 概念
  • 安装
  • 创建一个控制器
    • 目标
      • 创建HelloWorld CRD
        • 创建CompositeController
          • 实现自己的webhook
            • webhook流程
            • webhook示例:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档