Kubernetes tips & tricks: ΠΎ локальной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Telepresence

Kubernetes tips & tricks: ΠΎ локальной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Telepresence

Нас всС Ρ‡Π°Ρ‰Π΅ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ микросСрвисов Π² Kubernetes. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, особСнно ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языков, хотят быстро ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π² любимой IDE ΠΈ Π±Π΅Π· оТидания сборки/дСплоя ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” ΠΏΠΎ простому Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Π½Π° F5. И ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ шла ΠΏΡ€ΠΎ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, достаточно Π±Ρ‹Π»ΠΎ локально ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²Π΅Π±-сСрвСр (Π² Docker, VirtualBox…), послС Ρ‡Π΅Π³ΠΎ β€” сразу ΠΆΠ΅ Π½Π°ΡΠ»Π°ΠΆΠ΄Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ. Π‘ распиливаниСм ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚ΠΎΠ² Π½Π° микросСрвисы ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΎΠΌ Kubernetes, с появлСниСм зависимостСй Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°, всё стало Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС. Π§Π΅ΠΌ большС этих микросСрвисов, Ρ‚Π΅ΠΌ большС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ вновь насладится Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈ Π½Π΅ Π΄Π²Π° Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π° ΠΈΠ½ΠΎΠ³Π΄Π° β€” Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΎΠ΄ΠΈΠ½ дСсяток… Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π½Π° всё это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ достаточно ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ трСбуСтся Π΅Ρ‰Ρ‘ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ состоянии.

Π’ Ρ€Π°Π·Π½ΠΎΠ΅ врСмя ΠΌΡ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. И Π½Π°Ρ‡Π½Ρƒ я с Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Ρ… workarounds ΠΈΠ»ΠΈ попросту «костылСй».

1. ΠšΠΎΡΡ‚Ρ‹Π»ΠΈ

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ IDE ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ прямо Π½Π° сСрвСрС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ FTP/SFTP. Π’Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ вСсьма ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ ΠΈ ΠΌΡ‹ сразу Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π‘ΡƒΡ‚ΡŒ Π΅Π³ΠΎ сводится ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ:

  1. Π’ pod’С Ρƒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (dev/review) запускаСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с доступом ΠΏΠΎ SSH ΠΈ пробросом ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ SSH-ΠΊΠ»ΡŽΡ‡Π° Ρ‚ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ/Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
  2. На init-стадии (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° prepare-app) пСрСносим ΠΊΠΎΠ΄ Π² emptyDir, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΊΠΎΠ΄Ρƒ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ SSH-сСрвСра.

Kubernetes tips & tricks: ΠΎ локальной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Telepresence

Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания тСхничСской Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ схСмы ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ задСйствованных YAML-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ Π² Kubernetes.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

1.1. values.yaml

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

Π—Π΄Π΅ΡΡŒ vasya.pupkin β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ${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. secret.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 }}

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡˆΡ‚Ρ€ΠΈΡ…

ПослС этого останСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ gitlab-ci.yml:

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

Вуаля: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠΈΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ сСрвиса (ΠΊΠ°ΠΊ бСзопасно Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ доступы ΠΊ кластСру, ΠΌΡ‹ ΡƒΠΆΠ΅ рассказывали) со своСго дСсктопа ΠΏΠΎ SFTP ΠΈ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π±Π΅Π· оТидания Π΅Π³ΠΎ доставки Π² кластСр.

Π­Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ минусы:

  • Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Helm-Ρ‡Π°Ρ€Ρ‚Π°, Ρ‡Ρ‚ΠΎ Π² дальнСйшСм затрудняСт Π΅Π³ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅;
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΠ» сСрвис;
  • Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с локальной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ с ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π½ΡƒΡ‚ΡŒ Π² Git.

2. Telepresence

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Telepresence извСстСн достаточно Π΄Π°Π²Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π²ΡΠ΅Ρ€ΡŒΡ‘Π· ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π΄Π΅Π»Π΅ Ρƒ нас, Ρ‡Ρ‚ΠΎ называСтся, Β«Π½Π΅ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΠ»ΠΈ Ρ€ΡƒΠΊΠΈΒ». Однако спрос сдСлал своё Π΄Π΅Π»ΠΎ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ€Π°Π΄Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ читатСлям нашСго Π±Π»ΠΎΠ³Π° β€” Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ Π½Π° Ρ…Π°Π±Ρ€Π΅ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ Π±Ρ‹Π»ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΏΡ€ΠΎ Telepresence.

Если Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅, Ρ‚ΠΎ всё оказалось Π½Π΅ Ρ‚Π°ΠΊ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ. ВсС дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ выполнСния со стороны Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΌΡ‹ размСстили Π² тСкстовом Ρ„Π°ΠΉΠ»Π΅ Helm-Ρ‡Π°Ρ€Ρ‚Π°, Π½Π°Π·Π²Π°Π½Π½ΠΎΠΌ NOTES.txt. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ послС дСплоя сСрвиса Π² Kubernetes Π²ΠΈΠ΄ΠΈΡ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ запуску локального dev-окруТСния Π² Π»ΠΎΠ³Π΅ job’а 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
#########################################################################

НС Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° описанных Π² этой инструкции ΡˆΠ°Π³Π°Ρ…β€¦ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ послСднСго. Π§Ρ‚ΠΎ ΠΆΠ΅ происходит Π²ΠΎ врСмя запуска Telepresence?

Π Π°Π±ΠΎΡ‚Π° с Telepresence

ΠŸΡ€ΠΈ стартС (ΠΏΠΎ послСднСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² инструкции Π²Ρ‹ΡˆΠ΅) ΠΌΡ‹ Π·Π°Π΄Π°Ρ‘ΠΌ:

  • пространство ΠΈΠΌΡ‘Π½ (namespace), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ микросСрвис;
  • ΠΈΠΌΠ΅Π½Π° deployment’а ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹. Если наш сСрвис взаимодСйствуСт с Kubernetes API ΠΈ для Π½Π΅Π³ΠΎ создан ServiceAccount, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСртификаты/Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π½Π° свой дСсктоп. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опция --mount=true (ΠΈΠ»ΠΈ --mount=/dst_path), которая смонтируСт ΠΊΠΎΡ€Π΅Π½ΡŒ (/) ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² Kubernetes ΠΊ Π½Π°ΠΌ Π½Π° desktop. ПослС этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ (Π² зависимости ΠΎΡ‚ ОБ ΠΈ способа запуска прилоТСния) Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Β«ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈΒ» ΠΎΡ‚ кластСра.

Π’ Π½Π°Ρ‡Π°Π»Π΅ рассмотрим самый ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ запуска прилоТСния β€” Π² Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ --docker-run ΠΈ ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ с ΠΊΠΎΠ΄ΠΎΠΌ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€: -v `pwd`:/app

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ здСсь подразумСваСтся запуск ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ. Код прилоТСния Π±ΡƒΠ΄Π΅Ρ‚ смонтирован Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ /app Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.

Π”Π°Π»Π΅Π΅: -v /tmp/app/var/run/secrets:/var/run/secrets β€” для монтирования Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с сСртификатом/Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€.

Π—Π° этой ΠΎΠΏΡ†ΠΈΠ΅ΠΉ слСдуСт, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΎΠ±Ρ€Π°Π·, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. NB: ΠŸΡ€ΠΈ сборкС ΠΎΠ±Ρ€Π°Π·Π° Π½Π°Π΄ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ CMD ΠΈΠ»ΠΈ ENTRYPOINT!

Π§Ρ‚ΠΎ ΠΆΠ΅, собствСнно, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ дальшС?

  • Π’ Kubernetes для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Deployment’а количСство Ρ€Π΅ΠΏΠ»ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° 0. ВмСсто Π½Π΅Π³ΠΎ запустится Π½ΠΎΠ²Ρ‹ΠΉ Deployment β€” с ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ backend.
  • На дСсктопС запустятся 2 ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ β€” с Telepresence (ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ проксированиС запросов ΠΈΠ·/Π² Kubernetes), Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” с Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.
  • Если execβ€™Π½ΡƒΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ Π½Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ доступны всС ENV-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Helm’ом ΠΏΡ€ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ доступны всС сСрвисы. ΠžΡΡ‚Π°Ρ‘Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π² любимой IDE ΠΈ Π½Π°ΡΠ»Π°ΠΆΠ΄Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ.
  • Π’ ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ достаточно просто Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Telepresence (ΠΎΠ±ΠΎΡ€Π²Π°Ρ‚ΡŒ сСссию ΠΏΠΎ Ctrl+C), β€” Π½Π° дСсктопС остановятся Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, Π° Π² Kubernetes всС вСрнётся Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС. ΠžΡΡ‚Π°Π½Π΅Ρ‚ΡΡ лишь ΠΊΠΎΠΌΠΌΠΈΡ‚Π½ΡƒΡ‚ΡŒ, ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ MR ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° review/merge/… (Π² зависимости ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссов).

Π’ случаС, Ссли ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π½Π΅ Π½Π° PHP, Π° Π½Π° Go, ΠΈ всё-Ρ‚Π°ΠΊΠΈ собираСм Π΅Π³ΠΎ локально, β€” запуск Telepresence Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΎΡ‰Π΅:

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

Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ обращаСтся ΠΊ Kubernetes API, потрСбуСтся ΡΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ (https://www.telepresence.io/howto/volumes). Для Linux Π΅ΡΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° proot:

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

ПослС запуска Telepresence Π±Π΅Π· ΠΎΠΏΡ†ΠΈΠΈ --docker-run всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния Π±ΡƒΠ΄ΡƒΡ‚ доступны Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, поэтому запуск прилоТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Π½Ρ‘ΠΌ.

NB: ΠŸΡ€ΠΈ использовании, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, PHP, Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ op_cache, apc ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ аксСлСраторы β€” ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠΎΠ΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ.

Π˜Ρ‚ΠΎΠ³ΠΈ

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° с Kubernetes β€” ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ растёт ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½ΠΈΡŽ этой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΠΎΠ»ΡƒΡ‡Π°Ρ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ запросы со стороны Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² (ΠΎΡ‚ Π½Π°ΡˆΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²), ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ доступными срСдствами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ Π·Π°Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΈ сСбя Π½Π° Π΄Π»ΠΈΠ½Π½ΠΎΠΉ дистанции. Π‘Π»Π°Π³ΠΎ, это стало ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСйчас ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΌ, поэтому Π² ΠΌΠΈΡ€Π΅ ΡƒΠΆΠ΅ появились Π±ΠΎΠ»Π΅Π΅ подходящиС срСдства, ΠΈ Telepresence β€” самоС извСстноС ΠΈΠ· Π½ΠΈΡ… (ΠΊ слову, Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ skaffold ΠΎΡ‚ Google). Наш ΠΎΠΏΡ‹Ρ‚ Π΅Π³ΠΎ использования Π΅Ρ‰Ρ‘ Π½Π΅ Ρ‚Π°ΠΊ Π²Π΅Π»ΠΈΠΊ, Π½ΠΎ ΡƒΠΆΠ΅ Π΄Π°Ρ‘Ρ‚ основания Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Β«ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌ ΠΏΠΎ Ρ†Π΅Ρ…ΡƒΒ» β€” ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅!

P.S.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° K8s tips & tricks:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com