【Kubernetes】動かして理解するIngress
はじめに
KubernetesのIngressについて実際にローカルで動かしながらイメージを掴んでいきます。
DeploymentやServiceについては、ある程度概要を理解している前提で説明しているので、それぞれの理解が不十分な方は下記を参照してください。
【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
【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
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
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を外部に公開しルーティングする
参考
- Ingress | Kubernetes
- Ingressコントローラー | Kubernetes
- Installation Guide - NGINX Ingress Controller
- kubernetes/ingress-nginx: NGINX Ingress Controller for Kubernetes
- Kubernetes Ingress on Docker Desktop - Stack Overflow