αž‚αž“αŸ’αž›αžΉαŸ‡ αž“αž·αž„αž›αŸ’αž”αž·αž… KubernetesαŸ– αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ αž“αž·αž„ Telepresence

αž‚αž“αŸ’αž›αžΉαŸ‡ αž“αž·αž„αž›αŸ’αž”αž·αž… KubernetesαŸ– αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ αž“αž·αž„ Telepresence

αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‚αŸβ€‹αžŸαž½αžšβ€‹αž€αžΆαž“αŸ‹β€‹αžαŸ‚β€‹αžαŸ’αž›αžΆαŸ†αž„β€‹αž‘αžΎαž„β€‹αž’αŸ†αž–αžΈβ€‹αž€αžΆαžšβ€‹αž’αž—αž·αžœαžŒαŸ’αžβ€‹αžŸαŸαžœαžΆβ€‹αž˜αžΈαž€αŸ’αžšαžΌβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„ KubernetesαŸ” αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž‡αžΆαž–αž·αžŸαŸαžŸαž—αžΆαžŸαžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αž€αž”αŸ’αžšαŸ‚αž…αž„αŸ‹αž€αŸ‚αž€αžΌαžŠαž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαž“αŸ…αž€αŸ’αž“αž»αž„ IDE αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž…αžΌαž›αž…αž·αžαŸ’αž αž αžΎαž™αžƒαžΎαž‰αž›αž‘αŸ’αž’αž•αž›αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆ/αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ„αŸ‡αž‘αŸ αžŠαŸ„αž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž…αž»αž… F5αŸ” αž αžΎαž™αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαž˜αž€αžŠαž›αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ monolithic αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰ (αž“αŸ…αž€αŸ’αž“αž»αž„ Docker, VirtualBox...) αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžšαžΈαž€αžšαžΆαž™αž“αžΉαž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž—αŸ’αž›αžΆαž˜αŸ—αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αžΆαžαŸ‹ monoliths αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ microservices αž“αž·αž„αž€αžΆαžšαž˜αž€αžŠαž›αŸ‹αž“αŸƒ Kubernetes αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžšαžΌαž”αžšαžΆαž„αž“αŸƒαž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€ αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„ αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž–αž·αž”αžΆαž€αž”αž“αŸ’αžαž·αž…. αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“ αž”αž‰αŸ’αž αžΆαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžšαžΈαž€αžšαžΆαž™αž“αžΉαž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž˜αŸ’αžαž„αž‘αŸ€αž αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž›αžΎαž€αž’αž»αž„ Docker αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž˜αž½αž™ αž¬αž–αžΈαžš αž αžΎαž™αž‡αž½αž“αž€αžΆαž›αž›αžΎαžŸαž–αžΈαžŠαž”αŸ‹αž˜αž½αž™... αž‡αžΆαž‘αžΌαž‘αŸ… αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž’αžΆαž…αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž…αŸ’αžšαžΎαž“αžŽαžΆαžŸαŸ‹ αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž€αŸαžαŸ’αžšαžΌαžœαžšαž€αŸ’αžŸαžΆαž±αŸ’αž™αž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™αž•αž„αžŠαŸ‚αžšαŸ” .

αž“αŸ…β€‹αž–αŸαž›β€‹αž•αŸ’αžŸαŸαž„β€‹αž‚αŸ’αž“αžΆ αž™αžΎαž„β€‹αž”αžΆαž“β€‹αž–αŸ’αž™αžΆαž™αžΆαž˜β€‹αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž•αŸ’αžŸαŸαž„β€‹αž‚αŸ’αž“αžΆβ€‹αž…αŸ†αž–αŸ„αŸ‡β€‹αž”αž‰αŸ’αž αžΆαŸ” αž αžΎαž™β€‹αžαŸ’αž‰αž»αŸ†β€‹αž“αžΉαž„β€‹αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžαžΎαž˜β€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž€αžΆαžšβ€‹αžŠαŸ„αŸ‡β€‹αžŸαŸ’αžšαžΆαž™β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αŸ’αžšαž˜αžΌαž›β€‹αž•αŸ’αžαž»αŸ†β€‹αž¬β€‹αž‡αžΆβ€‹αžŸαžΆαž˜αž‰αŸ’αž‰β€‹αž‘αŸ…β€‹αž“αžΉαž„ "αžˆαžΎαž…αŸ’αžšαžαŸ‹"αŸ”

1. αžˆαžΎαž…αŸ’αžšαžαŸ‹

IDE αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αžΌαžŠαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ„αž™αž”αŸ’αžšαžΎ FTP/SFTP αŸ” αž•αŸ’αž›αžΌαžœαž“αŸαŸ‡αž‚αžΊαž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹ αž αžΎαž™αž™αžΎαž„αž€αŸαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αŸ’αžšαžΎαžœαžΆαž—αŸ’αž›αžΆαž˜αŸ—αŸ” αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  1. αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž”αžšαž·αžŸαŸ’αžαžΆαž“αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ (dev/review) αž€αž»αž„αžαžΊαž“αŸαžšαž”αž“αŸ’αžαŸ‚αž˜αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ SSH αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž“αžΌαžœ SSH key αžŸαžΆαž’αžΆαžšαžŽαŸˆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžŠαŸ‚αž›αž“αžΉαž„αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αž/αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”
  2. αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαŸ†αž”αžΌαž„ (αž“αŸ…αž€αŸ’αž“αž»αž„αž’αž»αž„ prepare-app) αž•αŸ’αž‘αŸαžšαž›αŸαžαž€αžΌαžŠαž‘αŸ… emptyDirαžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαž€αžΌαžŠαž–αžΈαž’αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ SSH αŸ”

αž‚αž“αŸ’αž›αžΉαŸ‡ αž“αž·αž„αž›αŸ’αž”αž·αž… KubernetesαŸ– αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ αž“αž·αž„ Telepresence

αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαž“αŸƒαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž”αŸ‚αž”αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž”αŸ†αžŽαŸ‚αž€αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ YAML αžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’

៑.៑. values.yaml

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

αžœαžΆαž‚αžΊαž‡αžΆαž€αžΆαžš vasya.pupkin αž‚αžΊαž‡αžΆαžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžš ${GITLAB_USER_LOGIN}.

៑.្. 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"]
...

៑.៣. 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

VoilaαŸ– αž’αŸ’αž“αž€β€‹αž’αž—αž·αžœαžŒαŸ’αžαž“αŸβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžŠαžΎαž˜β€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž–αž„αŸ’αžšαžΆαž™β€‹αž’αžΆαž…β€‹αžαž—αŸ’αž‡αžΆαž”αŸ‹β€‹αžαžΆαž˜β€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹αžŸαŸαžœαžΆ (αžšαž”αŸ€αž”β€‹αž•αŸ’αžŠαž›αŸ‹β€‹αžŸαž·αž‘αŸ’αž’αž·β€‹αž…αžΌαž›β€‹αž”αŸ’αžšαžΎβ€‹αž…αž„αŸ’αž€αŸ„αž˜β€‹αžŠαŸ„αž™β€‹αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ” αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΆαž”αŸ‹αžšαž½αž…αž αžΎαž™) αž–αžΈαž•αŸ’αž‘αŸƒαžαž»αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžαžΆαž˜αžšαž™αŸˆ SFTP αž αžΎαž™αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αžΌαžŠαžŠαŸ„αž™αž˜αž·αž“αžšαž„αŸ‹αž…αžΆαŸ†αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž€αŸ’αžšαž»αž˜αŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αžœαžΆαž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αŸ–

  • αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ‚αž›αž˜αŸ’αž’αžαžΆαžšαžΆαž„ Helm αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αžΆαž“αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαŸ”
  • αž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“αžαŸ‚αžŠαŸ„αž™αž’αŸ’αž“αž€αžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”
  • αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αžΆαŸ†αžαžΆαž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžœαžΆαž‡αžΆαž˜αž½αž™αžαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‡αžΆαž˜αž½αž™αž€αžΌαžŠ αž αžΎαž™αž•αŸ’αž‘αŸαžšαžœαžΆαž‘αŸ… Git αŸ”

2. Telepresence

