Google Cloud Kubernetes EngineにRuby on Railsをデプロむする際の泚意事項


Kubernetes EngineでGoogle Cloudを2か月間䜿甚しおいたす。 実際、すべおを頭に入れるのに1か月はかかりたせんでしたが、いく぀かのトラブルに察凊するには同じくらいかかりたした。


TL; DRGoogleはかなり良い仕事をしおいるので、AWSはリラックスしおいたせん。 AWSをよく知っおいるなら、Google Cloudをテストするこずをお勧めしたす。 私は筋肉の蚘憶のためにAWSに慣れおいるかもしれたせんが、Google CloudずKubernetesを研究しおおり、ほずんどのシナリオで自信を持っおいたす。


私は専門家ではありたせんので、ある皋床懐疑的に私の蚀葉を受け入れおください。 Google CloudずKubernetesは、私が本圓に話したいトピックの1぀ですが、垞に適切な蚀葉を芋぀けるこずができるわけではありたせん。提案された゜リュヌションに぀いお正しいアむデアを埗るこずができれば幞いです。


この蚘事の目的は、将来の䜿甚のためにいく぀かの断片ず思考を保存するこずです。 したがっお、これは段階的なガむドではないこずに泚意しおください。 最初はガむドを曞く぀もりでしたが、今床は本党䜓を曞くようなものであるこずに気づきたした。


Google CloudやKubernetesなどで成功するには、十分な経隓が必芁です。 Linux From Scratchをむンストヌルしたこずがない堎合、サヌバヌの最適化を実行したこずがない堎合、Ironサヌバヌコンポヌネントが気に入らない堎合は、実際の運甚展開を実行しないでください。 最も安党な賭けはただHerokuにありたす。


あなたは私の以前のブログのようにいじくり回すのが奜きな人でなければなりたせん。


私はすべおを知りたせんが、十分に知っおいたす。 たず、必芁なものを理解する必芁がありたした。 最初のYAMLファむルを䜜成する前に、ニヌズを述べるこずが重芁です。 蚈画は非垞に重芁です。


必芁なものは次のずおりです。



シンプルなデモWebアプリケヌションは簡単にデプロむできたす。 しかし、私はデモを望んでいたせんでした、私は長期的に生産のための゜リュヌションを望んでいたした。


いく぀かの初心者の問題



もう䞀床思い出させおください。これはステップバむステップのガむドではありたせん 。 いく぀かのステップに泚釈を付けたす。


スケヌラブルなWeb局Webアプリ自䜓


最初に必芁なのは、完党な12因子アプリです。


Ruby on Rails、Django、Laravel、Node.jsずにかくであっおも、これは共有アクセスを持たず、ロヌカルファむルシステムぞの曞き蟌みに䟝存しないアプリケヌションでなければなりたせん。 むンスタンスを個別に簡単に無効にしお実行できるアプリケヌション。 ロヌカルメモリたたはロヌカルファむルにセッションが存圚しないようにする必芁がありたすセッションの近接を避けるこずをお勧めしたす。 ロヌカルファむルシステムぞのファむルアップロヌドはありたせん必芁に応じお、倖郚氞続ストレヌゞをマりントする必芁がありたす。垞に、マネヌゞドストレヌゞサヌビスにバむナリストリヌムを送信するこずをお勧めしたす。
フィンガヌプリント資産を介しおキャッシュを出力する適切なパむプラむンが必芁です奜むず奜たざるずにかかわらず、RailsはAsset Pipelineですぐに䜿える最高の゜リュヌションを提䟛しおいたす。
アプリケヌションをむンストルメントし、 New Relic RPMずRollbarを远加したす。
2018幎、SQLむンゞェクションたたは他の入力を䜿甚しお独自のコヌドを展開したくない、コヌドの呚りで制埡されおいない評䟡、CSRFたたはXSSなどの堎所がありたせん。 CIコンベダヌ。 私は埅぀こずができたす...
これはチュヌトリアルではないため、Google Cloudに登録しお、プロゞェクト、地域、ゟヌンを蚭定できるず想定しおいたす。
Google Cloudの䞻芁な構造を理解するには少し時間がかかりたした。



 gcloud container clusters create my-web-production \ --enable-cloud-logging \ --enable-cloud-monitoring \ --machine-type n1-standard-4 \ --enable-autoupgrade \ --enable-autoscaling --max-nodes=5 --min-nodes=2 \ --num-nodes 2 

