_著者はhttps://www.brightfunds.org/organizations/electronic-frontier-foundation-inc[Electronic Frontier Foundation]を選択してhttps://do.co/w4do-cta[Write for DOnations]の一部として寄付を受け取りました]プログラム。

前書き

Kubernetesは、オープンソースのコンテナオーケストレーションシステムです。 ダウンタイムを心配することなく、コンテナを作成、更新、およびスケーリングできます。

PHPアプリケーションを実行するために、Nginxはhttp://php.net/manual/en/install.fpm.php[PHP-FPM]のプロキシとして機能します。 このセットアップを単一のコンテナーにコンテナー化するのは面倒なプロセスですが、Kubernetesは両方のサービスを別々のコンテナーで管理するのに役立ちます。 Kubernetesを使用すると、コンテナを再利用可能および交換可能に保つことができ、NginxまたはPHPの新しいバージョンがあるたびにコンテナイメージを再構築する必要がなくなります。

このチュートリアルでは、NginxとPHP-FPMが別々のコンテナで実行されているKubernetesクラスターにPHP 7アプリケーションをデプロイします。 また、https://www.digitalocean.com/products/block-storage/ [DigitalOcean’s Block Storage]システムを使用して、構成ファイルとアプリケーションコードをコンテナーイメージの外部に保持する方法についても学習します。 このアプローチでは、イメージを再構築するのではなく、構成ボリュームを渡すことにより、Web /プロキシサーバーを必要とするアプリケーションでNginxイメージを再利用できます。

前提条件

  • Kubernetesオブジェクトの基本的な理解。 詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes#kubernetes-objects-and-workloads [Introduction to Kubernetes]の記事をご覧ください。

  • Ubuntu 18.04で実行されるKubernetesクラスター。 これを設定するには、https://www.digitalocean.com/community/tutorials/how-to-create-a-kubernetes-cluster-using-kubeadm-on-ubuntu-18-04 [作成方法Ubuntu 18.04でのKubeadmを使用したKubernetes 1.14クラスター]チュートリアル。

  • DigitalOceanアカウントと、ストレージボリュームを作成するための読み取りおよび書き込み権限を持つAPIアクセストークン。 APIアクセストークンがない場合は、https://www.digitalocean.com/docs/api/create-personal-access-token/ [ここから作成]を使用できます。

  • https://github.com [Github]などの一般にアクセス可能なURLでホストされるアプリケーションコード。

ステップ1-PHP-FPMおよびNginxサービスの作成

この手順では、PHP-FPMおよびNginxサービスを作成します。 サービスを使用すると、クラスター内から一連のポッドにアクセスできます。 クラスタ内のサービスは、IPアドレスを必要とせずに、名前を介して直接通信できます。 PHP-FPMサービスはPHP-FPMポッドへのアクセスを許可し、NginxサービスはNginxポッドへのアクセスを許可します。

NginxポッドはPHP-FPMポッドをプロキシするため、それらを見つける方法をサービスに伝える必要があります。 IPアドレスを使用する代わりに、Kubernetesの自動サービス検出を利用して、人間が読み取れる名前を使用して適切なサービスにリクエストをルーティングします。

サービスを作成するには、オブジェクト定義ファイルを作成します。 すべてのKubernetesオブジェクト定義は、少なくとも次のアイテムを含むYAMLファイルです。

  • + apiVersion +:定義が属するKubernetes APIのバージョン。

  • + kind +:このファイルが表すKubernetesオブジェクト。 たとえば、「+ pod」または「+ service」。

  • + metadata ++:これには、オブジェクトの + name`と、適用したい + labels`が含まれます。

  • + spec +:これには、コンテナイメージやコンテナにアクセスできるポートなど、作成するオブジェクトの種類に応じた特定の設定が含まれます。

まず、Kubernetesオブジェクト定義を保持するディレクトリを作成します。

*マスターノード*にSSHで接続し、Kubernetesオブジェクト定義を保持する `+ definitions +`ディレクトリを作成します。

mkdir definitions

新しく作成された `+ definitions +`ディレクトリに移動します:

cd definitions

`+ php_service.yaml +`ファイルを作成して、PHP-FPMサービスを作成します。

nano php_service.yaml

このオブジェクトがサービスであることを指定するには、「+ kind 」を「 Service +」として設定します。

php_service.yaml

