YAML マニフェストを適用する
このステップでは、kubectl apply コマンドについて詳しく説明し、Kubernetes マニフェストを適用するさまざまな方法を学びます。前のステップの YAML ファイルを基に、マニフェストを適用するためのさまざまなテクニックを実演します。
まず、正しいディレクトリにいることを確認してください。
cd ~/project/k8s-manifests
マニフェストをさらに整理するために、新しいサブディレクトリを作成しましょう。manifests という名前のディレクトリを作成し、その中に移動します。
mkdir -p manifests
cd manifests
次に、単一のファイルに Deployment と Service の両方を含むシンプルな Web アプリケーションのマニフェストを作成しましょう。nano を使用して web-app.yaml という名前の新しいファイルを作成します。
nano web-app.yaml
web-app.yaml に次のコンテンツを追加します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
type: ClusterIP
ports:
- port: 80
targetPort: 80
このマニフェストは、単一のファイルに 2 つの Kubernetes リソースを定義しており、--- で区切られています。これは、関連するリソースをまとめてグループ化する一般的な方法です。新しく追加された部分を詳しく見てみましょう。
- 単一ファイル内の複数のリソース:
web-app.yaml ファイルには、Deployment と Service の 2 つの別個の Kubernetes リソース定義が含まれています。--- 区切り文字は、それらを区別するために使用されます。
kind: Service: これは Service リソースを定義します。
spec.selector.app: web: この Service は、app: web というラベルを持つ Pod をターゲットにします。これは、web-app Deployment によって作成された Pod に設定したラベルと一致します。
spec.type: ClusterIP: Service のタイプを ClusterIP に指定します。これは、Service がクラスター内の内部 IP アドレスで公開されることを意味し、通常はクラスター内の Service 間通信に使用されます。
spec.ports: Service がポートをターゲット Pod にどのようにマッピングするかを定義します。
port: 80: アクセスする Service 自体のポートです。
targetPort: 80: Service がトラフィックを転送するターゲット Pod のポートです。
次に、これらのマニフェストをさまざまな方法で適用しましょう。
方法 1: ファイル全体を適用する
これはマニフェストを適用する最も一般的な方法です。kubectl apply -f の後にファイル名を指定します。
kubectl apply -f web-app.yaml
このコマンドは、web-app.yaml で定義された Deployment と Service の両方を作成します。次のような出力が表示されるはずです。
deployment.apps/web-app created
service/web-service created
方法 2: ディレクトリから適用する
ディレクトリ内のすべてのマニフェストを一度に適用できます。manifests ディレクトリに複数のマニフェストファイルがある場合、特定のファイルを指定する代わりにディレクトリを指定することで、すべてを適用できます。
kubectl apply -f .
. は現在のディレクトリを表します。kubectl はこのディレクトリ内の YAML ファイルを検索し、すべてを適用します。これは、マニフェストをディレクトリ内の複数のファイルに整理した場合に便利です。
方法 3: URL から適用する(オプション)
kubectl apply は、URL から直接マニフェストを適用することもできます。これは、オンラインでホストされているサンプルアプリケーションや構成をすばやくデプロイする場合に便利です。たとえば、Kubernetes のサンプルリポジトリから Redis マスターデプロイメントをデプロイできます。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/redis-master-deployment.yaml
これにより、URL からマニフェストがダウンロードされ、クラスターに適用されます。注意:信頼できない URL からのマニフェストの適用には注意してください。クラスターを変更する可能性があります。
kubectl apply の追加オプションをいくつか見てみましょう。
Dry Run
--dry-run=client フラグを使用すると、クラスターに変更を加えることなく、マニフェストの適用をシミュレートできます。これは、マニフェストが有効かどうかを確認し、どのリソースが作成または変更されるかを確認するのに役立ちます。
kubectl apply -f web-app.yaml --dry-run=client
このコマンドは、実際に変更をクラスターに適用せずに、作成または変更される内容を出力します。
詳細出力
kubectl apply からの詳細な出力を得るには、-v フラグの後に詳細レベル(例:-v=7)を指定できます。詳細レベルが高いほど、より詳細な情報が表示され、デバッグに役立ちます。
kubectl apply -f web-app.yaml -v=7
これにより、行われている API リクエストとマニフェストの処理に関するさらに多くの情報が表示されます。
web-app.yaml を適用して作成されたリソースを確認します。kubectl get deployments および kubectl get services を使用して、クラスター内の Deployment と Service を一覧表示します。
## デプロイメントを一覧表示
kubectl get deployments
## サービスを一覧表示
kubectl get services
## デプロイメントの詳細を表示するには記述します
kubectl describe deployment web-app
kubectl get deployments の出力例:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 3m33s
redis-master 0/1 1 0 23s
web-app 2/2 2 2 42s
kubectl get services の出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m28s
web-service ClusterIP 10.106.220.33 <none> 80/TCP 46s
これで、2/2 の READY レプリカを持つ web-app Deployment と、ClusterIP タイプ の web-service があることに注意してください。
Kubernetes における宣言的な管理と命令的な管理の違いについて、特に kubectl apply と kubectl create のコンテキストで簡単に説明しましょう。
kubectl apply: 宣言的なアプローチを使用します。マニフェストファイルで望ましい状態を定義し、kubectl apply はその状態を達成しようとします。同じマニフェストで kubectl apply を複数回実行した場合、マニフェストの望ましい状態とクラスターの現在の状態との間に違いがある場合にのみ、Kubernetes は変更を行います。kubectl apply は、より堅牢で時間の経過とともに変更を管理しやすいため、Kubernetes リソースの管理には一般的に推奨されます。リソースの構成を追跡し、増分更新を可能にします。
kubectl create: 命令的なアプローチを使用します。Kubernetes にリソースを作成するように直接指示します。既に存在するリソースに対して kubectl create を実行しようとすると、通常はエラーになります。kubectl create は、kubectl apply と比較して、更新や変更の管理においては柔軟性が低いです。
ほとんどの場合、特にアプリケーションデプロイメントの管理においては、宣言的な性質と更新および構成管理の優れた処理能力により、kubectl apply が最も好ましく推奨される方法です。