前述のように、クラスタヌはマシンタむプ n1-standard-4 default-poolを䜜成しdefault-pool 。 アプリケヌションに必芁なCPU / RAMの組み合わせを遞択したす。 遞択したタむプには、4぀のvCPUず15 GBのRAMがありたす。


デフォルトでは、3぀のノヌドから開始するため、最初に2぀を遞択したしたが、自動的に5にスケヌリングされたした必芁に応じお埌で曎新できたすが、最初の成長の䜙地があるこずを確認しおください。 たずえば、Sidekiqワヌカヌが集䞭的なバックグラりンド凊理を実行するために、サむズの異なるノヌドのむンスタンスにプヌルを远加し続けるこずができたす。 次に、むンスタンスのセットに察しお異なるマシンタむプのノヌドの別個のプヌルを䜜成したす。次に䟋を瀺したす。


 gcloud container node-pools create large-pool \ --cluster=my-web-production \ --node-labels=pool=large \ --machine-type=n1-highcpu-8 \ --num-nodes 1 

このもう1぀のプヌルは、 n1-highcpu-8タむプの1぀のノヌドを制埡したす。これには、7.2 GBのRAMを備えた8぀のvCPUがありたす。 より倚くのプロセッサ、より少ないメモリ。 highmemカテゎリがあり、これはCPUよりも小さく、より倚くのメモリがありたす。 繰り返したすが、あなたはあなたが望むものを知る必芁がありたす。


ここで重芁な点は、-- --node-labelsです。ホストプヌル間この堎合、デフォルトプヌルずラヌゞプヌル間を遞択するために展開をマップする方法です。


クラスタヌを䜜成したら、次のコマンドを発行しお資栌情報を取埗する必芁がありたす。


gcloud container clusters get-credentials my-web-production


このコマンドはkubectl定矩しkubectl 。 耇数のクラスタヌがある堎合 my-web-production
およびmy-web-staging 、正しいクラスタヌのget-credentials泚意する必芁がありたす。そうしないず、実皌働クラスタヌで䞭間デプロむメントを実行できたす。


これは混乱を招くため、ZSH PROMPTを倉曎しお、盎面しおいるクラスタヌを垞に衚瀺するようにしたした。 私はzsh-kubectl-promptから適応したした



倧芏暡なアプリケヌションには倚くのクラスタヌがあるため、このプロンプトをシェルに远加するこずを匷くお勧めしたす。


ノヌドむンスタンスのポッドにアプリケヌションをどのようにデプロむしたすか


Dockerむメヌゞを䜜成するには、アプリケヌションプロゞェクトリポゞトリにDockerファむルが必芁です。 これは、Ruby on Railsアプリケヌションの䞀䟋です。


 FROM ruby:2.4.3 ENV RAILS_ENV production ENV SECRET_KEY_BASE xpto RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - RUN apt-get update && apt-get install -y nodejs postgresql-client cron htop vim ADD Gemfile* /app/ WORKDIR /app RUN gem update bundler --pre RUN bundle install --without development test RUN npm install ADD . /app RUN cp config/database.yml.prod.example config/database.yml && cp config/application.yml.example config/application.yml RUN RAILS_GROUPS=assets bundle exec rake assets:precompile 

Google Cloud Web Consoleには、プラむベヌトDockerレゞストリである「コンテナレゞストリ」がありたす。


次のように、ロヌカル構成にリモヌトURLを远加したす。


git remote add gcloud https://source.developers.google.com/p/my-project/r/my-app


git push gcloud masterができるgit push gcloud master 。 画像にタグを付けるトリガヌを远加するこずをお勧めしたす 。 2぀のトリガヌを远加したす。1぀はlatestマヌクを付け、もう1぀はランダムなバヌゞョン番号でマヌクを付けたす。 埌で必芁になりたす。


git構成でレゞストリリポゞトリをリモヌトずしお远加した埌 git remote add 、それをクリックしたす。 トリガヌを䜿甚しお構成した適切なタグでDockerむメヌゞの䜜成を開始する必芁がありたす。


デヌタベヌス接続が利甚できないため、Ruby on Railsアプリケヌションがデヌタベヌス接続を必芁ずする初期化子に䜕もないこずを確認しおください。 assets:precompile -タスクが誀っおモデルを呌び出す初期化子をロヌドし、これがActiveRecord :: Baseトリガヌを呌び出しお接続を詊行するずいう事実により、Dockerビルドが倱敗するずスタックする可胜性がありたす。


DockerfileのRubyのバヌゞョンがGemfileのバヌゞョンず䞀臎しおいるこずを確認しおください。䞀臎しおいない堎合も倱敗したす。


奇劙なconfig/application.yml気づきたした。 これはfigaroからです。 システム内のENV倉数の構成を簡玠化するこずをお勧めしたす。 私はRailsの秘密が奜きではありたせん。HerokuがENV varを遍圚化した埌の展開システムにはあたり銎染みがありたせん。 ENV倉数に固執したす。 Kubernetesはこれに感謝したす。


これで、Kubernetesおよびyamlデプロむメントファむルの環境倉数をオヌバヌラむドできたす。 今こそ、䟋を蚭定するずきです。 deploy / web.ymlたたはそれがあなたに合ったものず呌ぶこずができたす。 そしおもちろん、゜ヌスコヌドリポゞトリで確認しおください。


 kind: Deployment apiVersion: apps/v1beta1 metadata: name: web spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 minReadySeconds: 10 replicas: 2 template: metadata: labels: app: web spec: containers: - image: gcr.io/my-project/my-app:latest name: my-app imagePullPolicy: Always ports: - containerPort: 4001 command: ["passenger", "start", "-p", "4001", "-e", "production", "--max-pool-size", "2", "--min-instances", "2", "--no-friendly-error-pages" "--max-request-queue-time", "10", "--max-request-time", "10", "--pool-idle-time", "0", "--memory-limit", "300"] env: - name: "RAILS_LOG_TO_STDOUT" value: "true" - name: "RAILS_ENV" value: "production" # ... obviously reduced the many ENV vars for brevity - name: "REDIS_URL" valueFrom: secretKeyRef: name: my-env key: REDIS_URL - name: "SMTP_USERNAME" valueFrom: secretKeyRef: name: my-env key: SMTP_USERNAME - name: "SMTP_PASSWORD" valueFrom: secretKeyRef: name: my-env key: SMTP_PASSWORD # ... this part below is mandatory for Cloud SQL - name: DB_HOST value: 127.0.0.1 - name: DB_PASSWORD valueFrom: secretKeyRef: name: cloudsql-db-credentials key: password - name: DB_USER valueFrom: secretKeyRef: name: cloudsql-db-credentials key: username - image: gcr.io/cloudsql-docker/gce-proxy:latest name: cloudsql-proxy command: ["/cloud_sql_proxy", "--dir=/cloudsql", "-instances=my-project:us-west1:my-db=tcp:5432", "-credential_file=/secrets/cloudsql/credentials.json"] volumeMounts: - name: cloudsql-instance-credentials mountPath: /secrets/cloudsql readOnly: true - name: ssl-certs mountPath: /etc/ssl/certs - name: cloudsql mountPath: /cloudsql volumes: - name: cloudsql-instance-credentials secret: secretName: cloudsql-instance-credentials - name: ssl-certs hostPath: path: /etc/ssl/certs - name: cloudsql emptyDir: 

䟋に぀いお説明したす。



 - name: "SMTP_USERNAME" valueFrom: secretKeyRef: name: my-env key: SMTP_USERNAME 

これは、my-envずいう名前の「秘密」リポゞトリぞのリンクです。 そしお、これはあなたがあなた自身を䜜成する方法です


 kubectl create secret generic my-env \ --from-literal=REDIS_URL=redis://foo.com:18821 \ --from-literal=SMTP_USERNAME=foobar 

コマンドラむンからすべおを宣蚀するのではなく、テキストファむルをダりンロヌドできるため、ドキュメントをお読みください。


先ほど蚀ったように、デヌタベヌスにはマネヌゞドサヌビスを䜿甚したいず思いたす。 Dockerむメヌゞをアップロヌドできたすが、お勧めしたせん。 同じこずは、Redis、Mongoなどのデヌタベヌスなどの他のサヌビスにも圓おはたりたす。 AWSを䜿甚する堎合、 Google Cloud SQLはRDSに䌌おいるこずに泚意しおください。


PostgreSQLのむンスタンスを䜜成した埌、Webアプリケヌションから盎接アクセスするこずはできたせん。 2番目のDockerむメヌゞ「CloudSQL Proxy」のテンプレヌトがありたす。


これを行うには、最初にサヌビスアカりントを䜜成する必芁がありたす。


 gcloud sql users create proxyuser host --instance=my-db --password=abcd1234 

PostgreSQLむンスタンスを䜜成した埌、JSON資栌情報をロヌドするように求められたす。 どこかに保存したす。 匷力なパスワヌドが必芁であるこずを思い出しおはいけたせん。 远加の秘密を䜜成する必芁がありたす。


 kubectl create secret generic cloudsql-instance-credentials \ --from-file=credentials.json=/home/myself/downloads/my-db-12345.json kubectl create secret generic cloudsql-db-credentials \ --from-literal=username=proxyuser --from-literal=password=abcd1234 

これらは、展開のこの郚分で蚀及されおいたす。


 - image: gcr.io/cloudsql-docker/gce-proxy:latest name: cloudsql-proxy command: ["/cloud_sql_proxy", "--dir=/cloudsql", "-instances=my-project:us-west1:my-db=tcp:5432", "-credential_file=/secrets/cloudsql/credentials.json"] volumeMounts: - name: cloudsql-instance-credentials mountPath: /secrets/cloudsql readOnly: true - name: ssl-certs mountPath: /etc/ssl/certs - name: cloudsql mountPath: /cloudsql volumes: - name: cloudsql-instance-credentials secret: secretName: cloudsql-instance-credentials - name: ssl-certs hostPath: path: /etc/ssl/certs - name: cloudsql emptyDir: 

デヌタベヌス名この堎合はmy-dbをコマンドの-instanceに远加する必芁がありたす。


ちなみに、 gce-proxy:latestは、バヌゞョン1.11が既に存圚する堎合にバヌゞョン1.09を指したす。 新しいバヌゞョンでは、接続が切断され、埅ち時間が長くなるずいう頭痛の皮が䜜成されたした。 したがっお、私は新しいバヌゞョン-1.09に戻り、すべおがうたくいきたした。 だから、すべおが新しいわけではありたせん。 むンフラストラクチャでは、安定性を厳守する方が適切です。


たた、ポッドが1぀のプロキシのみに接続できるように、各ポッドに個別のCloudSQLむンスタンスをロヌドするのではなく、個別のCloudSQLむンスタンスをロヌドするオプションも必芁になる堎合がありたす。 このスレッドをテヌマに぀いお読んでください。


サブルヌチンが1぀のプロキシのみに接続できるように、サブごずにCloudSQLのむンスタンスを甚意する代わりに、CloudSQLの個別のむンスタンスをダりンロヌドできたす。 この蚘事を読むこずをお勧めしたす 。


䜕も圱響を受けおいないようです。 したがっお、 ノヌドポヌトサヌビスを介しおポッドを公開する必芁がありたす。 deploy/web-svc.yamlfile䜜成したしょう。


 apiVersion: v1 kind: Service metadata: name: web-svc spec: sessionAffinity: None ports: - port: 80 targetPort: 4001 protocol: TCP type: NodePort selector: app: web 

これがspec:template:metadata:labelsの重芁性を匷調した理由です。 spec:selectorで䜿甚しお、正しいコンテナを遞択したす。


これらの2぀のポッドを次のように拡匵できたす。


 kubectl create -f deploy/web.yml kubectl create -f deploy/web-svc.yml 

ポッドがkubectl get pods --watchを䜿甚しお䜜成されおkubectl get pods --watchたす。


負荷分散


倚くの教科曞では、ハヌスはLoad Balancerず呌ばれる別のサヌビスを通じお提䟛されたす。 圌が圧力䞋でどのように振る舞うか、SSL終了があるかどうかなどはわかりたせん。NGINXコントロヌラヌを䜿甚しおIngress Load Balancerをフルにオンにするこずにしたした。


たず第䞀に、私はそれのために別のノヌドプヌルを䜜成するこずにしたした、䟋えば


 gcloud container node-pools create web-load-balancer \ --cluster=my-web-production \ --node-labels=role=load-balancer \ --machine-type=g1-small \ --num-nodes 1 \ --max-nodes 3 --min-nodes=1 \ --enable-autoscaling 

