🌃

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内に転送されない

リソースの管理と削除

リソースの変更方法

  1. マニフェストファイルを修正
  2. kubectl apply -f ./nginx-deployments or service.yamlを実行
  3. 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