Қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды баптау
Бұл мақалада қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды қалай баптау керектігі сипатталған. Мысалда келесі жабдық пайдаланылады:
- Ubuntu 18.04 LTS x86_64 сервері: онда Docker, GitLab және Harbor орнатылып, бапталады.
- VK Cloud-та жайып орналастырылған K8s кластері.
-
GitLab веб-интерфейсіне әкімші құқықтарымен авторизациялаңыз:

-
registration token мәнін көшіріп алыңыз. GitLab-runner орнатылған сервердің консолінде келесі команданы орындаңыз:
docker exec -it gitlab-runner gitlab-runner register -n --url https://<SERVER_DNS_NAME>/ --executor docker --registration-token ua2k238fbMtAxMBBRf_z --description "shared-runner" --docker-image="docker:dind" --tag-list "shared_runner" --docker-privileged --docker-volumes /var/run/docker.sock:/var/run/docker.sockНәтижесінде runner веб-интерфейсте көрсетіледі:

-
Орындау ортасының айнымалыларын баптаңыз:
-
Settings → CI/CD бөліміне өтіңіз.
-
Variables блогында Expand батырмасын басыңыз:
-
.gitlab-ci.ymlавтожинау файлында пайдаланылатын айнымалыларды орнатыңыз:DOCKER_USER— Harbor-дағы репозиторийге қол жеткізуге арналған пайдаланушы. Біздің мысалда —k8s.DOCKER_PASSWORD— Harbor-да пайдаланушыны жасау кезінде енгізген k8s пайдаланушысының құпиясөзі. Айнымалы үшін Masked опциясын белгілеңіз — соның арқасында сценарийде айнымалы мәтінін шығаруға әрекет жасалғанда ол бүркемеленеді және құпиясөз көрінбейді.DOCKER_REGISTRY— Harbor орналасқан хост атауы. Біздің мысалда —<SERVER_DNS_NAME>.
-
-
Жүктеп алынған репозиторийі бар директорияға өтіп, келесі мазмұндағы
.gitlab-ci.ymlфайлын жасаңыз: -
Жасалған файлды репозиторийге жүктеңіз:
ash-work:k8s-conf-demo git add .ash-work:k8s-conf-demo git commit -m "create .gitlab-ci.yml"[master 55dd5fa] create .gitlab-ci.yml1 file changed, 1 insertion(+), 1 deletion(-)ash-work:k8s-conf-demo git pushПеречисление объектов: 5, готово.Подсчет объектов: 100% (5/5), готово.При сжатии изменений используется до 4 потоковСжатие объектов: 100% (3/3), готово.Запись объектов: 100% (3/3), 299 bytes | 299.00 KiB/s, готово.Всего 3 (изменения 2), повторно использовано 0 (изменения 0)To testrom.ddns.net:ash/k8s-conf-demo.git7c91eab..55dd5fa master -> master.gitlab-ci.ymlфайлы репозиторийде пайда болған бойда, GitLab оның жинағын автоматты түрде іске қосады. -
Жинақтың аяқталуын күтіңіз.
-
(Опционалды) Harbor-да жиналған образдың бар-жоғын тексеріңіз:

