ဘောင်များနှင့် SDK မပါဘဲ Python ရှိ Kubernetes အော်ပရေတာ

ဘောင်များနှင့် SDK မပါဘဲ Python ရှိ Kubernetes အော်ပရေတာ

Go တွင် လက်ရှိအချိန်တွင် Kubernetes အတွက် ထုတ်ပြန်ချက်များကို ရေးသားရန် လူများက ရွေးချယ်သော ပရိုဂရမ်ဘာသာစကားများပေါ်တွင် လက်ဝါးကြီးအုပ်ထားသည်။ ဤကဲ့သို့သော ရည်ရွယ်ချက် အကြောင်းရင်းများ ရှိသည်၊

  1. Go တွင် အော်ပရေတာများ ဖော်ဆောင်ရန်အတွက် အားကောင်းသည့် မူဘောင်တစ်ခု ရှိသည်။ အော်ပရေတာ SDK.
  2. Docker နှင့် Kubernetes ကဲ့သို့သော ဂိမ်းပြောင်းလဲသည့်အက်ပ်များကို Go တွင် ရေးသားထားသည်။ Go တွင် သင်၏အော်ပရေတာအား ရေးသားခြင်းသည် ဂေဟစနစ်နှင့် တူညီသောဘာသာစကားကို ပြောဆိုခြင်းဖြစ်သည်။
  3. Go အက်ပ်လီကေးရှင်းများ၏ စွမ်းဆောင်ရည်မြင့်မားပြီး ရိုးရှင်းသောကိရိယာများဖြင့် ဘောက်စ်ပြင်ပတွင် တွဲဖက်လုပ်ဆောင်ရန်။

NB: စကားမစပ် Go, we တွင် မင်းရဲ့ကိုယ်ပိုင်ထုတ်ပြန်ချက်ကို ဘယ်လိုရေးရမလဲ ဖော်ပြပြီးသား နိုင်ငံခြားစာရေးဆရာများ၏ ဘာသာပြန်ချက်များထဲမှ တစ်ခုဖြစ်သည်။

သို့သော် အချိန်မရှိခြင်း သို့မဟုတ် စေ့ဆော်မှုဖြင့် Go သင်ယူခြင်းမှ တားဆီးခံရလျှင်ကော။ ဆောင်းပါးသည် DevOps အင်ဂျင်နီယာတိုင်းနီးပါးသိသော ရေပန်းအစားဆုံးဘာသာစကားများကို အသုံးပြု၍ ကောင်းမွန်သောထုတ်ပြန်ချက်တစ်ခုကို မည်သို့ရေးနိုင်ပုံကို ဥပမာတစ်ခုပေးထားသည်။ Python ကို.

တွေ့ဆုံရန်- မိတ္တူ - မိတ္တူအော်ပရေတာ။

ဥပမာအနေဖြင့်၊ ConfigMap တစ်ခုကို namespace အသစ်ပေါ်လာသည့်အခါ သို့မဟုတ် entities နှစ်ခုမှ တစ်ခုပြောင်းလဲသွားသောအခါတွင် ConfigMap ကို ကူးယူရန် ဒီဇိုင်းထုတ်ထားသော ရိုးရှင်းသောထုတ်ပြန်ချက်တစ်ခုကို ဖန်တီးရန် စဉ်းစားကြည့်ပါ- ConfigMap နှင့် Secret ။ လက်တွေ့ကျသောရှုထောင့်မှကြည့်လျှင် အော်ပရေတာသည် အပလီကေးရှင်းဖွဲ့စည်းပုံပုံစံများကို အစုလိုက်မွမ်းမံခြင်း (ConfigMap ကို မွမ်းမံခြင်းဖြင့်) သို့မဟုတ် လျှို့ဝှက်ဒေတာကို မွမ်းမံခြင်းအတွက် - ဥပမာအားဖြင့်၊ Docker Registry နှင့် အလုပ်လုပ်ရန်အတွက် သော့များ (လျှို့ဝှက်ချက်ကို အမည်နေရာသို့ ထည့်သောအခါ)။

ထို့ကြောင့် အော်ပရေတာကောင်းတစ်ယောက်မှာ ဘာတွေရှိသင့်လဲ။:

  1. အော်ပရေတာနှင့်အပြန်အလှန်တုံ့ပြန်မှုကို အသုံးပြု စိတ်ကြိုက်အရင်းအမြစ် အဓိပ္ပါယ်ဖွင့်ဆိုချက် (နောင် CRD ဟု ခေါ်ဆိုသည်)။
  2. အော်ပရေတာအား ပြင်ဆင်သတ်မှတ်နိုင်သည်။ ၎င်းကိုလုပ်ဆောင်ရန်၊ ကျွန်ုပ်တို့သည် command line flags နှင့် environment variable များကိုသုံးပါမည်။
  3. Docker ကွန်တိန်နာနှင့် Helm ဇယား၏တည်ဆောက်မှုကို အသုံးပြုသူများသည် ၎င်းတို့၏ Kubernetes အစုအဝေးတွင် အော်ပရေတာအား (တစ်နည်းအားဖြင့် တစ်ကြောင်းတည်းဖြင့်) အလွယ်တကူ ထည့်သွင်းနိုင်စေရန် ဒီဇိုင်းထုတ်ထားသည်။

CRD

အော်ပရေတာသည် မည်သည့်အရင်းအမြစ်များကို ရှာဖွေရမည်ဖြစ်ပြီး မည်သည့်နေရာတွင် ရှာဖွေရမည်ကို သိနိုင်စေရန်အတွက် ကျွန်ုပ်တို့သည် သူ့အတွက် စည်းမျဉ်းတစ်ခု သတ်မှတ်ရန် လိုအပ်ပါသည်။ စည်းမျဉ်းတစ်ခုစီကို CRD အရာဝတ္ထုတစ်ခုအဖြစ် ကိုယ်စားပြုပါမည်။ ဤ CRD တွင် မည်သည့်နယ်ပယ်များ ရှိသင့်သနည်း။

  1. အရင်းအမြစ်အမျိုးအစားကျွန်ုပ်တို့ရှာဖွေမည့် (ConfigMap သို့မဟုတ် လျှို့ဝှက်ချက်)။
  2. အမည်ကွက်များစာရင်းအရင်းအမြစ်များထားရှိသင့်သော၊
  3. selectornamespace တွင် အရင်းအမြစ်များကို ရှာဖွေပါမည်။

CRD ကို ဖော်ပြကြပါစို့။

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: copyrator.flant.com
spec:
  group: flant.com
  versions:
  - name: v1
    served: true
    storage: true
  scope: Namespaced
  names:
    plural: copyrators
    singular: copyrator
    kind: CopyratorRule
    shortNames:
    - copyr
  validation:
    openAPIV3Schema:
      type: object
      properties:
        ruleType:
          type: string
        namespaces:
          type: array
          items:
            type: string
        selector:
          type: string

ပြီးတော့ ငါတို့ ချက်ချင်း ဖန်တီးပေးမယ်။ ရိုးရှင်းသောစည်းမျဉ်း - အမည်ဖြင့် namespace တွင်ရှာဖွေရန် default တံဆိပ်များကဲ့သို့ ConfigMap အားလုံး copyrator: "true":

apiVersion: flant.com/v1
kind: CopyratorRule
metadata:
  name: main-rule
  labels:
    module: copyrator
ruleType: configmap
selector:
  copyrator: "true"
namespace: default

အဆင်သင့်။ ယခု ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏စည်းမျဉ်းနှင့်ပတ်သက်သည့် အချက်အလက်များကို တစ်နည်းနည်းဖြင့် ရယူရန် လိုအပ်ပါသည်။ ကျွန်ုပ်တို့သည် အစုအဖွဲ့ API ဆာဗာထံ တောင်းဆိုချက်များကို မရေးနိုင်စေရန် ချက်ချင်း ကြိုတင်စာရင်းသွင်းခွင့်ပြုပါ။ ဒါကိုလုပ်ဖို့၊ အဆင်သင့်လုပ်ထားတဲ့ Python စာကြည့်တိုက်ကို အသုံးပြုပါမယ်။ kubernetes-ဖောက်သည်:

import kubernetes
from contextlib import suppress


CRD_GROUP = 'flant.com'
CRD_VERSION = 'v1'
CRD_PLURAL = 'copyrators'


def load_crd(namespace, name):
    client = kubernetes.client.ApiClient()
    custom_api = kubernetes.client.CustomObjectsApi(client)

    with suppress(kubernetes.client.api_client.ApiException):
        crd = custom_api.get_namespaced_custom_object(
            CRD_GROUP,
            CRD_VERSION,
            namespace,
            CRD_PLURAL,
            name,
        )
    return {x: crd[x] for x in ('ruleType', 'selector', 'namespace')}

