Tip & trik Kubernetes: ngeunaan pangwangunan lokal sareng Telepresence

Tip & trik Kubernetes: ngeunaan pangwangunan lokal sareng Telepresence

Kami beuki ditaroskeun ngeunaan ngembangkeun microservices di Kubernetes. Pamekar, khususna basa anu diinterpretasi, hoyong gancang ngabenerkeun kode dina IDE karesepna sareng ningali hasilna tanpa ngantosan ngawangun / nyebarkeun - ku ngan saukur mencét F5. Sarta lamun datang ka aplikasi monolithic, éta cukup pikeun lokal install database na web server (dina Docker, VirtualBox ...), lajeng langsung ngarasakeun ngembangkeun. Kalayan motong monoliths kana microservices sareng datangna Kubernetes, kalayan munculna katergantungan dina unggal anu sanés, sadayana eta ngagaduhan saeutik leuwih hese. Beuki microservices ieu, beuki masalah. Pikeun mikaresep pangwangunan deui, anjeun kedah naékkeun langkung ti hiji atanapi dua wadah Docker, sareng sakapeung langkung ti belasan ... Sacara umum, sadayana ieu tiasa nyandak waktos anu lami, sabab éta ogé kedah diropéa. .

Dina waktos anu béda kami nyobian solusi anu béda pikeun masalah éta. Sareng kuring bakal ngamimitian ku workarounds akumulasi atanapi ngan saukur "crutches".

1. Kruk

Kaseueuran IDE gaduh kamampuan pikeun ngédit kode langsung dina server nganggo FTP / SFTP. Jalur ieu atra pisan sareng urang langsung mutuskeun pikeun ngagunakeunana. Intina nya éta di handap ieu:

  1. Dina pod lingkungan ngembangkeun (dev / review), hiji wadah tambahan dibuka kalawan aksés SSH tur diteruskeun konci SSH publik pamekar anu bakal komitmen / nyebarkeun aplikasi.
  2. Dina tahap init (dina wadahna prepare-app) mindahkeun kode ka emptyDirgaduh aksés kana kode tina peti aplikasi sareng server SSH.

Tip & trik Kubernetes: ngeunaan pangwangunan lokal sareng Telepresence

Pikeun langkung ngartos palaksanaan téknis tina skéma sapertos kitu, kuring bakal nyayogikeun fragmen konfigurasi YAML anu aub dina Kubernetes.

Konfigurasi

1.1. nilai.yaml

ssh_pub_key:
  vasya.pupkin: <ssh public key in base64> 

Ieu téh vasya.pupkin nyaeta nilai variabel ${GITLAB_USER_LOGIN}.

1.2. deployment.yaml

...
{{ if eq .Values.global.debug "yes" }}
      volumes:
      - name: ssh-pub-key
        secret:
          defaultMode: 0600
          secretName: {{ .Chart.Name }}-ssh-pub-key
      - name: app-data
        emptyDir: {}
      initContainers:
      - name: prepare-app
{{ tuple "backend" . | include "werf_container_image" | indent 8 }}
        volumeMounts:
        - name: app-data
          mountPath: /app-data
        command: ["bash", "-c", "cp -ar /app/* /app-data/" ]
{{ end }}
      containers:
{{ if eq .Values.global.debug "yes" }}
      - name: ssh
        image: corbinu/ssh-server
        volumeMounts:
        - name: ssh-pub-key
          readOnly: true
          mountPath: /root/.ssh/authorized_keys
          subPath: authorized_keys
        - name: app-data
          mountPath: /app
        ports:
        - name: ssh
          containerPort: 22
          protocol: TCP
{{ end }}
      - name: backend
        volumeMounts:
{{ if eq .Values.global.debug "yes" }}
        - name: app-data
          mountPath: /app
{{ end }}
        command: ["/usr/sbin/php-fpm7.2", "--fpm-config", "/etc/php/7.2/php-fpm.conf", "-F"]
...

1.3. rusiah.yaml

{{ if eq .Values.global.debug "yes" }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .Chart.Name }}-ssh-pub-key
type: Opaque
data:
  authorized_keys: "{{ first (pluck .Values.global.username .Values.ssh_pub_key) }}"
{{ end }}

touch ahir

Saatos éta sadayana anu tetep nyaéta mindahkeun variabel gitlab-ci.yml diperlukeun:

dev:
  stage: deploy
  script:
   - type multiwerf && source <(multiwerf use 1.0 beta)
   - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
   - werf deploy
     --namespace ${CI_PROJECT_NAME}-stage
     --set "global.env=stage"
     --set "global.git_rev=${CI_COMMIT_SHA}"
     --set "global.debug=yes"
     --set "global.username=${GITLAB_USER_LOGIN}"
 tags:
   - build

Voila: pamekar anu ngaluncurkeun panyebaran tiasa nyambung ku nami jasa (kumaha carana masihan aksés ka kluster sacara aman, kami geus bébéja) ti desktop Anjeun via SFTP tur edit kode tanpa ngantosan eta dikirimkeun ka klaster.

Ieu mangrupikeun solusi anu lengkep, tapi tina sudut pandang palaksanaan éta ngagaduhan kalemahan anu jelas:

  • kudu nyaring bagan Helm, nu ngajadikeun hésé maca dina mangsa nu bakal datang;
  • ngan bisa dipaké ku jalma anu deployed jasa;
  • anjeun kedah émut teras nyinkronkeunana sareng diréktori lokal sareng kode sareng komitmen ka Git.

2. Telepresence

proyek telepresence geus dipikawanoh pikeun rada lila, tapi urang, sabab nyebutkeun, "teu meunang sabudeureun pikeun serius nyobian eta dina prakna." Nanging, paménta parantos ngalaksanakeun tugasna sareng ayeuna kami resep ngabagi pangalaman, anu tiasa mangpaat pikeun pamiarsa blog urang - khususna saprak teu aya bahan sanés ngeunaan Telepresence dina hub.

Pondokna, sagalana tétéla teu jadi pikasieuneun. Urang nempatkeun sagala lampah anu merlukeun palaksanaan dina bagian tina pamekar dina file téks bagan Helm disebut NOTES.txt. Janten, saatos nyebarkeun jasa ka Kubernetes, pamekar ningali petunjuk pikeun ngaluncurkeun lingkungan dev lokal dina log padamelan GitLab:

!!! Разработка сервиса локально, в составе Kubernetes !!!

* Настройка окружения
* * Должен быть доступ до кластера через VPN
* * На локальном ПК установлен kubectl ( https://kubernetes.io/docs/tasks/tools/install-kubectl/ )
* * Получить config-файл для kubectl (скопировать в ~/.kube/config)
* * На локальном ПК установлен telepresence ( https://www.telepresence.io/reference/install )
* * Должен быть установлен Docker
* * Необходим доступ уровня reporter или выше к репозиторию https://gitlab.site.com/group/app
* * Необходимо залогинится в registry с логином/паролем от GitLab (делается один раз):

#########################################################################
docker login registry.site.com
#########################################################################

* Запуск окружения

#########################################################################
telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name  }}:backend --mount=/tmp/app --docker-run -v `pwd`:/app -v /tmp/app/var/run/secrets:/var/run/secrets -ti registry.site.com/group/app/backend:v8
#########################################################################

Kami moal cicing di jéntré dina léngkah anu dijelaskeun dina paréntah ieu ... iwal ti anu terakhir. Naon anu lumangsung nalika peluncuran Telepresence?

Gawe sareng Telepresence

Dina ngamimitian (ngagunakeun paréntah terakhir anu dijelaskeun dina paréntah di luhur), urang nyetél:

  • namespace dimana microservice ngajalankeun;
  • ngaran deployment jeung wadah kami rék nembus.

Argumen sésana mangrupa pilihan. Upami jasa kami berinteraksi sareng sareng pikeun API Kubernetes ServiceAccount dijieun, urang kudu masang sertipikat/token dina desktop urang. Jang ngalampahkeun ieu, make pilihan --mount=true (atawa --mount=/dst_path), anu bakal masang akar (/) tina wadahna Kubernetes kana desktop urang. Saatos ieu, urang tiasa (gumantung kana OS sareng kumaha aplikasi diluncurkeun) nganggo "konci" tina kluster.

Mimiti, hayu urang tingali pilihan anu paling universal pikeun ngajalankeun aplikasi - dina wadah Docker. Jang ngalampahkeun ieu kami bakal ngagunakeun konci --docker-run sareng pasang diréktori sareng kode kana wadahna: -v `pwd`:/app

Punten dicatet yén ieu nganggap jalan tina diréktori proyék. Kode aplikasi bakal dipasang dina diréktori /app dina hiji wadah.

salajengna: -v /tmp/app/var/run/secrets:/var/run/secrets - pikeun masang diréktori sareng sertipikat / token kana wadahna.

Pilihan ieu tungtungna dituturkeun ku gambar dimana aplikasi bakal dijalankeun. NB: Nalika ngawangun hiji gambar, anjeun kudu nangtukeun CMD atawa ENTRYPOINT!

Naon kahayang bakal kajadian salajengna?

  • Dina Kubernetes, pikeun Deployment anu ditangtukeun, jumlah réplika bakal dirobih janten 0. Gantina, Deployment énggal bakal diluncurkeun - kalayan wadah anu diganti. backend.
  • 2 wadahna bakal diluncurkeun dina desktop: anu kahiji sareng Telepresence (bakal pamundut proxy ti / ka Kubernetes), anu kadua sareng aplikasi anu dikembangkeun.
  • Lamun urang exec kana wadahna kalawan aplikasi, lajeng sagala variabel ENV ditransfer ku Helm salila deployment bakal sadia pikeun urang, sarta sakabeh jasa ogé bakal sadia. Sadaya anu tetep nyaéta ngédit kodeu dina IDE karesep anjeun sareng nikmati hasilna.
  • Dina ahir pagawéan, anjeun ngan ukur kedah nutup terminal dimana Telepresence dijalankeun (tungtung sési nganggo Ctrl + C) - wadah Docker bakal lirén dina desktop, sareng dina Kubernetes sadayana bakal balik deui ka kaayaan awalna. Sadaya anu tetep nyaéta komitmen, ngaluarkeun MR sareng mindahkeun ka marios / ngagabung /… (gumantung kana alur kerja anjeun).

Upami urang henteu hoyong ngajalankeun aplikasi dina wadah Docker - contona, urang henteu ngembangkeun dina PHP, tapi di Go, sareng tetep ngawangun sacara lokal - ngaluncurkeun Telepresence bakal langkung saderhana:

telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name  }}:backend --mount=true

Upami aplikasi ngaksés API Kubernetes, anjeun kedah masang diréktori konci (https://www.telepresence.io/howto/volumes). Aya utilitas pikeun Linux akar:

proot -b $TELEPRESENCE_ROOT/var/run/secrets/:/var/run/secrets bash

Saatos launching Telepresence tanpa pilihan --docker-run sadaya variabel lingkungan bakal sayogi dina terminal ayeuna, janten aplikasina kedah diluncurkeun di dinya.

NB: Lamun ngagunakeun, contona, PHP, Anjeun kudu inget nganonaktipkeun rupa op_cache, apc na akselerator séjén pikeun ngembangkeun - disebutkeun ngédit kode moal ngakibatkeun hasil nu dipikahoyong.

hasil

Pangwangunan lokal sareng Kubernetes mangrupikeun masalah anu solusina ningkat saimbang sareng panyebaran platform ieu. Narima requests relevan ti pamekar (ti klien kami), urang mimitian ngajawab aranjeunna kalayan hartosna sadia munggaran, nu, kumaha oge, teu ngabuktikeun diri leuwih haul panjang. Untungna, ieu geus jadi atra teu ngan ayeuna jeung teu ukur keur urang, jadi sarana leuwih merenah geus mucunghul di dunya, sarta Telepresence - nu kawentar di antarana (ku jalan kitu, aya ogé). skaffold ti Google). Pangalaman kami ngagunakeun éta henteu acan saé, tapi éta parantos masihan kami alesan pikeun nyarankeun ka "rekan-rekan di toko" kami - cobian!

PS

Séjén ti séri tip & trik K8s:

sumber: www.habr.com

Tambahkeun komentar