はじめに
Kubernetesのリソースの一つであるIngressの動作を確認し、Kubernetesクラスタネットワーク外部からアクセスを待ち受けられるようにする。
環境
- Windows11(ホストOS)
- Ubuntu22.04.3(ゲストOS、WSL2)
- k3s v1.29.4+k3s1
Ingressについて
IngressはIngressのリソースそのものに加えて、Ingressを提供するためにはIngressコントローラーが必要である。 Ingressコントローラーとして以下のようなものがある。
今回はNginxのIngressコントローラーを使用する。
構築と動作確認
構築イメージ
Ingressコントローラー
上記を参考に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も試してみたい。