apiVersion: v1
kind: Service

PHP-FPMへのアクセスを提供するため、サービスに「+ php +」という名前を付けます。

php_service.yaml

...
metadata:
 name: php

異なるオブジェクトをラベルで論理的にグループ化します。 このチュートリアルでは、ラベルを使用して、オブジェクトをフロントエンドやバックエンドなどの「層」にグループ化します。 PHPポッドはこのサービスの背後で実行されるため、 `+ tier:backend +`というラベルを付けます。

php_service.yaml

...
 labels:
   tier: backend

サービスは、 `+ selector +`ラベルを使用して、アクセスするポッドを決定します。 これらのラベルに一致するポッドは、サービスの前または後にポッドが作成されたかどうかに関係なく、サービスされます。 チュートリアルの後半でポッドのラベルを追加します。

`+ tier:backend `ラベルを使用して、ポッドをバックエンド層に割り当てます。 また、 ` app:php `ラベルを追加して、このポッドがPHPを実行することを指定します。 これらの2つのラベルを ` metadata`セクションの後に追加します。

php_service.yaml

...
spec:
 selector:
   app: php
   tier: backend

次に、このサービスへのアクセスに使用するポートを指定します。 このチュートリアルでは、ポート「9000」を使用します。 `+ spec `の下の ` php_service.yaml +`ファイルに追加します:

php_service.yaml

...
 ports:
   - protocol: TCP
     port: 9000

完成した `+ php_service.yaml +`ファイルは次のようになります。

php_service.yaml

apiVersion: v1
kind: Service
metadata:
 name: php
 labels:
   tier: backend
spec:
 selector:
   app: php
   tier: backend
 ports:
 - protocol: TCP
   port: 9000

+ CTRL + O +`を押してファイルを保存し、 `+ CTRL + X`を押して + nano`を終了します。

サービスのオブジェクト定義を作成したので、サービスを実行するには、 `+ -f `引数とともに ` kubectl apply `コマンドを使用し、 ` php_service.yaml +`ファイルを指定します。

サービスを作成します。

kubectl apply -f php_service.yaml

この出力はサービス作成を確認します:

Outputservice/php created

サービスが実行されていることを確認します。

kubectl get svc

PHP-FPMサービスが実行されているのがわかります。

OutputNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    10m
php          ClusterIP   10.100.59.238   <none>        9000/TCP   5m

Kubernetesがサポートするさまざまなhttps://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types [サービスタイプ]があります。 + php`サービスはデフォルトのサービスタイプである + ClusterIP`を使用します。 このサービスタイプは、内部IPを割り当て、クラスター内からのみサービスに到達できるようにします。

PHP-FPMサービスの準備ができたので、Nginxサービスを作成します。 エディターで「+ nginx_service.yaml +」という新しいファイルを作成して開きます。

nano nginx_service.yaml

このサービスはNginxポッドをターゲットとするため、「+ nginx 」という名前を付けます。 また、バックエンド層に属するように、 ` tier:backend +`ラベルを追加します。

nginx_service.yaml

apiVersion: v1
kind: Service
metadata:
 name: nginx
 labels:
   tier: backend

`+ php `サービスと同様に、セレクターラベル ` app:nginx `および ` tier:backend `でポッドをターゲットにします。 デフォルトのHTTPポートであるポート「+80」でこのサービスにアクセスできるようにします。

nginx_service.yaml

...
spec:
 selector:
   app: nginx
   tier: backend
 ports:
 - protocol: TCP
   port: 80

Nginxサービスは、DropletのパブリックIPアドレスからインターネットにパブリックにアクセスできます。 「+」は、https://cloud.digitalocean.com [DigitalOcean Control Panel]から見つけることができます。 ` spec.externalIPs +`の下に、以下を追加します:

nginx_service.yaml

...
spec:
 externalIPs:
 -

`+ nginx_service.yaml +`ファイルは次のようになります。

nginx_service.yaml

apiVersion: v1
kind: Service
metadata:
 name: nginx
 labels:
   tier: backend
spec:
 selector:
   app: nginx
   tier: backend
 ports:
 - protocol: TCP
   port: 80
 externalIPs:
 -

ファイルを保存して閉じます。 Nginxサービスを作成します。

kubectl apply -f nginx_service.yaml

サービスの実行中に次の出力が表示されます。

Outputservice/nginx created

次を実行すると、実行中のすべてのサービスを表示できます。

kubectl get svc

出力にPHP-FPMサービスとNginxサービスの両方がリストされます。

OutputNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    13m
nginx        ClusterIP   10.102.160.47    80/TCP     50s
php          ClusterIP   10.100.59.238   <none>        9000/TCP   8m

実行できるサービスを削除する場合は注意してください。

kubectl delete svc/

PHP-FPMおよびNginxサービスを作成したので、アプリケーションコードと設定ファイルを保存する場所を指定する必要があります。

ステップ2-DigitalOcean Storageプラグインのインストール

Kubernetesは、環境のストレージスペースを作成できるさまざまなストレージプラグインを提供します。 この手順では、https://github.com/digitalocean/csi-digitalocean [DigitalOcean storageプラグイン]をインストールして、DigitalOceanにhttps://www.digitalocean.com/products/storage/[block storage]を作成します。 。 インストールが完了すると、ブロックストレージの作成に使用する `+ do-block-storage`という名前のストレージクラスが追加されます。

最初にKubernetes Secretオブジェクトを設定して、DigitalOcean APIトークンを保存します。 秘密オブジェクトは、SSHキーやパスワードなどの機密情報を同じネームスペース内の他のKubernetesオブジェクトと共有するために使用されます。 名前空間は、Kubernetesオブジェクトを論理的に分離する方法を提供します。

エディタで `+ secret.yaml +`という名前のファイルを開きます:

nano secret.yaml

Secretオブジェクトに「+ digitalocean」という名前を付け、「+ kube-system」名前空間に追加します。 `+ kube-system +`名前空間はKubernetesの内部サービスのデフォルトの名前空間であり、DigitalOceanストレージプラグインでもさまざまなコンポーネントを起動するために使用されます。

secret.yaml

apiVersion: v1
kind: Secret
metadata:
 name: digitalocean
 namespace: kube-system

Secretは、「+ spec 」キーの代わりに、「 data」または「+ string Data」キーを使用して必要な情報を保持します。 `+ data `パラメーターは、取得時に自動的にデコードされるbase64エンコードデータを保持します。 ` stringData `パラメーターは、作成または更新中に自動的にエンコードされるエンコードされていないデータを保持し、シークレットの取得時にデータを出力しません。 このチュートリアルでは、便宜上「 stringData +」を使用します。

「+ access-token」を「+ string Data」として追加します。

secret.yaml

...
stringData:
 access-token:

ファイルを保存して終了します。

`+ secret.yaml +`ファイルは次のようになります。

secret.yaml

apiVersion: v1
kind: Secret
metadata:
 name: digitalocean
 namespace: kube-system
stringData:
 access-token:

シークレットを作成します。

kubectl apply -f secret.yaml

シークレットの作成時に次の出力が表示されます。

Outputsecret/digitalocean created

次のコマンドでシークレットを表示できます。

kubectl -n kube-system get secret digitalocean

出力は次のようになります。

OutputNAME           TYPE      DATA      AGE
digitalocean   Opaque    1         41s

+ Opaque +`タイプは、このSecretが読み取り専用であることを意味し、これは `+ stringData + Secretsの標準です。 詳細については、https://github.com/kubernetes/community/blob/master/contributors/design-proposals/auth/secrets.md [Secret design spec]をご覧ください。 「+ DATA 」フィールドには、このシークレットに保存されているアイテムの数が表示されます。 この場合、単一のキーが保存されているため、「 1+」が表示されます。

これでシークレットが準備できたので、https://github.com/digitalocean/csi-digitalocean [DigitalOceanブロックストレージプラグイン]をインストールします。

kubectl apply -f https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml

次のような出力が表示されます。

Outputcsidriver.storage.k8s.io/dobs.csi.digitalocean.com created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created
storageclass.storage.k8s.io/do-block-storage created
statefulset.apps/csi-do-controller created
serviceaccount/csi-do-controller-sa created
clusterrole.rbac.authorization.k8s.io/csi-do-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-provisioner-binding created
clusterrole.rbac.authorization.k8s.io/csi-do-attacher-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-attacher-binding created
clusterrole.rbac.authorization.k8s.io/csi-do-snapshotter-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-snapshotter-binding created
daemonset.apps/csi-do-node created
serviceaccount/csi-do-node-sa created
clusterrole.rbac.authorization.k8s.io/csi-do-node-driver-registrar-role created
clusterrolebinding.rbac.authorization.k8s.io/csi-do-node-driver-registrar-binding created
error: unable to recognize "https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml": no matches for kind "VolumeSnapshotClass" in version "snapshot.storage.k8s.io/v1alpha1"

