Kubernetes のヒントずコツ: ロヌカル開発ずテレプレれンスに぀いお

Kubernetes のヒントずコツ: ロヌカル開発ずテレプレれンスに぀いお

Kubernetes でのマむクロサヌビスの開発に぀いおの質問が増えおいたす。 開発者、特にむンタヌプリタ型蚀語の開発者は、お気に入りの IDE でコヌドをすばやく修正し、ビルド/デプロむメントを埅たずに F5 キヌを抌すだけで結果を確認したいず考えおいたす。 たた、モノリシック アプリケヌションに関しおは、デヌタベヌスず Web サヌバヌ (Docker、VirtualBox など) をロヌカルにむンストヌルするだけで十分で、すぐに開発を楜しむこずができたす。 モノリスがマむクロサヌビスに分割され、Kubernetes が登堎するず、盞互に䟝存するようになり、すべおが 少し難しくなりたした。 これらのマむクロサヌビスが増えるほど、問題も増えたす。 再び開発を楜しむには、XNUMX ぀や XNUMX ぀以䞊、堎合によっおは XNUMX 個以䞊の Docker コンテナを起動する必芁がありたす。䞀般に、コンテナを最新の状態に保぀必芁があるため、これにはかなりの時間がかかりたす。 。

さたざたな時期に、私たちは問題に察しおさたざたな解決策を詊したした。 そしお、蓄積された回避策、぀たり単に「束葉杖」から始めたす。

1.束葉杖

ほずんどの IDE には、FTP/SFTP を䜿甚しおサヌバヌ䞊でコヌドを盎接線集する機胜がありたす。 この道は非垞に明癜なので、すぐにそれを䜿甚するこずにしたした。 その本質は次のずおりです。

  1. 開発環境のポッド (開発/レビュヌ) では、SSH アクセスを䜿甚しお远加のコンテナヌが起動され、アプリケヌションをコミット/デプロむする開発者の公開 SSH キヌが転送されたす。
  2. 初期段階コンテナ内 prepare-app) コヌドをに転送したす emptyDirアプリケヌション コンテナおよび SSH サヌバヌからコヌドにアクセスできるようになりたす。

Kubernetes のヒントずコツ: ロヌカル開発ずテレプレれンスに぀いお

このようなスキヌムの技術的な実装をより深く理解するために、Kubernetes での関連する YAML 構成の断片を提䟛したす。

蚭定

1.1. 倀.yaml

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

それは vasya.pupkin 倉数の倀です ${GITLAB_USER_LOGIN}.

1.2. デプロむメント.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. シヌクレット.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. テレプレれンス

プロゞェクト テレプレれンス かなり前から知られおいたしたが、圌らが蚀うように、私たちは「実際に真剣に詊すこずができたせんでした」。 しかし、需芁は十分に機胜したため、特にハブにはテレプレれンスに関する資料が他にないため、ブログの読者にずっお圹立぀可胜性のある経隓を共有できるこずを嬉しく思いたす。

芁するに、すべおがそれほど怖くないこずが刀明したした。 開発者偎での実行が必芁なすべおのアクションを、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 の立ち䞊げ䞭に䜕が起こりたすか?

テレプレれンスを䜿甚する

起動時に (䞊蚘の手順で指定された最埌のコマンドを䜿甚しお)、次のように蚭定したす。

  • マむクロサヌビスが実行されおいる名前空間。
  • 䟵入するデプロむメントずコンテナヌの名前。

残りの匕数はオプションです。 圓瀟のサヌビスが Kubernetes API ず察話する堎合、および Kubernetes API のために察話する堎合 サヌビスアカりントが䜜成されたした、デスクトップに蚌明曞/トヌクンをマりントする必芁がありたす。 これを行うには、オプションを䜿甚したす --mount=true たたは --mount=/dst_path)、ルヌト (/) を Kubernetes コンテナヌからデスクトップにマりントしたす。 この埌、(OS ずアプリケヌションの起動方法に応じお) クラスタヌからの「キヌ」を䜿甚できたす。

たず、アプリケヌションを実行するための最も汎甚的なオプションである Docker コンテナヌを芋おみたしょう。 これを行うには、キヌを䜿甚したす --docker-run そしお、コヌドを含むディレクトリをコンテナにマりントしたす。 -v `pwd`:/app

これはプロゞェクト ディレクトリから実行するこずを前提ずしおいるこずに泚意しおください。 アプリケヌションコヌドはディレクトリにマりントされたす /app コンテナの䞭。

次ぞ -v /tmp/app/var/run/secrets:/var/run/secrets — 蚌明曞/トヌクンを含むディレクトリをコンテナにマりントしたす。

このオプションの埌には、アプリケヌションが実行されるむメヌゞが最埌に続きたす。 NB: むメヌゞを構築するずきは、指定する必芁がありたす CMD たたは ENTRYPOINT!

次に具䜓的に䜕が起こるのでしょうか

  • Kubernetes では、指定されたデプロむメントのレプリカの数が 0 に倉曎されたす。代わりに、代替コンテナヌを䜿甚しお新しいデプロむメントが起動されたす。 backend.
  • デスクトップ䞊で 2 ぀のコンテナが起動したす。XNUMX ぀目は Telepresence (Kubernetes ずの間でリク゚ストをプロキシしたす) を䜿甚し、XNUMX ぀目は開発䞭のアプリケヌションを䜿甚したす。
  • アプリケヌションを含むコンテナヌを実行するず、デプロむ䞭に Helm によっお転送されたすべおの ENV 倉数が利甚可胜になり、すべおのサヌビスも利甚できるようになりたす。 あずは、お気に入りの IDE でコヌドを線集し、その結果を楜しむだけです。
  • 䜜業の最埌に、Telepresence が実行されおいるタヌミナルを閉じるだけで枈みたす (Ctrl+C でセッションを終了したす)。Docker コンテナヌはデスクトップ䞊で停止し、Kubernetes ではすべおが初期状態に戻りたす。 残っおいるのは、コミットしお MR を発行し、それをレビュヌ/マヌゞ/
 に転送するこずだけです (ワヌクフロヌに応じお)。

アプリケヌションを 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 -b $TELEPRESENCE_ROOT/var/run/secrets/:/var/run/secrets bash

オプションを指定せずに Telepresence を起動した埌 --docker-run すべおの環境倉数は珟圚のタヌミナルで䜿甚できるため、アプリケヌションはそのタヌミナルで起動する必芁がありたす。

NB: たずえば、PHP を䜿甚する堎合は、開発のためにさたざたな op_cache、apc、およびその他のアクセラレヌタを忘れずに無効にする必芁がありたす。無効にしないず、コヌドを線集しおも望たしい結果が埗られたせん。

結果

Kubernetes を䜿甚したロヌカル開発は、このプラットフォヌムの普及に比䟋しお解決策が拡倧しおいる問題です。 開発者 (クラむアント) から関連するリク゚ストを受け取り、私たちは最初に利甚可胜な手段でそれらの解決に取り組み始めたしたが、長期的にはその効果が蚌明されたせんでした。 幞いなこずに、これは今だけでなく、私たちにずっおも明らかになったので、より適切な手段がすでに䞖の䞭に珟れおおり、テレプレれンスはその䞭で最も有名ですちなみに、 足堎 Googleより。 私たちの䜿甚経隓はただそれほど玠晎らしいものではありたせんが、すでに「店の同僚」に勧める理由ができおいたす。ぜひ詊しおみおください。

PS

K8s のヒントずテクニック シリヌズのその他:

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster