Kubernetes Operator sa Python na walang mga framework at SDK
Kasalukuyang may monopolyo si Go sa mga programming language na pinipili ng mga tao na magsulat ng mga pahayag para sa Kubernetes. May mga layuning dahilan para dito, tulad ng:
Mayroong malakas na balangkas para sa pagbuo ng mga operator sa Go - Operator SDK.
Ang mga application na nagbabago ng laro tulad ng Docker at Kubernetes ay nakasulat sa Go. Ang pagsusulat ng iyong operator sa Go ay nangangahulugan ng pagsasalita ng parehong wika sa ecosystem.
Mataas na pagganap ng mga Go application at simpleng tool para sa pagtatrabaho nang may concurrency out of the box.
NB: By the way, paano magsulat ng sarili mong statement sa Go, kami inilarawan na sa isa sa aming mga pagsasalin ng mga dayuhang may-akda.
Ngunit paano kung mapipigilan kang matuto ng Go dahil sa kakulangan ng oras o, sa madaling salita, motibasyon? Nagbibigay ang artikulo ng isang halimbawa kung paano ka makakasulat ng isang mahusay na pahayag gamit ang isa sa mga pinakasikat na wika na alam ng halos bawat engineer ng DevOps - Sawa.
Kilalanin: Copier - copy operator!
Bilang isang halimbawa, isaalang-alang ang pagbuo ng isang simpleng pahayag na idinisenyo upang kopyahin ang isang ConfigMap kapag lumitaw ang isang bagong namespace o kapag nagbago ang isa sa dalawang entity: ConfigMap at Secret. Mula sa praktikal na pananaw, maaaring maging kapaki-pakinabang ang operator para sa maramihang pag-update ng mga configuration ng application (sa pamamagitan ng pag-update ng ConfigMap) o para sa pag-update ng lihim na data - halimbawa, mga susi para sa pagtatrabaho sa Docker Registry (kapag nagdaragdag ng Secret sa namespace).
Kaya, kung ano ang dapat magkaroon ng isang mahusay na operator:
Maaaring i-configure ang operator. Para magawa ito, gagamitin namin ang mga flag ng command line at mga variable ng kapaligiran.
Ang build ng Docker container at Helm chart ay idinisenyo para madaling ma-install ng mga user (literal na may isang command) ang operator sa kanilang Kubernetes cluster.
CRD
Upang malaman ng operator kung anong mga mapagkukunan ang hahanapin at kung saan hahanapin, kailangan nating magtakda ng panuntunan para sa kanya. Ang bawat panuntunan ay kakatawanin bilang isang CRD object. Anong mga field ang dapat magkaroon ng CRD na ito?
Uri ng mapagkukunan, na hahanapin natin (ConfigMap o Secret).
Listahan ng mga namespace, kung saan dapat matatagpuan ang mga mapagkukunan.
Ang pumipili, kung saan maghahanap kami ng mga mapagkukunan sa namespace.
At gagawin namin ito kaagad simpleng panuntunan β upang maghanap sa namespace na may pangalan default lahat ng ConfigMap na may mga label tulad ng copyrator: "true":
handa na! Ngayon kailangan naming makakuha ng impormasyon tungkol sa aming panuntunan. Hayaan akong magpareserba kaagad na hindi kami mismo magsusulat ng mga kahilingan sa cluster API Server. Upang gawin ito, gagamit kami ng isang handa na library ng Python kubernetes-kliyente:
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')}
Bilang resulta ng pagpapatakbo ng code na ito, nakukuha namin ang sumusunod:
Mahusay: nakakuha kami ng panuntunan para sa operator. At higit sa lahat, ginawa namin ang tinatawag na Kubernetes na paraan.
Mga variable ng kapaligiran o mga flag? Kinukuha namin ang lahat!
Lumipat tayo sa pangunahing pagsasaayos ng operator. Mayroong dalawang pangunahing diskarte sa pag-configure ng mga application:
gumamit ng mga pagpipilian sa command line;
gumamit ng mga variable ng kapaligiran.
Nagbibigay-daan sa iyo ang mga opsyon sa command line na magbasa ng mga setting nang mas flexible, na may suporta sa uri ng data at pagpapatunay. Ang karaniwang library ng Python ay may isang module argparser, na aming gagamitin. Ang mga detalye at mga halimbawa ng mga kakayahan nito ay makukuha sa opisyal na dokumentasyon.
Para sa aming kaso, ito ang magiging hitsura ng isang halimbawa ng pag-set up ng pagbabasa ng mga flag ng command line:
Sa kabilang banda, gamit ang mga variable ng kapaligiran sa Kubernetes, madali mong mailipat ang impormasyon ng serbisyo tungkol sa pod sa loob ng container. Halimbawa, makakakuha tayo ng impormasyon tungkol sa namespace kung saan tumatakbo ang pod na may sumusunod na construction:
Upang maunawaan kung paano paghiwalayin ang mga pamamaraan para sa pagtatrabaho sa ConfigMap at Secret, gagamit kami ng mga espesyal na mapa. Pagkatapos ay mauunawaan natin kung anong mga pamamaraan ang kailangan natin upang subaybayan at likhain ang bagay:
Ang pangunahing lohika ay handa na! Ngayon kailangan nating i-package ang lahat ng ito sa isang pakete ng Python. Inihahanda namin ang file setup.py, isulat ang meta impormasyon tungkol sa proyekto doon:
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: Ang kubernetes client para sa Python ay may sariling bersyon. Higit pang impormasyon tungkol sa pagiging tugma sa pagitan ng mga bersyon ng kliyente at mga bersyon ng Kubernetes ay matatagpuan sa compatibility matrices.
Ang Dockerfile ay magiging napakasimple: kunin ang batayang python-alpine na imahe at i-install ang aming package. Ipagpaliban natin ang pag-optimize nito hanggang sa mas magandang panahon:
FROM python:3.7.3-alpine3.9
ADD . /app
RUN pip3 install /app
ENTRYPOINT ["copyrator"]
Ang pag-deploy para sa operator ay napaka-simple din:
Ganyan, nang walang takot, paninisi, o pag-aaral ng Go, nakagawa kami ng sarili naming operator para sa Kubernetes sa Python. Siyempre, mayroon pa itong puwang para lumago: sa hinaharap ay makakapagproseso ito ng maraming panuntunan, makakapagtrabaho sa maraming thread, malayang subaybayan ang mga pagbabago sa mga CRD nito...
Upang mabigyan ka ng mas malapitang pagtingin sa code, inilagay namin ito pampublikong imbakan. Kung gusto mo ng mga halimbawa ng mas seryosong mga operator na ipinatupad gamit ang Python, maaari mong ibaling ang iyong pansin sa dalawang operator para sa pag-deploy ng mongodb (ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈ pangalawa).
PS At kung tinatamad kang harapin ang mga kaganapan sa Kubernetes o mas sanay kang gumamit ng Bash, ang aming mga kasamahan ay naghanda ng isang handa na solusyon sa form shell-operator (Kami inihayag noong Abril).