このチュートリアルでは、エラーを無視しても安全です。

DigitalOceanストレージプラグインをインストールしたので、ブロックストレージを作成して、アプリケーションコードと構成ファイルを保持できます。

ステップ3-永続ボリュームの作成

シークレットを配置し、ブロックストレージプラグインをインストールしたら、_Persistent Volume_を作成する準備ができました。 永続ボリューム(PV)は、ポッドのライフサイクルとは無関係に指定されたサイズのブロックストレージです。 永続ボリュームを使用すると、アプリケーションコードを失うことを心配せずにポッドを管理または更新できます。 永続ボリュームは、必要なパスでPVをマウントする「+ PersistentVolumeClaim +」またはPVCを使用してアクセスします。

エディターで `+ code_volume.yaml +`という名前のファイルを開きます:

nano code_volume.yaml

以下のパラメーターと値をファイルに追加して、PVCに「+ code +」という名前を付けます。

code_volume.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: code

PVCの「+ spec +」には次のアイテムが含まれます。

  • ユースケースによって異なる「+ accessModes +」。 これらは:

  • + ReadWriteOnce + –単一ノードによる読み取り/書き込みとしてボリュームをマウントします

  • + ReadOnlyMany + –多くのノードでボリュームを読み取り専用としてマウントします

  • + ReadWriteMany + –ボリュームを多くのノードで読み書き可能としてマウントします

  • + resources + –必要なストレージスペース

DigitalOceanブロックストレージは単一のノードにのみマウントされるため、 `+ accessModes `を ` ReadWriteOnce `に設定します。 このチュートリアルでは、少量のアプリケーションコードを追加する方法を説明します。したがって、このユースケースでは1GBで十分です。 ボリュームに大量のコードまたはデータを保存する予定がある場合は、要件に合わせて ` storage +`パラメーターを変更できます。 ボリュームの作成後にストレージの量を増やすことができますが、ディスクの縮小はサポートされていません。

code_volume.yaml

...
spec:
 accessModes:
 - ReadWriteOnce
 resources:
   requests:
     storage:

次に、Kubernetesがボリュームのプロビジョニングに使用するストレージクラスを指定します。 DigitalOceanブロックストレージプラグインによって作成された `+ do-block-storage +`クラスを使用します。

code_volume.yaml

...
 storageClassName: do-block-storage

`+ code_volume.yaml +`ファイルは次のようになります。

code_volume.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: code
spec:
 accessModes:
 - ReadWriteOnce
 resources:
   requests:
     storage:
 storageClassName: do-block-storage

ファイルを保存して終了します。

+ kubectl`を使用して + code of` PVCを作成します。

kubectl apply -f code_volume.yaml

次の出力は、オブジェクトが正常に作成され、1GB PVCをボリュームとしてマウントする準備ができたことを示しています。

Outputpersistentvolumeclaim/code created

使用可能な永続ボリューム(PV)を表示するには:

kubectl get pv

PVが一覧表示されます:

OutputNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM          STORAGECLASS       REASON    AGE
pvc-ca4df10f-ab8c-11e8-b89d-12331aa95b13   1Gi        RWO            Delete           Bound     default/code   do-block-storage             2m

上記のフィールドは設定ファイルの概要です。ただし、「+ Reclaim Policy 」と「 Status 」は除きます。 「 Reclaim Policy」は、PVにアクセスするPVCが削除された後にPVで行われる処理を定義します。 `+ Delete `は、KubernetesおよびDigitalOceanインフラストラクチャからPVを削除します。 「 Reclaim Policy 」および「 Status +」の詳細については、https://kubernetes.io/docs/concepts/storage/persistent-volumes/ [Kubernetes PV documentation]をご覧ください。

DigitalOceanブロックストレージプラグインを使用して永続ボリュームを正常に作成しました。 永続ボリュームの準備ができたので、展開を使用してポッドを作成します。

ステップ4-PHP-FPMデプロイメントの作成

このステップでは、Deploymentを使用してPHP-FPMポッドを作成する方法を学習します。 デプロイメントは、https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/ [ReplicaSets]を使用してポッドを作成、更新、管理するための統一された方法を提供します。 更新が期待どおりに機能しない場合、展開はそのポッドを前のイメージに自動的にロールバックします。

Deployment `+ spec.selector `キーは、管理するポッドのラベルをリストします。 また、必要なポッドを作成するために「 template +」キーを使用します。

この手順では、Init Containersの使用も紹介します。 _Init Containers_は、ポッドの `+ template `キーで指定された通常のコンテナーの前に1つ以上のコマンドを実行します。 このチュートリアルでは、Init Containerは、 ` wget `を使用してhttps://gist.github.com [GitHub Gist]からサンプルの ` index.php +`ファイルを取得します。 サンプルファイルの内容は次のとおりです。

index.php

<?php
echo phpinfo();

デプロイメントを作成するには、エディターで `+ php_deployment.yaml +`という新しいファイルを開きます:

nano php_deployment.yaml

このDeploymentはPHP-FPMポッドを管理するため、Deploymentオブジェクトに「+ php 」という名前を付けます。 ポッドはバックエンド層に属しているため、 ` tier:backend +`ラベルを使用してデプロイメントをこのグループにグループ化します。

php_deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: php
 labels:
   tier: backend

Deployment `+ spec `の場合、 ` replicas `パラメーターを使用して、作成するこのポッドのコピー数を指定します。 ` replicas +`の数は、ニーズと利用可能なリソースによって異なります。 このチュートリアルでは、レプリカを1つ作成します。

php_deployment.yaml

...
spec:
 replicas: 1

このデプロイメントは、 `+ app:php `および ` tier:backend `ラベルに一致するポッドを管理します。 ` selector +`キーの下に追加します:

php_deployment.yaml

...
 selector:
   matchLabels:
     app: php
     tier: backend

次に、デプロイメントの「+ spec」には、ポッドのオブジェクト定義に「+ template」が必要です。 このテンプレートは、ポッドを作成するための仕様を定義します。 最初に、 + php`サービス + selectors`とDeployment + matchLabels`に指定されたラベルを追加します。 `+ template.metadata.labels`の下に + app:php`と `+ tier:backend`を追加します。

php_deployment.yaml

...
 template:
   metadata:
     labels:
       app: php
       tier: backend

ポッドには複数のコンテナとボリュームを含めることができますが、それぞれに名前が必要です。 ボリュームごとにマウントパスを指定することで、ボリュームをコンテナに選択的にマウントできます。

最初に、コンテナがアクセスするボリュームを指定します。 アプリケーションコードを保持するために「+ code 」という名前のPVCを作成したため、このボリュームにも「 code 」という名前を付けます。 ` spec.template.spec.volumes +`で、次を追加します。

php_deployment.yaml

...
   spec:
     volumes:
     - name: code
       persistentVolumeClaim:
         claimName: code

次に、このポッドで実行するコンテナを指定します。 Dockerストアでさまざまな画像を見つけることができますが、このチュートリアルでは、 `+ php:7-fpm +`画像を使用します。

`+ spec.template.spec.containers +`で、次を追加します。

php_deployment.yaml

...
     containers:
     - name: php
       image: php:7-fpm

次に、コンテナがアクセスする必要があるボリュームをマウントします。 このコンテナはPHPコードを実行するため、 `+ code `ボリュームにアクセスする必要があります。 また、 ` mountPath `を使用して、マウントポイントとして ` / code +`を指定します。

`+ spec.template.spec.containers.volumeMounts +`で、以下を追加します:

php_deployment.yaml

...
       volumeMounts:
       - name: code
         mountPath: /code

ボリュームをマウントしたら、ボリューム上にアプリケーションコードを取得する必要があります。 以前にFTP / SFTPを使用したり、SSH接続を介してコードを複製したりすることもできますが、この手順では、Init Containerを使用してコードをコピーする方法を示します。

設定プロセスの複雑さに応じて、単一の `+ initContainer `を使用してアプリケーションをビルドするスクリプトを実行するか、コマンドごとに1つの ` initContainer `を使用できます。 ボリュームが ` initContainer +`にマウントされていることを確認してください。

このチュートリアルでは、コードをダウンロードするために、 `+ busybox `を持つ単一のInit Containerを使用します。 ` busybox `は、これを達成するために使用する ` wget +`ユーティリティを含む小さな画像です。

