🌃
kubernetesでnginxを起動する
はじめに
自分用のメモです。
kubernetesを使用してnginxを構築します。
環境
Client Version: v1.33.1
Kustomize Version: v5.6.0
docker desktop: v4.41.2
Kubernetesの基本概念
Podとは
最低一つ以上のコンテナで構成されるグループ
基本的にはDeploymentで作成され、単一では作成されない(作成自体は可能)
- Podは常にノード上で実行される
- 各Podはスケジュールされているノードに関連付けられている
- ノードに障害が発生した場合、Deploymentが新しいPodを別のノードで起動する
Deploymentとは
kubernetesクラスター上に、コンテナ化アプリケーションをデプロイすることができる
Deployment内に含まれるアプリケーションインスタンスをクラスター内の、個々のノードで実行できるようにスケジュールする
指定したレプリカ数を維持し、ローリングアップデートやスケーリングも管理する
Serviceとは
Deploymentでデプロイしたコンテナを外部から通信可能にする
PodのIPアドレスを探すのは困難なため、Serviceで固定のIPアドレスとポート番号を定義する
実践:nginxアプリケーションをデプロイしてみる
マニフェストファイル作成
# nginx-deployments.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-d
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Serviceによるネットワーク設定
Serviceの役割
固定のIPアドレスとポートを提供し、複数のPodへのロードバランシングを行う
Service作成の実践
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 7070
targetPort: 80
type: LoadBalancer
ポートフォワーディングの仕組み
- containerPort
- Pod内のNginxのポート番号
- port
- 外部からアクセスされるポート番号
- targetPort
- 外部からアクセスされたポート番号をPod内のポート番号に転送する
- targetPortとcontainerPortは一致させる必要あり
実行手順
# マニフェストファイルの適用
kubectl apply -f nginx-deployments.yaml
kubectl apply -f nginx-service.yaml
# 確認
kubectl get pods
kubectl get services
# ブラウザでアクセス
# http://localhost:7070
トラブル
ブラウザでアクセスできない場合
原因1: ラベルの不一致
nginx-service.yaml
に定義しているspec.selector.app
と
nginx-deployments.yaml
に定義しているmetadata.labels.app
が一致しているか確認
原因2: ポート設定の間違い
上記のように、targetPortとcontainerPortが一致していないと、外部からのアクセスが正しくPod内に転送されない
リソースの管理と削除
リソースの変更方法
- マニフェストファイルを修正
-
kubectl apply -f ./nginx-deployments or service.yaml
を実行 -
deployment or service.apps/nginx-deployments or service configured
と表示される
リソースの削除
# 個別削除
kubectl delete service nginx-service
kubectl delete deployment nginx-deployments
# マニフェストファイルによる削除
kubectl delete -f ./nginx.service.yaml
kubectl delete -f ./nginx.deployments.yaml
Discussion