【Kubernetesリソースシリーズ第八弾】Ingressについて知る!

10月 11, 2023

どもです。サンローランはハイブランドおじさんの巣窟だと勝手に僻んでいるsaisaiです。


今回はkubernetesリソースの一つであるIngressについて学習したことを記事にしたいと思います。


クラスター内への通信などに欠かせないリソースですので、こちらもしっかり抑えたいと思います。


※本ブログこちらの記事を参考にminikubeの環境構築を行った方はnoneドライバがingress controllerをサポートしていない関係上、以下の操作を行った上で検証を行っていただきますようお願いいたします。

$ minikube stop
$ minikube delete
$ usermod -aG docker ec2-user && newgrp docker
$ minikube start --driver=docker
$ minikube addons enable ingress

それでは早速挑戦してみましょう!

Ingressとは

Ingressとはコンテナを外部公開したり、L7ロードバランサーとしてURLによるサービス切り替えを実現したりすることができるリソースです。kubernetesで構築したサービスの公開に欠かせないリソースですね!


ではマニフェストファイルの一例をみてみたいと思います。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false" #SSLリダイレクトは今回は無効化
spec:
  rules:
  - http:
      paths:
      - path: / #パスの指定(今回はルート)
        pathType: Prefix
        backend: #以下パスに応じた転送先の指定
         service:
            name: web-service
            port: #ポートの指定
              number: 80

上記のように外部から接続する際の情報を管理しているのがIngressといえそうです。

実際に接続してみる

それでは実際にPodを作成し、Ingressを紐づけて外部からアクセスしてみましょう。


今回はPodの作成リソースとしてDeploymentとServiceを使用します。

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
    env: test
  ports:
  - port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
      env: test
  template:
    metadata:
      name: nginx
      labels:
        app: web
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.2-alpine

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
         service:
            name: web-service
            port:
              number: 80

それではリソース達を作成します。

$ kubectl apply -f ingress.yml
service/web-svc created
deployment.apps/nginx created

作成されたリソースを確認してみましょう。

$ kubectl get ing,svc,deploy
NAME                                 CLASS    HOSTS   ADDRESS        PORTS   AGE
ingress.networking.k8s.io/test   <none>   *       192.168.49.2   80      8m25s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   10m
service/web-svc      ClusterIP   10.99.148.8   <none>        80/TCP    8m25s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   2/2     2            2           8m25s

Ingressによってサービス接続用IPアドレス(外部アドレス)がふられています!早速接続確認してみましょう!

$ curl 192.168.49.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

IPアドレスを使用して無事Nginxに接続できることが確認できました!

ひとこと

今回はIngressについて学習したことを記事にしてみました!


本来はブラウザからNginxの起動を確認したかったのですが、AWSを使用している以上ローカルIPでブラウザ接続する方法が分からず断念しました…。同じサブネットにWindowsインスタンスを立ち上げて接続したりすれば確認できたのだろうか…。


まぁ本番運用する際はEC2にminikubeを入れてkubernetesを運用するということはまずないと思うので今回はあくまで検証ということで多めにみていただければありがたいです!


ここまで読んでいただきありがとうございました!


-saisai-


↓オススメ教材

kubernetes

Posted by CY