VK Cloud logo

Қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды баптау

Бұл мақалада қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды қалай баптау керектігі сипатталған. Мысалда келесі жабдық пайдаланылады:

Дайындық қадамдары

  1. Docker-ды орнатып, баптаңыз.
  2. GitLab-ты орнатып, баптаңыз.
  3. Harbor-ды орнатып, баптаңыз.

1. GitLab-runner-ді баптаңыз

  1. GitLab веб-интерфейсіне әкімші құқықтарымен авторизациялаңыз:

    Қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды баптау

  2. 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 веб-интерфейсте көрсетіледі:

    Қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды баптау

  3. Орындау ортасының айнымалыларын баптаңыз:

    1. SettingsCI/CD бөліміне өтіңіз.

    2. Variables блогында Expand батырмасын басыңыз:

    3. .gitlab-ci.yml автожинау файлында пайдаланылатын айнымалыларды орнатыңыз:

      • DOCKER_USER — Harbor-дағы репозиторийге қол жеткізуге арналған пайдаланушы. Біздің мысалда — k8s.
      • DOCKER_PASSWORD — Harbor-да пайдаланушыны жасау кезінде енгізген k8s пайдаланушысының құпиясөзі. Айнымалы үшін Masked опциясын белгілеңіз — соның арқасында сценарийде айнымалы мәтінін шығаруға әрекет жасалғанда ол бүркемеленеді және құпиясөз көрінбейді.
      • DOCKER_REGISTRY — Harbor орналасқан хост атауы. Біздің мысалда — <SERVER_DNS_NAME>.

2. Автожинау файлын баптаңыз

  1. Жүктеп алынған репозиторийі бар директорияға өтіп, келесі мазмұндағы .gitlab-ci.yml файлын жасаңыз:

  2. Жасалған файлды репозиторийге жүктеңіз:

    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.git   7c91eab..55dd5fa  master -> master

    .gitlab-ci.yml файлы репозиторийде пайда болған бойда, GitLab оның жинағын автоматты түрде іске қосады.

  3. Жинақтың аяқталуын күтіңіз.

  4. (Опционалды) Harbor-да жиналған образдың бар-жоғын тексеріңіз:

    Қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды баптау

3. Жергілікті қосымшаны Kubernetes кластерінде жайып орналастырыңыз

  1. VK Cloud-та Kubernetes кластерін жасаңыз.

  2. kubectl көмегімен кластерге қосылыңыз.

  3. Кластерге Harbor образдар репозиторийіне қол жеткізу құқықтарын беріңіз:

    1. <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>
    1. Secret сәтті жасалғанына көз жеткізіңіз:
    ash-work:~ kubectl get secret myprivateregistry --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
  4. deployment.yml қосымша файлын жасаңыз:

  5. Қосымшаны іске қосыңыз:

    kubectl create -f deployment.yaml
  6. Біраз уақыттан кейін контейнердің көтерілгеніне көз жеткізіңіз:

    kubectl get pods

    Ұқсас ақпарат көрсетілуі керек:

    NAME READY STATUS RESTARTS AGE myapp-deployment-66d55bcbd5-s86m6   1/1     Running   0          39s
  7. service.yml файлын жасаңыз:

  8. Сервисті жасаңыз:

    kubectl create -f service.yaml
  9. Қосымшаға сыртқы желіден қолжетімділікті қамтамасыз ету үшін ingress-контроллерді баптаңыз. Ол үшін ingress.yaml файлын жасаңыз:

  10. Ingress-контроллерді қолданыңыз:

    kubectl create -f ingress.yaml
  11. Ingress-контроллердің күйін қараңыз:

    kubectl describe ingress myapp-ingress

    Команданың күтілетін нәтижесі:

    Name: myapp-ingress Namespace: default Address: 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-ingress   Normal  UPDATE  5s    nginx-ingress-controller  Ingress default/myapp-ingress
  12. Қосымшаның жұмысын тексеріңіз. Ingress-контроллермен байланыстырылған сыртқы IP-мекенжайды кластер бетінде көруге болады. Ол Ingress Controller үшін жүктеме теңгергішінің IP-мекенжайы деп аталады. Оны <INGRESS_EXTERNAL_IP> деп белгілейік.

    ash-work:~ curl --resolve echo.com:80:<INGRESS_EXTERNAL_IP> http://echo.com/handler
  13. (Опционалды) Кластерде жасалған сервистерді жойыңыз:

    ash-work:~ kubectl delete -f ingress.yamlash-work:~ kubectl delete -f service.yamlash-work:~ kubectl delete -f deployment.yaml

4. Қосымшаны Kubernetes кластерінде GitLab CI/CD пайдаланып жайып орналастырыңыз

GitLab әдепкі бойынша Kubernetes кластерімен интеграцияны қолдайды. Интеграцияны баптау үшін кластердің бірнеше параметрін алыңыз:

  1. API URL алыңыз:

    ash-work:~ kubectl cluster-info | grep 'Kubernetes master' | awk '/http/ {print $NF}'
  2. Кластер 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
  3. default-token secret-інің PEM сертификатын алыңыз:

    kubectl get secret default-token-fhvxq -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
  4. GitLab-тың кластерге қол жеткізу құқықтарын сипаттайтын gitlab-admin-service-account.yaml файлын жасаңыз.

  5. Құқықтарды қолданыңыз және кластерге қол жеткізу токенін алыңыз:

    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}')
  6. GitLab интерфейсінің әкімшілік бөлігіне өтіп, Add Kubernetes Cluster батырмасын басыңыз:

    Қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды баптау

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

    Қосымшаны Kubernetes кластеріне автоматты түрде жайып орналастыруды баптау

  8. deployment.yaml, service.yaml, ingress.yaml файлдарын жобаның deployments директориясына жылжытыңыз.

  9. .gitlab-ci.yml файлына deploy секциясын қосыңыз:

  10. Кластердің 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
  11. 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
  12. Қосымшаның жұмысқа қабілеттілігін тексеріңіз:

    ash-work:~ curl --resolve echo.com:<INGRESS_EXTERNAL_IP> http://echo.com/handler

    Күтілетін нәтиже: OK.

  13. Автоматты жайып орналастыруды тестілеу үшін қосымша кодын өзгертіңіз: репозиторийдегі app/app.py файлында return 'OK' жолын return 'HANDLER OK' жолына түзетіңіз.

  14. Өзгерістерді жариялаңыз:

    k8s-conf-demo git add . && git commit -m "update" && git push
  15. CI/CD орындалуының аяқталуын күтіп, қосымшаның нәтижесін қайта тексеріңіз:

    ash-work:~ curl --resolve echo.com:<INGRESS_EXTERNAL_IP> http://echo.com/handler

    Автоматты жайып орналастыру сәтті бапталса, HANDLER OK хабарламасы пайда болады.