Эй Хабр!
Жаздың соңында біз тақырыппен жұмысты жалғастыратынымызды еске салғымыз келеді және маусым айының басында осы жобадағы жағдайды көрсететін Stackoverflow мақаласын жариялауды ұйғарды.

Оқуға ләззат алыңыз!
Осы мақаланы жазу кезінде Кубернетестің жасы шамамен. , және соңғы екі жыл ішінде оның танымалдылығы соншалықты өсті, ол дәйектілікпен рейтингте платформалар. Кубернетес биыл үшінші орында. Ескерту: Kubernetes - бұл контейнерлік жұмыс жүктемелерін орындауға және ұйымдастыруға арналған платформа.
Контейнерлер Linux жүйесінде процестерді оқшаулауға арналған арнайы дизайн ретінде басталды; контейнерлер 2007 жылдан бастап енгізілген , ал 2002 жылдан бастап – аттар кеңістігі. Контейнерлер қол жетімді болған кезде 2008 жылға қарай жақсырақ жобаланған , және Google өзінің ішкі корпоративтік механизмін әзірледі , мұнда «барлық жұмыс контейнерлерде орындалады». Осы жерден біз Docker бірінші шығарылымы орын алған 2013 жылға қарай алға жылжып, ақырында контейнерлер танымал жаппай шешімге айналды. Ол кезде контейнерлік оркестрдің негізгі құралы болды , ол өте танымал болмаса да. Kubernetes алғаш рет 2015 жылы шығарылды, содан кейін бұл құрал контейнерлік оркестрлеу саласындағы іс жүзінде стандартқа айналды.
Кубернетестің неге соншалықты танымал екенін түсіну үшін бірнеше сұрақтарға жауап беруге тырысайық. Әзірлеушілер қолданбаларды өндіріске қалай орналастыру керектігі туралы соңғы рет қашан келісе алды? Құралдар қораптан тыс берілгендіктен оларды пайдаланатын қанша әзірлеушілерді білесіз? Бүгінгі таңда қолданбалардың қалай жұмыс істейтінін түсінбейтін қанша бұлттық әкімшілер бар? Бұл сұрақтардың жауаптарын осы мақалада қарастырамыз.
YAML сияқты инфрақұрылым
Қуыршақ пен аспаздан Кубернетеске өткен әлемде ең үлкен өзгерістердің бірі «код ретіндегі инфрақұрылымдан» «деректер ретіндегі инфрақұрылымға», атап айтқанда YAML сияқты ауысу болды. Қоспаларды, конфигурацияларды, орналастырылған даналарды, томдарды және т.б. қамтитын Kubernetes-тегі барлық ресурстарды YAML файлында оңай сипаттауға болады. Мысалы:
apiVersion: v1
kind: Pod
metadata:
name: site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80Бұл көрініс DevOps немесе SRE мамандарына Python немесе Javascript сияқты тілдерде код жазбай-ақ жұмыс жүктемелерін толық көрсетуді жеңілдетеді.
Инфрақұрылымды деректер ретінде ұйымдастырудың басқа артықшылықтары мыналарды қамтиды:
- GitOps немесе Git операцияларының нұсқасын басқару. Бұл тәсіл барлық Kubernetes YAML файлдарын git репозиторийлерінде сақтауға мүмкіндік береді, осылайша өзгертудің қашан енгізілгенін, оны кім жасағанын және нақты не өзгергенін қадағалай аласыз. Бұл ұйымдағы операциялардың ашықтығын арттырады және екіұштылықты жою арқылы операциялық тиімділікті арттырады, әсіресе қызметкерлер өздеріне қажетті ресурстарды іздеуі керек жерде. Сонымен қатар, тарту сұрауын біріктіру арқылы Kubernetes ресурстарына автоматты түрде өзгертулер енгізу оңайырақ болады.
- Масштабтау мүмкіндігі. Ресурстар YAML ретінде анықталғанда, кластер операторларына Kubernetes ресурсындағы бір немесе екі санды өзгерту өте оңай болады, осылайша оның масштабтау әдісі өзгереді. Kubernetes трафиктің төмен және жоғары деңгейлерін өңдеу үшін белгілі бір орналастыру конфигурациясында подкасттардың ең аз және ең көп саны қанша қажет екенін ыңғайлы анықтау үшін пайдаланылуы мүмкін подкасттарды көлденең автомасштабтау механизмін қамтамасыз етеді. Мысалы, трафиктің кенеттен өсуіне байланысты қосымша сыйымдылықты қажет ететін конфигурацияны қолдансаңыз, maxReplicas 10-нан 20-ға дейін өзгертілуі мүмкін:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-deployment
minReplicas: 1
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50- Қауіпсіздік және басқару. YAML Kubernetes-те заттардың қалай орналастырылғанын бағалау үшін тамаша. Мысалы, негізгі қауіпсіздік мәселесі сіздің жұмыс жүктемелеріңіз әкімші емес пайдаланушы ретінде іске қосылатынына қатысты. Бұл жағдайда бізге құралдар қажет болуы мүмкін , YAML/JSON валидаторы, плюс , контекстті қамтамасыз ету үшін саясат валидаторы сіздің жұмыс жүктемелеріңіз контейнерге әкімші артықшылықтарымен жұмыс істеуге мүмкіндік бермейді. Бұл қажет болса, пайдаланушылар қарапайым саясатты қолдана алады , бұл сияқты:
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}- Бұлттық провайдермен біріктіру опциялары. Бүгінгі жоғары технологиялардағы ең көрнекті трендтердің бірі - бұл жалпыға қолжетімді провайдерлерде жұмыс жүктемесін орындау. Компонентті пайдалану Kubernetes кез келген кластерге өзі жұмыс істейтін бұлт провайдерімен біріктіруге мүмкіндік береді. Мысалы, пайдаланушы AWS жүйесінде Kubernetes қолданбасын іске қосса және сол қолданбаны қызмет арқылы көрсеткісі келсе, бұлттық провайдер қызметті автоматты түрде жасауға көмектеседі.
LoadBalancerол жүктеме балансын автоматты түрде қамтамасыз етеді трафикті қолданбалы бөлімдерге қайта бағыттау үшін.
Кеңейту мүмкіндігі
Kubernetes өте кеңейтілген және әзірлеушілер оны жақсы көреді. Қоспалар, орналастырулар сияқты қолжетімді ресурстар жиынтығы бар. StatefulSets, құпиялары, ConfigMaps, т.б. Рас, пайдаланушылар мен әзірлеушілер пішінге басқа ресурстарды қоса алады .
Мысалы, ресурсты анықтағымыз келсе CronTab, онда сіз келесідей нәрсені жасай аласыз:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.my.org
spec:
group: my.org
versions:
- name: v1
served: true
storage: true
Schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$'
replicas:
type: integer
minimum: 1
maximum: 10
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
Кейінірек біз CronTab ресурсын келесідей жасай аламыз:
apiVersion: "my.org/v1"
kind: CronTab
metadata:
name: my-cron-object
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 5
Kubernetes кеңейтімінің тағы бір нұсқасы - әзірлеуші өз мәлімдемелерін жаза алады. сәйкес жұмыс істейтін Kubernetes кластеріндегі арнайы процесс болып табылады." Оператордың көмегімен пайдаланушы Kubernetes API интерфейсімен ақпарат алмасу арқылы CRD басқаруын автоматтандыруы мүмкін (пайдаланушы ресурс анықтамалары).
Қауымдастықта әзірлеушілерге өз операторларын құруды жеңілдететін бірнеше құралдар бар. Олардың ішінде - және оның . Бұл SDK әзірлеуші оператор құруды жылдам бастауға болатын негізді қамтамасыз етеді. Пәрмен жолынан келесідей нәрсені бастауға болады делік:
$ operator-sdk new my-operator --repo github.com/myuser/my-operatorБұл YAML файлдары мен Голанг кодын қоса, операторыңыз үшін барлық стандартты кодты жасайды:
.
|____cmd
| |____manager
| | |____main.go
|____go.mod
|____deploy
| |____role.yaml
| |____role_binding.yaml
| |____service_account.yaml
| |____operator.yaml
|____tools.go
|____go.sum
|____.gitignore
|____version
| |____version.go
|____build
| |____bin
| | |____user_setup
| | |____entrypoint
| |____Dockerfile
|____pkg
| |____apis
| | |____apis.go
| |____controller
| | |____controller.goСодан кейін қажетті API және контроллерді қосуға болады, мысалы:
$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService
$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppServiceСодан кейін, соңында операторды жинап, оны контейнеріңіздің тізіліміне жіберіңіз:
$ operator-sdk build your.container.registry/youruser/myapp-operator Әзірлеуші одан да көп бақылауды қаласа, Go файлдарындағы стандартты кодты өзгертуге болады. Мысалы, контроллердің ерекшеліктерін өзгерту үшін файлға өзгертулер енгізуге болады controller.go.
Тағы бір жоба , тек декларациялық YAML файлдарын пайдаланып мәлімдемелер жасауға мүмкіндік береді. Мысалы, Apache Kafka операторы шамамен анықталады . Оның көмегімен Kubernetes-тің үстіне бірнеше командалар арқылы Кафка кластерін орнатуға болады:
$ kubectl kudo install zookeeper
$ kubectl kudo install kafkaСодан кейін оны басқа пәрменмен конфигурациялаңыз:
$ kubectl kudo install kafka --instance=my-kafka-name
-p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181
-p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m
-p BROKER_COUNT=5 -p BROKER_MEM=4096m
-p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3
-p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20
Инновациялар
Соңғы бірнеше жылда Kubernetes-тің негізгі шығарылымдары бірнеше ай сайын шығады, яғни жылына үш-төрт негізгі шығарылымдар. Олардың әрқайсысында енгізілген жаңа мүмкіндіктер саны азаймайды. Оның үстіне қазіргі қиын-қыстау кезеңде де бәсеңдеудің нышаны байқалмайды – қазір жағдай қандай екенін қараңыз .
Жаңа мүмкіндіктер әртүрлі жұмыс жүктемелері бойынша операцияларды икемді түрде кластерлеуге мүмкіндік береді. Сонымен қатар, бағдарламашылар қолданбаларды тікелей өндіріске орналастыру кезінде үлкен бақылауды пайдаланады.
Қоғамдастық
Кубернетестің танымалдығының тағы бір маңызды аспектісі - оның қауымдастығының күші. 2015 жылы 1.0 нұсқасына жеткенде Кубернетес демеушілік жасады .
Әртүрлі қауымдастықтар да бар (Арнайы қызығушылық топтары) жоба дамып келе жатқанда Кубернетестің әртүрлі салаларында жұмыс істеуге бағытталған. Бұл топтар үнемі жаңа мүмкіндіктерді қосып, Kubernetes-пен жұмысты ыңғайлы әрі ыңғайлы етеді.
Cloud Native Foundation сонымен қатар CloudNativeCon/KubeCon ұсынады, ол жазу кезінде әлемдегі ең үлкен ашық бастапқы конференция болып табылады. Әдетте жылына үш рет өткізіледі, ол Kubernetes және оның экожүйесін жақсартқысы келетін, сондай-ақ үш ай сайын пайда болатын жаңа мүмкіндіктерді білгісі келетін мыңдаған мамандарды біріктіреді.
Сонымен қатар, Cloud Native Foundation бар , олар SIG-мен бірге жаңа және бұрыннан барларды қарайды бұлттық экожүйеге бағытталған қаражат. Бұл жобалардың көпшілігі Kubernetes-тің күшті жақтарын жақсартуға көмектеседі.
Соңында, мен Кубернетес бүкіл қауымдастықтың саналы күш-жігерінсіз сәтті бола алмайды деп ойлаймын, мұнда адамдар бір-бірімен тығыз байланыста болады, бірақ сонымен бірге жаңадан келгендерді қарсы алады.
Болашақ
Әзірлеушілер болашақта шешуге тура келетін негізгі қиындықтардың бірі - код жұмыс істейтін инфрақұрылымға емес, оның бөлшектеріне назар аудару мүмкіндігі. Ол осы үрдістерге сәйкес келеді , ол бүгінгі таңда жетекшілердің бірі болып табылады. Жетілдірілген фреймворктер бұрыннан бар, мысалы: и , ол әзірлеушіден инфрақұрылымды абстракциялау үшін Kubernetes қолданбасын пайдаланады.
Бұл мақалада біз Кубернетестің қазіргі жағдайының бетін ғана сызып алдық — шын мәнінде, бұл айсбергтің ұшы ғана. Kubernetes пайдаланушыларында көптеген басқа ресурстар, мүмкіндіктер және конфигурациялар бар.
Ақпарат көзі: www.habr.com
