ProHoster > blog > Utawala > Kubernetes Operator katika Python bila mifumo na SDK
Kubernetes Operator katika Python bila mifumo na SDK
Go kwa sasa ina ukiritimba kwenye lugha za programu ambazo watu huchagua kuandika taarifa za Kubernetes. Kuna sababu za kusudi hili, kama vile:
Kuna mfumo madhubuti wa kukuza waendeshaji katika Go - Opereta SDK.
Programu za kubadilisha mchezo kama vile Docker na Kubernetes zimeandikwa katika Go. Kuandika opereta wako katika Go kunamaanisha kuzungumza lugha moja na mfumo ikolojia.
Utendaji wa juu wa programu za Go na zana rahisi za kufanya kazi na sarafu nje ya boksi.
NB: Kwa njia, jinsi ya kuandika taarifa yako mwenyewe katika Go, sisi tayari imeelezwa katika mojawapo ya tafsiri zetu za waandishi wa kigeni.
Lakini vipi ikiwa umezuiwa kujifunza Nenda kwa kukosa muda au, kwa ufupi, motisha? Nakala hiyo inatoa mfano wa jinsi unavyoweza kuandika taarifa nzuri kwa kutumia moja ya lugha maarufu ambayo karibu kila mhandisi wa DevOps anajua - Chatu.
Kutana na: Copier - nakala operator!
Kama mfano, zingatia kutengeneza taarifa rahisi iliyoundwa kunakili ConfigMap ama wakati nafasi mpya ya majina inapotokea au wakati moja ya huluki mbili zinapobadilika: ConfigMap na Secret. Kwa mtazamo wa vitendo, mwendeshaji anaweza kuwa muhimu kwa uppdatering wa wingi wa usanidi wa programu (kwa kusasisha ConfigMap) au kwa kusasisha data ya siri - kwa mfano, funguo za kufanya kazi na Usajili wa Docker (wakati wa kuongeza Siri kwenye nafasi ya majina).
Opereta inaweza kusanidiwa. Ili kufanya hivyo, tutatumia bendera za mstari wa amri na vigezo vya mazingira.
Muundo wa kontena la Docker na chati ya Helm umeundwa ili watumiaji waweze kwa urahisi (halisi kwa amri moja) kusakinisha opereta kwenye nguzo yao ya Kubernetes.
CRD
Ili opereta ajue ni rasilimali gani ya kutafuta na wapi pa kuangalia, tunahitaji kuweka sheria kwa ajili yake. Kila kanuni itawakilishwa kama kitu kimoja cha CRD. Je, CRD hii inapaswa kuwa na nyanja gani?
Aina ya rasilimali, ambayo tutatafuta (ConfigMap au Siri).
Orodha ya nafasi za majina, ambayo rasilimali zinapaswa kuwepo.
Uchaguzi, ambayo tutatafuta rasilimali katika nafasi ya majina.
Tayari! Sasa tunahitaji kwa namna fulani kupata habari kuhusu utawala wetu. Acha niweke nafasi mara moja kwamba hatutaandika maombi kwa Seva ya API ya nguzo sisi wenyewe. Ili kufanya hivyo, tutatumia maktaba ya Python tayari kubernetes-mteja:
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')}
Kama matokeo ya kuendesha nambari hii, tunapata yafuatayo:
Kubwa: tuliweza kupata sheria kwa operator. Na muhimu zaidi, tulifanya kile kinachoitwa njia ya Kubernetes.
Vigezo vya mazingira au bendera? Tunachukua kila kitu!
Hebu tuendelee kwenye usanidi mkuu wa operator. Kuna njia mbili za kimsingi za kusanidi programu:
tumia chaguzi za mstari wa amri;
tumia vigezo vya mazingira.
Chaguo za mstari wa amri hukuruhusu kusoma mipangilio kwa urahisi zaidi, kwa usaidizi wa aina ya data na uthibitishaji. Maktaba ya kawaida ya Python ina moduli argparser, ambayo tutatumia. Maelezo na mifano ya uwezo wake zinapatikana katika nyaraka rasmi.
Kwa upande wetu, hivi ndivyo mfano wa kusanidi bendera za mstari wa amri ungeonekana kama:
Kwa upande mwingine, kwa kutumia vigezo vya mazingira katika Kubernetes, unaweza kuhamisha kwa urahisi taarifa za huduma kuhusu ganda ndani ya kontena. Kwa mfano, tunaweza kupata habari kuhusu nafasi ya majina ambayo ganda linaendeshwa na ujenzi ufuatao:
Ili kuelewa jinsi ya kutenganisha mbinu za kufanya kazi na ConfigMap na Siri, tutatumia ramani maalum. Kisha tunaweza kuelewa ni njia gani tunahitaji kufuatilia na kuunda kitu:
Mantiki kuu iko tayari! Sasa tunahitaji kusanikisha haya yote kwenye kifurushi kimoja cha Python. Tunatayarisha faili setup.py, andika habari ya meta kuhusu mradi hapo:
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: Mteja wa kubernetes wa Python ana toleo lake mwenyewe. Maelezo zaidi kuhusu utangamano kati ya matoleo ya mteja na matoleo ya Kubernetes yanaweza kupatikana katika matrices ya utangamano.
Dockerfile itakuwa rahisi sana: chukua picha ya msingi ya python-alpine na usakinishe kifurushi chetu. Wacha tuahirishe uboreshaji wake hadi nyakati bora:
FROM python:3.7.3-alpine3.9
ADD . /app
RUN pip3 install /app
ENTRYPOINT ["copyrator"]
Hivyo ndivyo, bila woga, lawama, au kujifunza Go, tuliweza kuunda opereta wetu wenyewe kwa Kubernetes katika Python. Bila shaka, bado ina nafasi ya kukua: katika siku zijazo itakuwa na uwezo wa kuchakata sheria nyingi, kufanya kazi katika nyuzi nyingi, kufuatilia kwa kujitegemea mabadiliko katika CRD zake ...
Ili kukupa uangalizi wa karibu wa msimbo, tumeiweka hazina ya umma. Ikiwa unataka mifano ya waendeshaji wakubwa zaidi kutekelezwa kwa kutumia Python, unaweza kuelekeza mawazo yako kwa waendeshaji wawili kwa kupeleka mongodb (ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈ pili).
PS Na ikiwa wewe ni mvivu sana kushughulikia hafla za Kubernetes au umezoea zaidi kutumia Bash, wenzetu wameandaa suluhisho lililotengenezwa tayari katika fomu. shell-operator (Sisi alitangaza mnamo Aprili).