αž‚αž˜αŸ’αžšαŸ„αž„ αžαŸαž›αŸαž αŸ’αžœαŸ’αžšαŸαž“αžŸαž·αž“ αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‚αŸβ€‹αžŸαŸ’αž‚αžΆαž›αŸ‹β€‹αž‡αžΆβ€‹αž™αžΌαžšβ€‹αž˜αž€β€‹αž αžΎαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž™αžΎαž„β€‹αžŠαžΌαž…β€‹αž‡αžΆβ€‹αž–αž½αž€β€‹αž‚αŸβ€‹αž“αž·αž™αžΆαž™β€‹αžαžΆ "αž˜αž·αž“β€‹αž”αžΆαž“β€‹αž…αžΌαž›β€‹αžšαž½αž˜β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αžœαžΆβ€‹αž™αŸ‰αžΆαž„β€‹αžαŸ’αž›αžΆαŸ†αž„β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž‘αŸ"αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž”αžΆαž“αž”αŸ†αž–αŸαž‰αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž›αž½αž“ αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αž™αžΎαž„ αžŠαŸ‚αž›αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αžΆαž“αž”αŸ’αž›αž€αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„ αž‡αžΆαž–αž·αžŸαŸαžŸαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž˜αž·αž“αž‘αžΆαž“αŸ‹αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž’αŸ†αž–αžΈ Telepresence αž“αŸ…αž›αžΎαž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž“αŸ…αž‘αžΎαž™αŸ”

αžŸαžšαž»αž”αž˜αž€ αž’αŸ’αžœαžΈαŸ—αž”αžΆαž“αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž˜αž·αž“αž‚αž½αžšαž±αŸ’αž™αžαŸ’αž›αžΆαž…αž“αŸ„αŸ‡αž‘αŸαŸ” αž™αžΎαž„αž”αžΆαž“αžŠαžΆαž€αŸ‹αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž›αžΎαž•αŸ’αž“αŸ‚αž€αž“αŸƒαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘αž‚αŸ†αž“αžΌαžŸαžαžΆαž„ Helm αžŠαŸ‚αž›αž αŸ…αžαžΆ NOTES.txt. αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αŸ… Kubernetes αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžƒαžΎαž‰αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž€αžΆαžšαž„αžΆαžš 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 αžŠαŸ‚αž› microservice αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš;
  • αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž™αžΎαž„αž…αž„αŸ‹αž‡αŸ’αžšαžΆαž”αž…αžΌαž›αŸ”

αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαžŸαŸ’αžšαŸαž…αž…αž·αžαŸ’αžαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„αž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™ αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Kubernetes API αž‚αžŽαž“αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž™αžΎαž„αžαŸ’αžšαžΌαžœαž—αŸ’αž‡αžΆαž”αŸ‹αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš/αžαžΌαžαžΉαž“αž“αŸ…αž›αžΎαž•αŸ’αž‘αŸƒαžαž»αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŸαžΌαž˜αž”αŸ’αžšαžΎαž‡αž˜αŸ’αžšαžΎαžŸ --mount=true (ឬ --mount=/dst_path) αžŠαŸ‚αž›αž“αžΉαž„αž˜αŸ‰αŸ„αž“αž«αžŸ (/) αž–αžΈαž€αž»αž„αžαžΊαž“αŸαžš Kubernetes αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž‘αŸƒαžαž»αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸαŸ‡ αž™αžΎαž„αž’αžΆαž… (αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎ OS αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš) αž”αŸ’αžšαžΎ "αž€αžΌαž“αžŸαŸ„" αž–αžΈαž…αž„αŸ’αž€αŸ„αž˜αŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž‡αž˜αŸ’αžšαžΎαžŸαžŸαž€αž›αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ - αž“αŸ…αž€αŸ’αž“αž»αž„ Docker containerαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž‚αž“αŸ’αž›αžΉαŸ‡ --docker-run αž αžΎαž™αž—αŸ’αž‡αžΆαž”αŸ‹αžαžαž‡αžΆαž˜αž½αž™αž›αŸαžαž€αžΌαžŠαž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαŸ– -v `pwd`:/app

αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αžαžΆαžœαžΆαžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΈαžαžαž‚αž˜αŸ’αžšαŸ„αž„αŸ” αž›αŸαžαž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž˜αŸ‰αŸ„αž“αž“αŸ…αž€αŸ’αž“αž»αž„αžαž /app αž“αŸ…αž€αŸ’αž“αž»αž„αž’αž»αž„αž˜αž½αž™αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹: -v /tmp/app/var/run/secrets:/var/run/secrets - αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αžαžαž‡αžΆαž˜αž½αž™αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš/αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαŸ”

αž‡αž˜αŸ’αžšαžΎαžŸβ€‹αž“αŸαŸ‡β€‹αžαŸ’αžšαžΌαžœβ€‹αžαžΆαž˜β€‹αž–αžΈαž€αŸ’αžšαŸ„αž™β€‹αžŠαŸ„αž™β€‹αžšαžΌαž”αž—αžΆαž–β€‹αžŠαŸ‚αž›β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž“αžΉαž„β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” NBαŸ– αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ CMD ឬ ENTRYPOINT!

αžαžΎαž“αžΉαž„αž˜αžΆαž“αž’αŸ’αžœαžΈαž€αžΎαžαž‘αžΎαž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‘αŸ€αž?

  • αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžαžΌαžšαž‘αŸ…αž‡αžΆ 0αŸ” αž‡αŸ†αž“αž½αžŸαž˜αž€αžœαž·αž‰ αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž˜αžΈαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš - αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž»αž„αžαžΊαž“αŸαžšαž‡αŸ†αž“αž½αžŸ backend.
  • αž’αž»αž„ 2 αž“αžΉαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž•αŸ’αž‘αŸƒαžαž»αŸ– αž‘αžΈαž˜αž½αž™αž‡αžΆαž˜αž½αž™ Telepresence (αžœαžΆαž“αžΉαž„αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈαž–αžΈ/αž‘αŸ… Kubernetes) αž‘αžΈαž–αžΈαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ”
  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αŸ„αŸ‡αž’αžαŸαžš ENV αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸαžšαžŠαŸ„αž™ Helm αž€αŸ†αž‘αž»αž„αž–αŸαž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αžΉαž„αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž™αžΎαž„ αž αžΎαž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸαž“αžΉαž„αž˜αžΆαž“αž•αž„αžŠαŸ‚αžšαŸ” αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αžΌαžŠαž“αŸ…αž€αŸ’αž“αž»αž„ IDE αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αžΌαž›αž…αž·αžαŸ’αž αž αžΎαž™αžšαžΈαž€αžšαžΆαž™αž“αžΉαž„αž›αž‘αŸ’αž’αž•αž›αŸ”
  • αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž€αžΆαžšαž„αžΆαžš αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž”αž·αž‘αžŸαŸ’αžαžΆαž“αžΈαž™αžŠαŸ‚αž› Telepresence αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš (αž”αž‰αŸ’αž…αž”αŸ‹αžœαž‚αŸ’αž‚αžŠαŸ„αž™αž”αŸ’αžšαžΎ Ctrl+C) - Docker containers αž“αžΉαž„αžˆαž”αŸ‹αž“αŸ…αž›αžΎαž•αŸ’αž‘αŸƒαžαž» αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes αž’αŸ’αžœαžΈαŸ—αž“αžΉαž„αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αžŸαž—αžΆαž–αžŠαžΎαž˜αžœαž·αž‰αŸ” αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž…αŸαž‰ MR αž αžΎαž™αž•αŸ’αž‘αŸαžšαžœαžΆαž‘αŸ…αž–αž·αž“αž·αžαŸ’αž™/αž”αž‰αŸ’αž…αžΌαž›/… (αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž›αŸ†αž αžΌαžšαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€)αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž˜αž·αž“αž…αž„αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ Docker container - αž§αž‘αžΆαž αžšαžŽαŸ αž™αžΎαž„αž’αž—αž·αžœαžŒαŸ’αžαž˜αž·αž“αž˜αŸ‚αž“αž“αŸ…αž€αŸ’αž“αž»αž„ PHP αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„ Go αž αžΎαž™αž“αŸ…αžαŸ‚αž”αž„αŸ’αž€αžΎαžαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ - αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Telepresence αž“αžΉαž„αž€αžΆαž“αŸ‹αžαŸ‚αžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž„αž˜αž»αž“αŸ–

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

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αžΌαž›αž”αŸ’αžšαžΎ Kubernetes API αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž—αŸ’αž‡αžΆαž”αŸ‹αžαžαžŸαŸ„ (https://www.telepresence.io/howto/volumes)αŸ” αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αžΈαž“αž»αž… ឫស:

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

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Telepresence αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸ --docker-run αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αžΈαž™αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαžαŸ‚αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ”

NBαŸ– αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸ PHP αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž…αž„αž…αžΆαŸ†αžŠαžΎαž˜αŸ’αž”αžΈαž”αž·αž‘ op_cache, apc αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž•αŸ’αžŸαŸαž„αŸ—αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ - αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸαž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αžΌαžŠαž“αžΉαž„αž˜αž·αž“αž“αžΆαŸ†αž‘αŸ…αžšαž€αž›αž‘αŸ’αž’αž•αž›αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αž‘αŸαŸ”

αž›αž‘αŸ’αž’αž•αž›

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αž‡αžΆαž˜αž½αž™ Kubernetes αž‚αžΊαž‡αžΆαž”αž‰αŸ’αž αžΆαžŠαŸ‚αž›αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αŸ†αž–αž»αž„αž€αžΎαž“αž‘αžΎαž„αžŸαž˜αžΆαž˜αžΆαžαŸ’αžšαž‘αŸ…αž“αžΉαž„αž€αžΆαžšαžšαžΈαž€αžšαžΆαž›αžŠαžΆαž›αž“αŸƒαžœαŸαž‘αž·αž€αžΆαž“αŸαŸ‡αŸ” αžŠαŸ„αž™αž‘αž‘αž½αž›αž”αžΆαž“αžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž–αžΈαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ (αž–αžΈαž’αžαž·αžαž·αž‡αž“αžšαž”αžŸαŸ‹αž™αžΎαž„) αž™αžΎαž„αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŠαŸ‚αž›αž’αžΆαž…αžšαž€αž”αžΆαž“αžŠαŸ†αž”αžΌαž„ αžŠαŸ‚αž›αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆ αžœαžΆαž˜αž·αž“αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž±αŸ’αž™αžƒαžΎαž‰αž–αžΈαžαŸ’αž›αž½αž“αž―αž„αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž™αžΌαžšαž“αŸ„αŸ‡αž‘αŸαŸ” αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž“αŸαŸ‡αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž“αž·αž„αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŠαŸ‚αž›αžŸαž˜αžšαž˜αŸ’αž™αž‡αžΆαž„αž“αŸαŸ‡ αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž·αž—αž–αž›αŸ„αž€αžšαž½αž…αž αžΎαž™ αž αžΎαž™ Telepresence αž‚αžΊαž›αŸ’αž”αžΈαž›αŸ’αž”αžΆαž‰αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸ (αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž€αŸαž˜αžΆαž“αž•αž„αžŠαŸ‚αžš skaffold αž–αžΈ Google) αŸ” αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžœαžΆαž˜αž·αž“αž‘αžΆαž“αŸ‹αž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αž“αŸ…αž‘αžΎαž™αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž•αŸ’αžαž›αŸ‹αž αŸαžαž»αž•αž›αžŠαž›αŸ‹αž™αžΎαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžœαžΆαžŠαž›αŸ‹ "αž˜αž·αžαŸ’αžαžšαž½αž˜αž€αžΆαžšαž„αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž αžΆαž„" αžšαž”αžŸαŸ‹αž™αžΎαž„ - αžŸαžΆαž€αž›αŸ’αž”αž„αžœαžΆ!

PS

αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž–αžΈαžŸαŸŠαŸαžšαžΈαž‚αž“αŸ’αž›αžΉαŸ‡ αž“αž·αž„αž›αŸ’αž”αž·αž… K8sαŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