ဤကုဒ်ကိုအသုံးပြုခြင်း၏ရလဒ်အနေဖြင့်၊ ကျွန်ုပ်တို့သည် အောက်ပါတို့ကိုရရှိသည်။

{'ruleType': 'configmap', 'selector': {'copyrator': 'true'}, 'namespace': ['default']}

ကောင်းသည်- အော်ပရေတာအတွက် စည်းမျဉ်းတစ်ခုရနိုင်ခဲ့သည်။ အရေးကြီးဆုံးကတော့ Kubernetes လို့ ခေါ်တဲ့ နည်းလမ်းကို ကျွန်တော်တို့ လုပ်ခဲ့ပါတယ်။

ပတ်ဝန်းကျင်ပြောင်းလဲမှုများ သို့မဟုတ် အလံများ။ ငါတို့အားလုံးယူ။

ပင်မအော်ပရေတာဖွဲ့စည်းမှုသို့ ဆက်သွားကြပါစို့။ အပလီကေးရှင်းများကို ပြင်ဆင်သတ်မှတ်ခြင်းအတွက် အခြေခံနည်းလမ်းနှစ်ခုရှိသည်။

  1. command line ရွေးချယ်စရာများကို အသုံးပြုပါ။
  2. ပတ်ဝန်းကျင် ကိန်းရှင်များကို အသုံးပြုပါ။

ကွန်မန့်လိုင်းရွေးချယ်မှုများသည် ဒေတာအမျိုးအစားပံ့ပိုးမှုနှင့် တရားဝင်မှုတို့ဖြင့် ဆက်တင်များကို ပိုမိုပျော့ပြောင်းစွာ ဖတ်နိုင်စေပါသည်။ Python ၏စံပြစာကြည့်တိုက်တွင် module တစ်ခုရှိသည်။ argparserကျွန်ုပ်တို့အသုံးပြုမည့်၊ ၎င်း၏ စွမ်းဆောင်ရည် အသေးစိတ်နှင့် နမူနာများကို တွင် ကြည့်ရှုနိုင်ပါသည်။ တရားဝင်စာရွက်စာတမ်း.

ကျွန်ုပ်တို့၏ကိစ္စအတွက်၊ ဤသည်မှာ စာဖတ်ခြင်း command line flags များကို သတ်မှတ်ခြင်း၏ ဥပမာတစ်ခုအနေနှင့် ကြည့်ရလိမ့်မည်-

   parser = ArgumentParser(
        description='Copyrator - copy operator.',
        prog='copyrator'
    )
    parser.add_argument(
        '--namespace',
        type=str,
        default=getenv('NAMESPACE', 'default'),
        help='Operator Namespace'
    )
    parser.add_argument(
        '--rule-name',
        type=str,
        default=getenv('RULE_NAME', 'main-rule'),
        help='CRD Name'
    )
    args = parser.parse_args()

အခြားတစ်ဖက်တွင်၊ Kubernetes ရှိ ပတ်ဝန်းကျင်ပြောင်းလဲမှုများကို အသုံးပြု၍ ကွန်တိန်နာအတွင်းရှိ pod နှင့်ပတ်သက်သော ဝန်ဆောင်မှုအချက်အလက်များကို အလွယ်တကူ လွှဲပြောင်းနိုင်ပါသည်။ ဥပမာအားဖြင့်၊ အောက်ဖော်ပြပါ တည်ဆောက်မှုဖြင့် pod လည်ပတ်နေသည့် namespace အကြောင်း အချက်အလက်ကို ကျွန်ုပ်တို့ ရရှိနိုင်ပါသည်။

env:
- name: NAMESPACE
  valueFrom:
     fieldRef:
         fieldPath: metadata.namespace 

အော်ဂျစ်

ConfigMap နှင့် Secret နှင့် လုပ်ဆောင်ရန် နည်းလမ်းများကို ခွဲခြားနားလည်ရန် အထူးမြေပုံများကို အသုံးပြုပါမည်။ ထို့နောက် အရာဝတ္တုကို ခြေရာခံပြီး ဖန်တီးရန် လိုအပ်သည့် နည်းလမ်းများကို ကျွန်ုပ်တို့ နားလည်နိုင်သည်-

LIST_TYPES_MAP = {
    'configmap': 'list_namespaced_config_map',
    'secret': 'list_namespaced_secret',
}

CREATE_TYPES_MAP = {
    'configmap': 'create_namespaced_config_map',
    'secret': 'create_namespaced_secret',
}

ထို့နောက်၊ သင်သည် API ဆာဗာမှ ဖြစ်ရပ်များကို လက်ခံရရှိရန် လိုအပ်သည်။ အောက်ပါအတိုင်း အကောင်အထည်ဖော်ကြပါစို့။

def handle(specs):
    kubernetes.config.load_incluster_config()
    v1 = kubernetes.client.CoreV1Api()

    # Получаем метод для слежения за объектами
    method = getattr(v1, LIST_TYPES_MAP[specs['ruleType']])
    func = partial(method, specs['namespace'])

    w = kubernetes.watch.Watch()
    for event in w.stream(func, _request_timeout=60):
        handle_event(v1, specs, event)

အစီအစဉ်ကို လက်ခံရရှိပြီးနောက်၊ ကျွန်ုပ်တို့ ၎င်းကို လုပ်ဆောင်ခြင်း၏ အဓိက လော့ဂျစ်သို့ ဆက်သွားပါ-

# Типы событий, на которые будем реагировать
ALLOWED_EVENT_TYPES = {'ADDED', 'UPDATED'}


def handle_event(v1, specs, event):
    if event['type'] not in ALLOWED_EVENT_TYPES:
        return

    object_ = event['object']
    labels = object_['metadata'].get('labels', {})

    # Ищем совпадения по selector'у
    for key, value in specs['selector'].items():
        if labels.get(key) != value:
            return
    # Получаем активные namespace'ы
    namespaces = map(
        lambda x: x.metadata.name,
        filter(
            lambda x: x.status.phase == 'Active',
            v1.list_namespace().items
        )
    )
    for namespace in namespaces:
        # Очищаем метаданные, устанавливаем namespace
        object_['metadata'] = {
            'labels': object_['metadata']['labels'],
            'namespace': namespace,
            'name': object_['metadata']['name'],
        }
        # Вызываем метод создания/обновления объекта
        methodcaller(
            CREATE_TYPES_MAP[specs['ruleType']],
            namespace,
            object_
        )(v1)

အဓိက ယုတ္တိဗေဒ အဆင်သင့်ဖြစ်ပါပြီ။ ယခု ဤအရာအားလုံးကို Python ပက်ကေ့ခ်ျတစ်ခုထဲသို့ ထုပ်ပိုးရန် လိုအပ်ပါသည်။ ဖိုင်ကိုပြင်ဆင်ပါ။ setup.pyပရောဂျက်အကြောင်း မက်တာအချက်အလက်ကို ထိုနေရာတွင် ရေးပါ။

from sys import version_info

from setuptools import find_packages, setup

if version_info[:2] < (3, 5):
    raise RuntimeError(
        'Unsupported python version %s.' % '.'.join(version_info)
    )


_NAME = 'copyrator'
setup(
    name=_NAME,
    version='0.0.1',
    packages=find_packages(),
    classifiers=[
        'Development Status :: 3 - Alpha',
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: 3.7',
    ],
    author='Flant',
    author_email='[email protected]',
    include_package_data=True,
    install_requires=[
        'kubernetes==9.0.0',
    ],
    entry_points={
        'console_scripts': [
            '{0} = {0}.cli:main'.format(_NAME),
        ]
    }
)

NB: Python အတွက် kubernetes client တွင် ၎င်း၏ကိုယ်ပိုင်ဗားရှင်းရှိသည်။ ကလိုင်းယင့်ဗားရှင်းများနှင့် Kubernetes ဗားရှင်းများအကြား လိုက်ဖက်ညီမှုအကြောင်း နောက်ထပ်အချက်အလက်များကို တွင် တွေ့နိုင်ပါသည်။ လိုက်ဖက်ညီသော matrices.

ယခုကျွန်ုပ်တို့၏ ပရောဂျက်သည် ဤကဲ့သို့ဖြစ်ပုံရသည်။

copyrator
├── copyrator
│   ├── cli.py # Логика работы с командной строкой
│   ├── constant.py # Константы, которые мы приводили выше
│   ├── load_crd.py # Логика загрузки CRD
│   └── operator.py # Основная логика работы оператора
└── setup.py # Оформление пакета

Docker နှင့် Helm

Dockerfile သည် မယုံနိုင်လောက်အောင် ရိုးရှင်းလိမ့်မည်- အခြေခံ python-alpine ပုံကိုယူပြီး ကျွန်ုပ်တို့၏ package ကို ထည့်သွင်းပါ။ ပိုမိုကောင်းမွန်သည့်အချိန်များအထိ ၎င်း၏ ပိုမိုကောင်းမွန်အောင်ပြုလုပ်ခြင်းကို ရွှေ့လိုက်ကြပါစို့။

FROM python:3.7.3-alpine3.9

ADD . /app

RUN pip3 install /app

ENTRYPOINT ["copyrator"]

အော်ပရေတာအတွက် ဖြန့်ကျက်ခြင်းသည်လည်း အလွန်ရိုးရှင်းပါသည်။

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Chart.Name }}
spec:
  selector:
    matchLabels:
      name: {{ .Chart.Name }}
  template:
    metadata:
      labels:
        name: {{ .Chart.Name }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: privaterepo.yourcompany.com/copyrator:latest
        imagePullPolicy: Always
        args: ["--rule-type", "main-rule"]
        env:
        - name: NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
      serviceAccountName: {{ .Chart.Name }}-acc

နောက်ဆုံးတွင်၊ လိုအပ်သောအခွင့်အရေးများနှင့်အတူ အော်ပရေတာအတွက် သင့်လျော်သောအခန်းကဏ္ဍကို ဖန်တီးရန် လိုအပ်သည်-

apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ .Chart.Name }}-acc

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: {{ .Chart.Name }}
rules:
  - apiGroups: [""]
    resources: ["namespaces"]
    verbs: ["get", "watch", "list"]
  - apiGroups: [""]
    resources: ["secrets", "configmaps"]
    verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: {{ .Chart.Name }}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: {{ .Chart.Name }}
subjects:
- kind: ServiceAccount
  name: {{ .Chart.Name }}

ရလဒ်

ထို့ကြောင့် ကြောက်ရွံ့ခြင်း၊ ကဲ့ရဲ့ခြင်း သို့မဟုတ် Go ကို လေ့လာခြင်းမရှိဘဲ၊ Python ရှိ Kubernetes အတွက် ကျွန်ုပ်တို့၏ကိုယ်ပိုင်အော်ပရေတာကို တည်ဆောက်နိုင်ခဲ့သည်။ ဟုတ်ပါတယ်၊ သူ့မှာ ကြီးထွားဖို့ နေရာကျန်ပါသေးတယ်- နောင်တွင် ၎င်းသည် စည်းမျဉ်းများစွာကို လုပ်ဆောင်နိုင်မည်ဖြစ်ပြီး၊ ကဏ္ဍအများအပြားတွင် လုပ်ဆောင်နိုင်မည်ဖြစ်ပြီး ၎င်း၏ CRDs များတွင် အပြောင်းအလဲများကို လွတ်လပ်စွာ စောင့်ကြည့်နိုင်လိမ့်မည်...

ကုဒ်ကို အနီးကပ်ကြည့်ရှုနိုင်ရန် ကျွန်ုပ်တို့က ၎င်းကို ထည့်သွင်းထားပါသည်။ အများသူငှာသိုလှောင်မှု. Python ကိုအသုံးပြုပြီး ပိုမိုလေးနက်သော အော်ပရေတာများ၏ ဥပမာများကို လိုချင်ပါက၊ သင်သည် mongodb ကိုအသုံးချရန်အတွက် အော်ပရေတာနှစ်ခုကို အာရုံစိုက်နိုင်သည် (первый и ဒုတိယ).

PS နှင့် Kubernetes ဖြစ်ရပ်များကို ကိုင်တွယ်ဖြေရှင်းရန် သင်အလွန်ပျင်းနေပါက သို့မဟုတ် Bash ကို အသုံးပြုရာတွင် ပိုမိုကျင့်သားရနေပါက၊ ကျွန်ုပ်တို့၏ လုပ်ဖော်ကိုင်ဖက်များသည် အဆင်သင့်လုပ်ထားသော ဖြေရှင်းချက်ပုံစံကို ပြင်ဆင်ထားပါသည်။ shell-အော်ပရေတာ (ငါတို့ ကြေငြာခဲ့သည် ဧပြီလ)။

PPS

ကျွန်ုပ်တို့၏ဘလော့ဂ်တွင်လည်းဖတ်ပါ

source: www.habr.com

မှတ်ချက် Add