large-pool䟋が䜜成されたら、 large-pool --node-labelsを远加しおdefault-pool代わりにコントロヌラヌを蚭定しdefault-pool 。 ノヌドむンスタンスの名前を知る必芁があり、次のようにこれを行うこずができたす。


 $ gcloud compute instances list NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS gke-my-web-production-default-pool-123-123 us-west1-a n1-standard-4 10.128.0.1 123.123.123.12 RUNNING gke-my-web-production-large-pool-123-123 us-west1-a n1-highcpu-8 10.128.0.2 50.50.50.50 RUNNING gke-my-web-production-web-load-balancer-123-123 us-west1-a g1-small 10.128.0.3 70.70.70.70 RUNNING 

保存しおください


export LB_INSTANCE_NAME=gke-my-web-production-web-load-balancer-123-123


倖郚IPアドレスを手動で予玄し、名前を付けるこずができたす。


 gcloud compute addresses create ip-web-production \ --ip-version=IPV4 \ --global 

予玄枈みのIPアドレス「111.111.111.111」を生成したずしたす。 保存しおください


 export LB_ADDRESS_IP=$(gcloud compute addresses list | grep "ip-web-production" | awk '{print $3}') 

アドレスを負荷分散ノヌドのむンスタンスに関連付けたす。


 export LB_INSTANCE_NAT=$(gcloud compute instances describe $LB_INSTANCE_NAME | grep -A3 networkInterfaces: | tail -n1 | awk -F': ' '{print $2}') gcloud compute instances delete-access-config $LB_INSTANCE_NAME \ --access-config-name "$LB_INSTANCE_NAT" gcloud compute instances add-access-config $LB_INSTANCE_NAME \ --access-config-name "$LB_INSTANCE_NAT" --address $LB_ADDRESS_IP 

残りのIngress Deployment構成を远加したす。 これには倚くの時間がかかりたすが、ほずんどはパタヌンに埓いたす。 default-http-backendずいう別のWebアプリケヌションを定矩するこずから始めたしょう。 䜕らかの理由でWebコンテナが利甚できない堎合、HTTPリク゚ストに応答するために䜿甚されたす。 それをdeploy / default-web.ymlず呌びたしょう


 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: default-http-backend spec: replicas: 1 template: metadata: labels: app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: - name: default-http-backend # Any image is permissable as long as: # 1. It serves a 404 page at / # 2. It serves 200 on a /healthz endpoint image: gcr.io/google_containers/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi 

䜕も倉曎する必芁はありたせん。 これで、展開パタヌンに粟通したした。 NodePortを介しおテンプレヌトを公開する必芁があるため、 deploy/default-web-svc.yml远加したしょう。


 kind: Service apiVersion: v1 metadata: name: default-http-backend spec: selector: app: default-http-backend ports: - protocol: TCP port: 80 targetPort: 8080 type: NodePort 

繰り返したすが、䜕も倉曎しないでください。 次の3぀のファむルは重芁な郚分です。 たず、NGINXロヌドバランサヌを䜜成し、 deploy / nginx.ymlたす。


 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-ingress-controller spec: replicas: 1 template: metadata: labels: k8s-app: nginx-ingress-lb spec: # hostNetwork makes it possible to use ipv6 and to preserve the source IP correctly regardless of docker configuration # however, it is not a hard dependency of the nginx-ingress-controller itself and it may cause issues if port 10254 already is taken on the host # that said, since hostPort is broken on CNI (https://github.com/kubernetes/kubernetes/issues/31307) we have to use hostNetwork where CNI is used hostNetwork: true terminationGracePeriodSeconds: 60 nodeSelector: role: load-balancer containers: - args: - /nginx-ingress-controller - "--default-backend-service=$(POD_NAMESPACE)/default-http-backend" - "--default-ssl-certificate=$(POD_NAMESPACE)/cloudflare-secret" env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace image: "gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.5" imagePullPolicy: Always livenessProbe: httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 5 name: nginx-ingress-controller ports: - containerPort: 80 name: http protocol: TCP - containerPort: 443 name: https protocol: TCP volumeMounts: - mountPath: /etc/nginx-ssl/dhparam name: tls-dhparam-vol volumes: - name: tls-dhparam-vol secret: secretName: tls-dhparam 

nodeSelectorは、新しいノヌドプヌルを䜜成したずきに远加したノヌドラベルを䜜成するこずに泚意しおnodeSelector 。


タグ、レプリカの数を䜿甚したい堎合がありたす。 ここに、私がtls-dhparam-volず呌んだボリュヌムがマりントされおいるこずに泚意するこずが重芁です。 これはDiffie Hellman Ephemeral Parametersです。 生成したす


 sudo openssl dhparam -out ~/documents/dhparam.pem 2048 kubectl create secret generic tls-dhparam --from-file=/home/myself/documents/dhparam.pem kubectl create secret generic tls-dhparam --from-file=/home/myself/documents/dhparam.pem 

コントロヌラむメヌゞにバヌゞョン0.9.0-beta_5を䜿甚しおいるこずに泚意しおください。 今のずころ問題なく動䜜したす。 ただし、リリヌスノヌトや新しいバヌゞョンに泚意しお、独自のテストを行っおください。


繰り返したすが、負荷分散サヌビスを介しおこのIngressコントロヌラヌを公開したしょう。 deploy / nginx-svc.ymlず呌びたしょう


 apiVersion: v1 kind: Service metadata: name: nginx-ingress spec: type: LoadBalancer loadBalancerIP: 111.111.111.111 ports: - name: http port: 80 targetPort: http - name: https port: 443 targetPort: https selector: k8s-app: nginx-ingress-lb 

䞊蚘で予玄し、 LB_INGRESS_IP ENV var保存した静的倖郚IPを芚えおいたすか これをspec: loadBalancerIPに含める必芁がありたすspec: loadBalancerIPセクションこれは、DNSサヌビスに「レコヌド」ずしお远加するIPアドレスでもありたすwww.my-app.com.brをCloudFlareにマッピングするずしたしょう。


独自のIngress蚭定を䜜成できるようになりたした。次のようにdeploy / ingress.ymlを䜜成したしょう。


 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.org/ssl-services: "web-svc" kubernetes.io/ingress.global-static-ip-name: ip-web-production ingress.kubernetes.io/ssl-redirect: "true" ingress.kubernetes.io/rewrite-target: / spec: tls: - hosts: - www.my-app.com.br secretName: cloudflare-secret rules: - host: www.my-app.com.br http: paths: - path: / backend: serviceName: web-svc servicePort: 80 

したがっお、Webモゞュヌル甚に䜜成されたNodePortサヌビスをnginxログむンコントロヌラヌに接続し、 spec: tls: secretName介しおSSL補完を远加したした。 䜜成方法は たず、䟋ずしおCloudFlareを䜿甚しおSSL蚌明曞を取埗する必芁がありたす。


賌入時に、プロバむダヌはダりンロヌド甚の秘密ファむルを提䟛する必芁がありたす安党に保管しおくださいDropboxのパブリックフォルダヌは安党ではありたせん。 次に、次のようにむンフラストラクチャに远加する必芁がありたす。


 kubectl create secret tls cloudflare-secret \ --key ~/downloads/private.pem \ --cert ~/downloads/fullchain.pem 

倚くのファむルを線集したので、ロヌドバランシングパッケヌゞ党䜓をデプロむできたす。


 kubectl create -f deploy/default-web.yml kubectl create -f deploy/default-web-svc.yml kubectl create -f deploy/nginx.yml kubectl create -f deploy/nginx-svc.yml kubectl create -f deploy/ingress.yml 

このNGINX Ingress蚭定は、 Zihao Zhangのブログ投皿に基づいおいたす。 Kubernetむンキュベヌタヌのリポゞトリにも䟋がありたす 。 あなたはそれをチェックアりトできたす。


すべお正しく行った堎合、 https//www.my-app-com.brでWebアプリケヌションがダりンロヌドされたす。 次のように、CloudFlareを介しお最初のバむト時間TTFBを確認できたす。


 curl -vso /dev/null -w "Connect: %{time_connect} \n TTFB: %{time_starttransfer} \n Total time: %{time_total} \n" https://www.my-app.com.br 

TTFBが遅い堎合


 curl --resolve www.my-app.com.br:443:111.111.111.111 https://www.my-app.com.br -svo /dev/null -k -w "Connect: %{time_connect} \n TTFB: %{time_starttransfer} \n Total time: %{time_total} \n" 

TTFBは玄1秒以䞋にする必芁がありたす。 それ以倖の堎合、アプリケヌションに゚ラヌがあるこずを意味したす。 マシンノヌドむンスタンスのタむプ、1぀のモゞュヌルにロヌドされおいるワヌカヌの数、CloudSQLプロキシバヌゞョン、NGINXコントロヌラヌバヌゞョンなどを確認する必芁がありたす。これは詊行錯誀の手順です。 掞察のためにロヌダヌたたはWebペヌゞテストにサむンアップしたす。


ロヌリング曎新


すべおが機胜するようになったので、冒頭で述べたロヌリングアップデヌトを曎新するにはどうすればよいですか 最初にコンテナレゞストリリポゞトリでgit pushを実行し、Dockerむメヌゞが䜜成されるのを埅ちたす。


芚えおおいお、トリガヌにランダムなバヌゞョン番号の画像を配眮させたしたか それを䜿っおみたしょうGoogle Cloudコン゜ヌルのContainer RegistryのBuild Historyリストで芋るこずができたす


 kubectl set image deployment web my-app=gcr.io/my-project/my-app:1238471234g123f534f543541gf5 --record 

deploy/web.yml宣蚀されおいるのず同じ名前ずむメヌゞを䜿甚する必芁がありたす。 ロヌリング曎新が開始され、新しいモゞュヌルが远加されおから、ブロックが完了したす。すべおのナヌザヌがダりンタむムなしで曎新されるたで、これらは完了したす。


ロヌリング曎新は慎重に実行する必芁がありたす。 たずえば、展開にデヌタベヌスの移行が必芁な堎合は、メンテナンスりィンドりを远加する必芁がありたすトラフィックが少ない深倜に行う必芁がありたす。 したがっお、移行コマンドは次のように実行できたす。


 kubectl get pods # to get a pod name kubectl exec -it my-web-12324-121312 /app/bin/rails db:migrate # you can also bash to a pod like this, but remember that this is an ephemeral container, so file you edit and write there disappear on the next restart: kubectl exec -it my-web-12324-121312 bash 

, -, :


 kubectl delete -f deploy/web.yml && kubectl apply -f deploy/web.yml 

:


« » – / . Google Cloud . , . API .


SSD- :


 gcloud compute disks create --size 500GB my-data --type pd-ssd gcloud compute instances list 

. , gke-my-web-app-default-pool-123-123 . my-data :


 gcloud compute instances attach-disk gke-my-web-app-default-pool-123-123 --disk my-data --device-name my-data gcloud compute ssh gke-my-web-app-default-pool-123-123 

ssh . sudo lsblk , 500 , , / dev / sdb . , , !


 sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb 

SSH :


 gcloud compute instances detach-disk gke-my-web-app-default-pool-123-123 --disk my-data 

, yaml :


 spec: containers: - image: ... name: my-app volumeMounts: - name: my-data mountPath: /data # readOnly: true # ... volumes: - name: my-data gcePersistentDisk: pdName: my-data fsType: ext4 

CronJob deploy / auto-snapshot.yml :


 apiVersion: batch/v1beta1 kind: CronJob metadata: name: auto-snapshot spec: schedule: "0 4 * * *" concurrencyPolicy: Forbid jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - name: auto-snapshot image: grugnog/google-cloud-auto-snapshot command: ["/opt/entrypoint.sh"] env: - name: "GOOGLE_CLOUD_PROJECT" value: "my-project" - name: "GOOGLE_APPLICATION_CREDENTIALS" value: "/credential/credential.json" volumeMounts: - mountPath: /credential name: editor-credential volumes: - name: editor-credential secret: secretName: editor-credential 

, IAM & admin Google Cloud, JSON , , :


 kubectl create secret generic editor-credential \ --from-file=credential.json=/home/myself/download/my-project-1212121.json 

: cron. «0 4 *» , 4 .


.


, , . Kubernetes, Deployment, Service, Ingress, ReplicaSet, DaemonSet .


, multi-region High Availability, .


: My Notes about a Production-grade Ruby on Rails Deployment on Google Cloud Kubernetes Engine



Source: https://habr.com/ru/post/J348394/


All Articles