`+ spec.template.spec `の下で、 ` initContainer `を追加し、 ` busybox +`イメージを指定します。

php_deployment.yaml

...
     initContainers:
     - name: install
       image: busybox

Init Containerは、その場所にコードをダウンロードできるように、「+ code 」ボリュームにアクセスする必要があります。 「 spec.template.spec.initContainers」の下で、「+ / code 」パスにボリューム「 code +」をマウントします。

php_deployment.yaml

...
       volumeMounts:
       - name: code
         mountPath: /code

各Init Containerは、「+ command 」を実行する必要があります。 Init Containerは、「 wget 」を使用してhttps://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php [コード]をhttps://github.com/do-communityからダウンロードします/ php-kubernetes [Github]を ` / code `作業ディレクトリに追加します。 ` -O `オプションはダウンロードしたファイルに名前を付け、このファイルに ` index.php +`という名前を付けます。

+ spec.template.spec.initContainers`の + install`コンテナの下に、次の行を追加します。

php_deployment.yaml

...
       command:
       - wget
       - "-O"
       - "/code/index.php"
       -

完成した `+ php_deployment.yaml +`ファイルは次のようになります。

php_deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: php
 labels:
   tier: backend
spec:
 replicas: 1
 selector:
   matchLabels:
     app: php
     tier: backend
 template:
   metadata:
     labels:
       app: php
       tier: backend
   spec:
     volumes:
     - name: code
       persistentVolumeClaim:
         claimName: code
     containers:
     - name: php
       image: php:7-fpm
       volumeMounts:
       - name: code
         mountPath: /code
     initContainers:
     - name: install
       image: busybox
       volumeMounts:
       - name: code
         mountPath: /code
       command:
       - wget
       - "-O"
       - "/code/index.php"
       - https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php

ファイルを保存し、エディターを終了します。

`+ kubectl +`を使用してPHP-FPM Deploymentを作成します。

kubectl apply -f php_deployment.yaml

デプロイメントの作成時に次の出力が表示されます。

Outputdeployment.apps/php created

要約すると、この展開は指定されたイメージをダウンロードすることから始まります。 次に、 `+ PersistentVolumeClaim `から ` PersistentVolume `を要求し、 ` initContainers `をシリアルに実行します。 完了すると、コンテナが実行され、 ` volumes +`が指定されたマウントポイントにマウントされます。 これらの手順がすべて完了すると、ポッドが稼働します。

以下を実行することにより、デプロイメントを表示できます。

kubectl get deployments

次の出力が表示されます。

OutputNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
php       1         1         1            0           19s

この出力は、展開の現在の状態を理解するのに役立ちます。 + Deployment +`はhttps://kubernetes.io/docs/concepts/workloads/controllers/deployment/ [コントローラーの1つ]であり、望ましい状態を維持します。 作成した「+ template +」は、「+ DESIRED +」状態に「+ php +」という名前のポッドの「+ replicas +」が1つあることを指定します。 `+ CURRENT`フィールドは、実行中のレプリカの数を示すため、これは + DESIRED`状態と一致する必要があります。 Kubernetes Deployments documentationの残りのフィールドについて読むことができます。

次のコマンドを使用して、この展開が開始したポッドを表示できます。

kubectl get pods

このコマンドの出力は、展開の作成から経過した時間によって異なります。 作成後すぐに実行すると、出力は次のようになります。

OutputNAME                   READY     STATUS     RESTARTS   AGE
php-86d59fd666-bf8zd   0/1       Init:0/1   0          9s

列は次の情報を表します。

  • + Ready +:このポッドを実行している `+ replicas +`の数。

  • + Status +:ポッドのステータス。 `+ Init +`は、Init Containersが実行されていることを示します。 この出力では、1つのInit Containerのうち0が実行を終了しています。

  • + Restarts +:ポッドを起動するためにこのプロセスが再起動された回数。 Init Containerのいずれかが失敗すると、この数は増加します。 Deploymentは、目的の状態に達するまで再起動します。

起動スクリプトの複雑さによっては、ステータスが「+ podInitializing +」に変わるまで数分かかる場合があります。

OutputNAME                   READY     STATUS            RESTARTS   AGE
php-86d59fd666-lkwgn   0/1       podInitializing   0          39s