-
VK Cloud-та Kubernetes кластерін жасаңыз.
-
kubectlкөмегімен кластерге қосылыңыз. -
Кластерге Harbor образдар репозиторийіне қол жеткізу құқықтарын беріңіз:
<SERVER_DNS_NAME>(Harbor серверінің атауы) және<PASSWORD>(Harbor-дағы k8s пайдаланушысының құпиясөзі) мәндерімен secret жасаңыз:
kubectl create secret docker-registry myprivateregistry --docker-server=https://<SERVER_DNS_NAME>:8443 --docker-username=k8s --docker-password=<PASSWORD>- Secret сәтті жасалғанына көз жеткізіңіз:
ash-work:~ kubectl get secret myprivateregistry --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode -
deployment.ymlқосымша файлын жасаңыз: -
Қосымшаны іске қосыңыз:
kubectl create -f deployment.yaml -
Біраз уақыттан кейін контейнердің көтерілгеніне көз жеткізіңіз:
kubectl get podsҰқсас ақпарат көрсетілуі керек:
NAME READY STATUS RESTARTS AGEmyapp-deployment-66d55bcbd5-s86m6 1/1 Running 0 39s -
service.ymlфайлын жасаңыз: -
Сервисті жасаңыз:
kubectl create -f service.yaml -
Қосымшаға сыртқы желіден қолжетімділікті қамтамасыз ету үшін ingress-контроллерді баптаңыз. Ол үшін
ingress.yamlфайлын жасаңыз: -
Ingress-контроллерді қолданыңыз:
kubectl create -f ingress.yaml -
Ingress-контроллердің күйін қараңыз:
kubectl describe ingress myapp-ingressКоманданың күтілетін нәтижесі:
Name: myapp-ingressNamespace: defaultAddress:Default backend: default-http-backend:80 (<none>)Rules:Host Path Backends---- ---- --------echo.com/ myapp-svc:8081 (10.100.69.71:8081)Annotations:Events:Type Reason Age From Message---- ------ ---- ---- -------Normal CREATE 45s nginx-ingress-controller Ingress default/myapp-ingressNormal UPDATE 5s nginx-ingress-controller Ingress default/myapp-ingress -
Қосымшаның жұмысын тексеріңіз. Ingress-контроллермен байланыстырылған сыртқы IP-мекенжайды кластер бетінде көруге болады. Ол Ingress Controller үшін жүктеме теңгергішінің IP-мекенжайы деп аталады. Оны
<INGRESS_EXTERNAL_IP>деп белгілейік.ash-work:~ curl --resolve echo.com:80:<INGRESS_EXTERNAL_IP> http://echo.com/handler -
(Опционалды) Кластерде жасалған сервистерді жойыңыз:
ash-work:~ kubectl delete -f ingress.yamlash-work:~ kubectl delete -f service.yamlash-work:~ kubectl delete -f deployment.yaml
GitLab әдепкі бойынша Kubernetes кластерімен интеграцияны қолдайды. Интеграцияны баптау үшін кластердің бірнеше параметрін алыңыз:
-
API URL алыңыз:
ash-work:~ kubectl cluster-info | grep 'Kubernetes master' | awk '/http/ {print $NF}' -
Кластер secret-терінің тізімін алыңыз:
kubectl get secretsКоманданың күтілетін нәтижесі:
NAME TYPE DATA AGEdashboard-sa-token-xnvmp kubernetes.io/service-account-token 3 41hdefault-token-fhvxq kubernetes.io/service-account-token 3 41hmyprivateregistry kubernetes.io/dockerconfigjson 1 39hregcred kubernetes.io/dockerconfigjson 1 39h -
default-tokensecret-інің PEM сертификатын алыңыз:kubectl get secret default-token-fhvxq -o jsonpath="{['data']['ca\.crt']}" | base64 --decode -
GitLab-тың кластерге қол жеткізу құқықтарын сипаттайтын
gitlab-admin-service-account.yamlфайлын жасаңыз. -
Құқықтарды қолданыңыз және кластерге қол жеткізу токенін алыңыз:
kubectl apply -f gitlab-admin-service-account.yamlkubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}') -
GitLab интерфейсінің әкімшілік бөлігіне өтіп, Add Kubernetes Cluster батырмасын басыңыз:

-
Add Existing cluster қойындысын таңдап, параметрлерді (API URL, PEM, Token) енгізіңіз де, Add Kubernetes Cluster батырмасын басыңыз:

-
deployment.yaml,service.yaml,ingress.yamlфайлдарын жобаныңdeploymentsдиректориясына жылжытыңыз. -
.gitlab-ci.ymlфайлынаdeployсекциясын қосыңыз: -
Кластердің namespace мәнін тексеріңіз:
kubectl get namespacesКоманданың күтілетін нәтижесі:
NAME STATUS AGEdefault Active 45hgitlab-managed-apps Active 67mingress-nginx Active 45hk8s-conf-demo-1-production Active 57mkube-node-lease Active 45hkube-public Active 45hkube-system Active 45hmagnum-tiller Active 45h -
k8s-conf-demo-1-productionішіндегі pod-тарды, сервистерді және ingress-ті қараңыз:kubectl get pods -n k8s-conf-demo-1-productionkubectl get services -n k8s-conf-demo-1-productionkubectl get ingress -n k8s-conf-demo-1-production -
Қосымшаның жұмысқа қабілеттілігін тексеріңіз:
ash-work:~ curl --resolve echo.com:<INGRESS_EXTERNAL_IP> http://echo.com/handlerКүтілетін нәтиже:
OK. -
Автоматты жайып орналастыруды тестілеу үшін қосымша кодын өзгертіңіз: репозиторийдегі
app/app.pyфайлындаreturn 'OK'жолынreturn 'HANDLER OK'жолына түзетіңіз. -
Өзгерістерді жариялаңыз:
k8s-conf-demo git add . && git commit -m "update" && git push -
CI/CD орындалуының аяқталуын күтіп, қосымшаның нәтижесін қайта тексеріңіз:
ash-work:~ curl --resolve echo.com:<INGRESS_EXTERNAL_IP> http://echo.com/handlerАвтоматты жайып орналастыру сәтті бапталса,
HANDLER OKхабарламасы пайда болады.