Ingress、Nginx-Ingressコントローラの動作確認

はじめに

Kubernetesのリソースの一つであるIngressの動作を確認し、Kubernetesクラスタネットワーク外部からアクセスを待ち受けられるようにする。

環境

  • Windows11(ホストOS)
  • Ubuntu22.04.3(ゲストOS、WSL2)
  • k3s v1.29.4+k3s1

Ingressについて

IngressIngressのリソースそのものに加えて、Ingressを提供するためにはIngressコントローラーが必要である。 Ingressコントローラーとして以下のようなものがある。

今回はNginxのIngressコントローラーを使用する。

構築と動作確認

構築イメージ

Ingressコントローラー

kubernetes.github.io

上記を参考にNginx-Ingressをインストールする。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml

#確認
$ kubectl get all -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-xmst5        0/1     Completed   0          87s
pod/ingress-nginx-admission-patch-cgtwl         0/1     Completed   1          87s
pod/ingress-nginx-controller-57b7568757-fpn5s   1/1     Running     0          87s

NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
service/ingress-nginx-controller-admission   ClusterIP      10.43.145.184   <none>          443/TCP                      87s
service/ingress-nginx-controller             LoadBalancer   10.43.35.137    172.23.13.179   80:32720/TCP,443:30940/TCP   88s
                                                                                                                                                                                   NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           87s
                                                                                                                                                                                   NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-57b7568757   1         1         1       87s
                                                                                                                                                                                   NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           19s        87s
job.batch/ingress-nginx-admission-patch    1/1           19s        87s

Ingress

Ingressが接続するService, Podを作成する。

$ cat > nginx-pod-svc.yaml << "EOF"
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
EOF

Ingressを作成する。

$ cat > ingress.yaml << "EOF"
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: nginx-ingress.test
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80
EOF

それぞれのマニフェストファイルを適用してデプロイする。

$ kubectl apply -f nginx-pod-svc.yaml
$ kubectl apply -f ingress.yaml

#確認
$ kubectl get pod,svc,ingress
NAME                                              READY   STATUS    RESTARTS   AGE
pod/nginx                                         1/1     Running   0          70s

NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
service/nginx-svc                    ClusterIP   10.43.255.87    <none>        80/TCP              70s

NAME                                      CLASS   HOSTS                ADDRESS         PORTS   AGE
ingress.networking.k8s.io/nginx-ingress   nginx   nginx-ingress.test   172.23.13.179   80      56s

ingressで定義したホスト名を解決できるように、/etc/hostsに設定を追記する。

$ sudo vim /etc/hosts
(省略)
172.23.13.179 nginx-ingress.test
(省略)

最後に、IngressコントローラーとIngressを通してアクセスできることを確認する。

#portの確認
$ kubectl get svc -n ingress-nginx
NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.43.35.137    172.23.13.179   80:32720/TCP,443:30940/TCP   88s

#アクセス確認
$ curl http://nginx-ingress.test:32720
(省略)
<h1>Welcome to nginx!</h1>
(省略)

#これでもアクセス確認ができた。なぜ?
$ curl http://nginx-ingress.test
(省略)
<h1>Welcome to nginx!</h1>
(省略)

ソースコード

使用したソースコードを以下に格納する。

test/kubernetes/ingress at main · InoueReo0406/test · GitHub

その他

Istioをコントローラとして使用するなら以下を参考にしたらできそうである。Ingressを通してgRPCも試してみたい。

istio.io

参考

christina04.hatenablog.com