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