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

2021.10.20
2024.03.24
Kubernetes
Ingress

本ページはAmazonアフィリエイトのリンクを含みます。

はじめに

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

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

【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod

【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

【Kubernetes】Serviceを作成してローカルPCからアクセスしてみる

【Kubernetes】Serviceを作成してローカルPCからアクセスしてみる

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

Ingressとは

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

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

準備

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

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

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

GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for Kubernetes

GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for Kubernetes

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

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

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

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

Installation Guide - Ingress-Nginx Controller

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

1❯ kubectl get -n ingress-nginx service,deployment,pod
2NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
3service/ingress-nginx-controller             LoadBalancer   10.109.211.144   localhost     80:31277/TCP,443:31621/TCP   122m
4service/ingress-nginx-controller-admission   ClusterIP      10.109.208.179   <none>        443/TCP                      122m
5
6NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
7deployment.apps/ingress-nginx-controller   1/1     1            1           122m
8
9NAME                                            READY   STATUS      RESTARTS   AGE
10pod/ingress-nginx-admission-create-gjbqp        0/1     Completed   0          122m
11pod/ingress-nginx-admission-patch-qlht4         0/1     Completed   0          122m
12pod/ingress-nginx-controller-5c8d66c76d-prl4c   1/1     Running     0          122m

Ingressを使ってServiceにアクセス

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

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

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5  labels:
6    app: myapp
7spec:
8  replicas: 3
9  selector:
10    matchLabels:
11      app: myapp
12  template:
13    metadata:
14      labels:
15        app: myapp
16    spec:
17      containers:
18      - name: web-container
19        image: nginx
20        ports:
21          - containerPort: 80

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

1apiVersion: v1
2kind: Service
3metadata:
4  name: myapp-service
5  labels:
6    app: myapp-service
7spec:
8  ports:
9  - port: 80
10    protocol: TCP
11    targetPort: 80
12  selector:
13    app: myapp
14  type: ClusterIP

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

1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4  name: myapp
5spec:
6  ingressClassName: "nginx"
7  rules:
8  - http:
9      paths:
10      - path: /
11        pathType: Prefix
12        backend:
13          service:
14            name: myapp-service
15            port:
16              number: 80

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

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

Ingress

Ingress

FEATURE STATE: Kubernetes v1.19 [stable] クラスター内のServiceに対する外部からのアクセス(主にHTTP)を管理するAPIオブジェクトです。 Ingressは負荷分散、SSL終端、名前ベースの仮想ホスティングの機能を提供します。 用語 簡単のために、このガイドでは次の用語を定義します。 ノード: Kubernetes内のワーカーマシンで、クラスターの一部です。 クラスター: Kubernetesによって管理されているコンテナ化されたアプリケーションを実行させるノードの集合です。この例や、多くのKubernetesによるデプロイでは、クラスター内のノードはインターネットに公開されていません。 エッジルーター: クラスターでファイアウォールのポリシーを強制するルーターです。クラウドプロバイダーが管理するゲートウェイや、物理的なハードウェアの一部である場合もあります。 クラスターネットワーク: 物理的または論理的な繋がりの集合で、Kubernetesのネットワークモデルによって、クラスター内でのコミュニケーションを司るものです。 Service: ラベルセレクターを使ったPodの集合を特定するKubernetes Serviceです。特に指定がない限り、Serviceはクラスターネットワーク内でのみ疎通可能な仮想IPを持つものとして扱われます。 Ingressとは何か Ingressはクラスター外からクラスター内ServiceへのHTTPとHTTPSのルートを公開します。トラフィックのルーティングはIngressリソース上で定義されるルールによって制御されます。 全てのトラフィックを単一のServiceに送る単純なIngressの例を示します。 図. Ingress IngressはServiceに対して、外部疎通できるURL、負荷分散トラフィック、SSL/TLS終端の機能や、名前ベースの仮想ホスティングを提供するように設定できます。Ingressコントローラーは通常はロードバランサーを使用してIngressの機能を実現しますが、エッジルーターや、追加のフロントエンドを構成してトラフィックの処理を支援することもできます。 Ingressは任意のポートやプロトコルを公開しません。HTTPやHTTPS以外のServiceをインターネットに公開する場合、Service.Type=NodePortやService.Type=LoadBalancerのServiceタイプを一般的には使用します。 Ingressを使用する上での前提条件 Ingressを提供するためにはIngressコントローラーが必要です。Ingressリソースを作成するのみでは何の効果もありません。 ingress-nginxのようなIngressコントローラーのデプロイが必要な場合があります。いくつかのIngressコントローラーの中から選択してください。 理想的には、全てのIngressコントローラーはリファレンスの仕様を満たすはずです。しかし実際には、各Ingressコントローラーは微妙に異なる動作をします。 備考:Ingressコントローラーのドキュメントを確認して、選択する際の注意点について理解してください。 Ingressリソース Ingressリソースの最小構成の例は以下のとおりです。 service/networking/minimal-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minimal-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx-example rules: - http: paths: - path: /testpath pathType: Prefix backend: service: name: test port: number: 80 IngressにはapiVersion、kind、metadataやspecフィールドが必要です。Ingressオブジェクトの名前は、有効なDNSサブドメイン名である必要があります。設定ファイルに関する一般的な情報は、アプリケーションのデプロイ、コンテナの設定、リソースの管理を参照してください。Ingressでは、Ingressコントローラーに依存しているいくつかのオプションの設定をするためにアノテーションを一般的に使用します。例としては、rewrite-targetアノテーションなどがあります。Ingressコントローラーの種類が異なれば、サポートするアノテーションも異なります。サポートされているアノテーションについて学ぶためには、使用するIngressコントローラーのドキュメントを確認してください。 Ingress Specは、ロードバランサーやプロキシサーバーを設定するために必要な全ての情報を持っています。最も重要なものとして、外部からくる全てのリクエストに対して一致したルールのリストを含みます。IngressリソースはHTTP(S)トラフィックに対してのルールのみサポートしています。 ingressClassNameが省略された場合、デフォルトのIngressClassを定義する必要があります。 デフォルトのIngressClassを定義しなくても動作するIngressコントローラーがいくつかあります。例えば、Ingress-NGINXコントローラーはフラグ --watch-ingress-without-classで設定できます。ただし、下記のようにデフォルトのIngressClassを指定することを推奨します。

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

1❯ kubectl apply -f deployment.yml
2deployment.apps/myapp created
3
4❯ kubectl apply -f service.yml
5service/myapp-service created
6
7❯ kubectl apply -f ingress.yml
8ingress.networking.k8s.io/myapp created

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

1❯ kubectl get deployment,service,ingress
2NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
3deployment.apps/myapp   3/3     3            3           80s
4
5NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
6service/myapp-service   ClusterIP   10.99.112.36   <none>        80/TCP    69s
7
8NAME                              CLASS   HOSTS   ADDRESS     PORTS   AGE
9ingress.networking.k8s.io/myapp   nginx   *       localhost   80      63s

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

まとめ

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee