【Kubernetes】動かして理解するIngress

はじめに

KubernetesのIngressについて実際にローカルで動かしながらイメージを掴んでいきます。

DeploymentやServiceについては、ある程度概要を理解している前提で説明しているので、それぞれの理解が不十分な方は下記を参照してください。

【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod
はじめにKubernetesでは覚えることがたくさんありますが、今回は基本的なKubernetesオブジェクトであるDeployment/ReplicaSet/Podを動かしながらざっくり解説したいと思います。DeploymentとRe...
【Kubernetes】Serviceを作成してローカルPCからアクセスしてみる
はじめにKubernetesのServiceについてざっくり理解してから実際に動かして、ローカルPCからアクセスしてみたいと思います。DeploymentとReplicaSet、Podについてはある程度理解している前提で解説しています。...

Ingressとは

Ingressとは 、クラスタ外からServiceへのアクセスを管理するオブジェクトです。パスベースでアクセス先となるServiceを切り替えることができます。(L7層レベルの制御)

イメージとしては、以下のようになります。

準備

ここからはローカルでIngressを利用するための準備をします。

Ingressを利用するためにはIngressコントローラが必要です。コントローラがないとIngressにアクセスすることができません。

ここではingress-nginxというコントローラを利用します。

GitHub - kubernetes/ingress-nginx: NGINX Ingress Controller for Kubernetes
NGINX Ingress Controller for Kubernetes. Contribute to kubernetes/ingress-nginx development by creating an account on GitHub.

下記コマンドでIngressコントローラを作成します。

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

バージョンは変わっている可能性があるので、下記を参照してください。

Installation Guide - NGINX Ingress Controller

下記のようになっていれば起動しています。

❯ kubectl get -n ingress-nginx service,deployment,pod
NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   10.109.211.144   localhost     80:31277/TCP,443:31621/TCP   122m
service/ingress-nginx-controller-admission   ClusterIP      10.109.208.179   <none>        443/TCP                      122m

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           122m

NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-gjbqp        0/1     Completed   0          122m
pod/ingress-nginx-admission-patch-qlht4         0/1     Completed   0          122m
pod/ingress-nginx-controller-5c8d66c76d-prl4c   1/1     Running     0          122m

Ingressを使ってServiceにアクセス

実際にIngressを使ってServiceにアクセスしていきます。

まずはPodを管理するDeploymentのマニフェストdeployment.ymlを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: web-container
        image: nginx
        ports:
          - containerPort: 80

次にServiceのマニフェストservice.ymlを作成します。

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
  labels:
    app: myapp-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: ClusterIP

最後にIngressのマニフェストingress.ymlを作成します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
spec:
  ingressClassName: "nginx"
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80

ingress-nginxを利用する場合は、ingressClassName: "nginx"を忘れないようにします。

kubernetes.io/ingress.classアノテーションでも指定できるようですが、ドキュメントで非推奨と記載されているので、なるべくingressClassNameを利用します。

Ingress
FEATURE STATE: Kubernetes v1.19 クラスター内のServiceに対する外部からのアクセス(主にHTTP)を管理するAPIオブジェクトです。 Ingressは負荷分散、SSL終端、名前ベースの仮想ホスティングの機能を提供します。 用語 簡単のために、このガイドでは次の用語を定義します。 ...

作成したマニフェストを反映します。

❯ kubectl apply -f deployment.yml
deployment.apps/myapp created

❯ kubectl apply -f service.yml
service/myapp-service created

❯ kubectl apply -f ingress.yml
ingress.networking.k8s.io/myapp created

作成できているか確認してみます。

❯ kubectl get deployment,service,ingress
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp   3/3     3            3           80s

NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/myapp-service   ClusterIP   10.99.112.36   <none>        80/TCP    69s

NAME                              CLASS   HOSTS   ADDRESS     PORTS   AGE
ingress.networking.k8s.io/myapp   nginx   *       localhost   80      63s

ブラウザからhttp://localhostにアクセスするとnginxの画面が確認できます。

まとめ

  • IngressはServiceを外部に公開しルーティングする

参考

タイトルとURLをコピーしました