これは、Init Containersが終了し、コンテナーが初期化されていることを意味します。 すべてのコンテナが実行されているときにコマンドを実行すると、ポッドのステータスが「+ Running +」に変更されます。

OutputNAME                   READY     STATUS            RESTARTS   AGE
php-86d59fd666-lkwgn   1/1       Running   0          1m

これで、ポッドが正常に実行されていることがわかります。 ポッドが起動しない場合は、次のコマンドでデバッグできます。

  • ポッドの詳細情報を表示します。

kubectl describe pods
  • ポッドによって生成されたログを表示:

kubectl logs
  • ポッド内の特定のコンテナーのログを表示します。

kubectl logs

アプリケーションコードがマウントされ、PHP-FPMサービスが接続を処理する準備ができました。 これで、Nginx Deploymentを作成できます。

ステップ5-Nginxデプロイメントの作成

この手順では、_ConfigMap_を使用してNginxを構成します。 ConfigMapは、他のKubernetesオブジェクト定義で参照できるキーと値の形式で構成を保持します。 このアプローチにより、必要に応じて、イメージを別のNginxバージョンと再利用または交換する柔軟性が得られます。 ConfigMapを更新すると、それをマウントしているポッドへの変更が自動的に複製されます。

エディターでConfigMap用の `+ nginx_configMap.yaml +`ファイルを作成します。

nano nginx_configMap.yaml

ConfigMapに「+ nginx-config 」という名前を付け、「 tier:backend +」マイクロサービスにグループ化します。

nginx_configMap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
 name: nginx-config
 labels:
   tier: backend

次に、ConfigMapの `+ data`を追加します。 キーに「+ config +」という名前を付け、Nginx構成ファイルの内容を値として追加します。 https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04#step-からNginx設定の例を使用できます。 three-create-server-block-files-for-each-domain [このチュートリアル]。

Kubernetesはサービスの適切なホストにリクエストをルーティングできるため、IPアドレスの代わりに `+ fastcgi_pass `パラメーターにPHP-FPMサービスの名前を入力できます。 ` nginx_configMap.yaml +`ファイルに次を追加します。

nginx_configMap.yaml

...
data:
 config : |
   server {
     index index.php index.html;
     error_log  /var/log/nginx/error.log;
     access_log /var/log/nginx/access.log;
     root ;

     location / {
         try_files $uri $uri/ /index.php?$query_string;
     }

     location ~ \.php$ {
         try_files $uri =404;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
         fastcgi_pass ;
         fastcgi_index index.php;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param PATH_INFO $fastcgi_path_info;
       }
   }

`+ nginx_configMap.yaml +`ファイルは次のようになります。

nginx_configMap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
 name: nginx-config
 labels:
   tier: backend
data:
 config : |
   server {
     index index.php index.html;
     error_log  /var/log/nginx/error.log;
     access_log /var/log/nginx/access.log;
     root /code;

     location / {
         try_files $uri $uri/ /index.php?$query_string;
     }

     location ~ \.php$ {
         try_files $uri =404;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
         fastcgi_pass php:9000;
         fastcgi_index index.php;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param PATH_INFO $fastcgi_path_info;
       }
   }

ファイルを保存し、エディターを終了します。

ConfigMapを作成します。

kubectl apply -f nginx_configMap.yaml

次の出力が表示されます。

Outputconfigmap/nginx-config created

ConfigMapの作成が完了し、Nginx Deploymentを構築できるようになりました。

エディターで新しい `+ nginx_deployment.yaml +`ファイルを開くことから始めます。

nano nginx_deployment.yaml

デプロイメントに「+ nginx 」という名前を付け、ラベル「 tier:backend +」を追加します。

nginx_deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx
 labels:
   tier: backend

Deployment `+ spec `に1つの ` replicas `が必要であることを指定します。 このデプロイメントは、 ` app:nginx `と ` tier:backend +`のラベルを持つポッドを管理します。 以下のパラメーターと値を追加します。

nginx_deployment.yaml

...
spec:
 replicas: 1
 selector:
   matchLabels:
     app: nginx
     tier: backend

次に、ポッド「+ template 」を追加します。 Deployment ` selector.matchLabels +`に追加したものと同じラベルを使用する必要があります。 以下を追加してください。

nginx_deployment.yaml

...
 template:
   metadata:
     labels:
       app: nginx
       tier: backend

前に作成した + code + PVCへのNginxアクセスを許可します。 `+ spec.template.spec.volumes +`で、以下を追加します:

nginx_deployment.yaml

...
   spec:
     volumes:
     - name: code
       persistentVolumeClaim:
         claimName: code

ポッドはConfigMapをボリュームとしてマウントできます。 ファイル名とキーを指定すると、コンテンツとしての値を持つファイルが作成されます。 ConfigMapを使用するには、「+ path 」を「 key 」の内容を保持するファイルの名前に設定します。 キー「 config 」からファイル「 site.conf 」を作成します。 ` spec.template.spec.volumes +`で、次を追加します。

nginx_deployment.yaml

...
     - name: config
       configMap:
         name: nginx-config
         items:
         - key: config
           path: site.conf

次に、ポッドの作成元の画像を指定します。 このチュートリアルでは、安定性のために `+ nginx:1.7.9 `イメージを使用しますが、他のNginxイメージはhttps://hub.docker.com/explore/[Dockerストア]にあります。 また、ポート ` 80 `でNginxを利用可能にします。 ` spec.template.spec +`の下に以下を追加します:

nginx_deployment.yaml

...
     containers:
     - name: nginx
       image:
       ports:
       - containerPort: 80

NginxとPHP-FPMは同じパスのファイルにアクセスする必要があるため、 `+ code `ボリュームを ` / code +`にマウントします。

nginx_deployment.yaml

...
       volumeMounts:
       - name: code
         mountPath: /code

`+ nginx:1.7.9 `イメージは、 ` / etc / nginx / conf.d `ディレクトリの下の設定ファイルを自動的にロードします。 このディレクトリに ` config `ボリュームをマウントすると、ファイル ` / etc / nginx / conf.d / site.conf `が作成されます。 ` volumeMounts +`で以下を追加します:

nginx_deployment.yaml

...
       - name: config
         mountPath: /etc/nginx/conf.d

`+ nginx_deployment.yaml +`ファイルは次のようになります。

nginx_deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx
 labels:
   tier: backend
spec:
 replicas: 1
 selector:
   matchLabels:
     app: nginx
     tier: backend
 template:
   metadata:
     labels:
       app: nginx
       tier: backend
   spec:
     volumes:
     - name: code
       persistentVolumeClaim:
         claimName: code
     - name: config
       configMap:
         name: nginx-config
         items:
         - key: config
           path: site.conf
     containers:
     - name: nginx
       image:
       ports:
       - containerPort: 80
       volumeMounts:
       - name: code
         mountPath: /code
       - name: config
         mountPath: /etc/nginx/conf.d

ファイルを保存し、エディターを終了します。

Nginx展開を作成します。

kubectl apply -f nginx_deployment.yaml

次の出力は、デプロイメントが作成されたことを示しています。

Outputdeployment.apps/nginx created

次のコマンドでデプロイメントをリストします。

kubectl get deployments

NginxとPHP-FPMの展開が表示されます。

OutputNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     1         1         1            0           16s
php       1         1         1            1           7m

両方のデプロイメントによって管理されるポッドをリストします。

kubectl get pods

実行中のポッドが表示されます。

OutputNAME                     READY     STATUS    RESTARTS   AGE
nginx-7bf5476b6f-zppml   1/1       Running   0          32s
php-86d59fd666-lkwgn     1/1       Running   0          7m

すべてのKubernetesオブジェクトがアクティブになったので、ブラウザーでNginxサービスにアクセスできます。

実行中のサービスをリストします。

kubectl get services -o wide

Nginxサービスの外部IPを取得します。

OutputNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE       SELECTOR
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    39m       <none>
nginx        ClusterIP   10.102.160.47    80/TCP     27m       app=nginx,tier=backend
php          ClusterIP   10.100.59.238   <none>        9000/TCP   34m       app=php,tier=backend

ブラウザで、「+ http:// 」と入力してサーバーにアクセスします。 ` phpinfo()+`の出力が表示され、Kubernetesサービスが稼働していることが確認されます。

結論

このガイドでは、PHP-FPMおよびNginxサービスをコンテナー化して、それらを個別に管理できるようにしました。 このアプローチは、成長するにつれてプロジェクトのスケーラビリティを向上させるだけでなく、リソースを効率的に使用することもできます。 また、アプリケーションコードをボリュームに保存したため、将来サービスを簡単に更新できます。