kindでIngressを使ってlocalhostからPodまでの疎通を確認する

# はじめに

Kubernetesを勉強しています。
Ingress、Service、Deployment、Podの役割は理解できたので、kindを使って実際に通信する環境を作ります。

# 作成する環境

localhost (http://localhost:80/) にアクセスするとIngress, Serviceを経て、Deploymentで作成したnginxのPodに疎通して応答を返します。
概要を図にまとめたものを以下に示します。

![ingress.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151726/af3ad221-2fff-43b9-9124-4a713f5afbe5.png)


# 環境情報

|Component|Version|
|---|---|
| PC | M1 MacBook Pro |
| OS | macOS 15.5 |
| Docker Desktop | 4.42.0 |
| kind | v0.29.0 |
| Kubernetes | v1.33.1 |

# kindでKubernetesクラスタを作成

kindでandbox-ingressというKubernetesクラスタを作成します。
このときにlocalhostの80番ポートをKubernetesクラスタにマッピングする必要があります。

manifestは以下です。
```yaml:kind-sandbox-ingress.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: sandbox-ingress
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30080
    hostPort: 80
    protocol: TCP
```

このmanifestを元にkindコマンドでKubernetesクラスタを作成します。
```zsh
kind create cluster --config kind-sandbox-ingress.yaml
```

# ingress-nginxをdeployする

Ingressを使うためには、予めIngressControllerを準備する必要があります。
今回はingress-nginxを使用します。
helmでインストールします。

```zsh
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm -n ingress-nginx install ingress-nginx ingress-nginx/ingress-nginx --create-namespace
```

ingress-nginx namspaceにingress-nginx関連リソースがデプロイされたことを確認します。

```zsh
❯ k get all -n ingress-nginx
```

# Ingress, Service, Deploymentを作成

Ingress, Service, Deploymentを作成するためのmanifestです。

```yaml:ingress_svc_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: nginx
            port:
              number: 30080
```

このmanifestをdeployします。
```zsh
k apply -f ingress_svc_deploy.yaml
```

# localhostからPodまでの疎通を確認

以下のURLにアクセスし、"Welcome to nginx!"と表示されれば成功です。
http://localhost:80/

![スクリーンショット 2025-06-07 16.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151726/f053ae1d-84e9-485c-a6e1-3865ef3f7e84.png)


# 最後に

kindで作成したKubernetesクラスタにnginx IngressControllerをdeployし、Ingresss、Service、Deploymentを作成し、localhostからnginx podまでの疎通を確認することができました。

# 参考情報

* [Ingress](https://kubernetes.io/ja/docs/concepts/services-networking/ingress/)
* [Service](https://kubernetes.io/ja/docs/concepts/services-networking/service/)
* [Deployment](https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/)
* [Pod](https://kubernetes.io/ja/docs/concepts/workloads/pods/)
* https://kind.sigs.k8s.io/docs/user/ingress/
* https://kubernetes.github.io/ingress-nginx/deploy/
* https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx