投稿日:2020年10月19日
IngressはServiceを公開するためのリソースです。 この記事ではMinikubeでのIngressの使い方と解説をしています。
IngressはServiceを公開するためのリソースです。
この記事ではMinikubeでのIngressの使い方と解説をしています。
Ingressの公式による定義は以下のようになっています。
クラスター内のServiceに対する外部からのアクセス(主にHTTP)を管理するAPIオブジェクトです。
Ingressは負荷分散、SSL終端、名前ベースの仮想ホスティングの機能を提供します。
Ingressリソースを作成しただけでは何も起こりません。これが動作するにはIngressコントローラーと呼ばれるものが必要になります。
Ingressを使用するにはIngressコントローラーを実行する必要があります。
MinikubeではデフォルトでIngressコントローラーがaddonとして用意されています。
まずはIngressコントローラーが有効化されているかどうか確認してみます。
$ minikube addons list
|-----------------------------|----------|--------------|
| ADDON NAME | PROFILE | STATUS |
|-----------------------------|----------|--------------|
| ambassador | minikube | disabled |
| csi-hostpath-driver | minikube | disabled |
| dashboard | minikube | disabled |
| default-storageclass | minikube | enabled ✅ |
| efk | minikube | disabled |
| freshpod | minikube | disabled |
| gcp-auth | minikube | disabled |
| gvisor | minikube | disabled |
| helm-tiller | minikube | disabled |
| ingress | minikube | enabled ✅ |
| ingress-dns | minikube | disabled |
| istio | minikube | disabled |
| istio-provisioner | minikube | disabled |
| kubevirt | minikube | disabled |
| logviewer | minikube | disabled |
| metallb | minikube | disabled |
| metrics-server | minikube | disabled |
| nvidia-driver-installer | minikube | disabled |
| nvidia-gpu-device-plugin | minikube | disabled |
| olm | minikube | disabled |
| pod-security-policy | minikube | disabled |
| registry | minikube | disabled |
| registry-aliases | minikube | disabled |
| registry-creds | minikube | disabled |
| storage-provisioner | minikube | enabled ✅ |
| storage-provisioner-gluster | minikube | disabled |
| volumesnapshots | minikube | disabled |
|-----------------------------|----------|--------------|
もしIngressのところがdisabledになっていた場合には有効化させましょう。
$ minikube addons enable ingress
🔎 Verifying ingress addon...
🌟 The 'ingress' addon is enabled
有効化させたら、IngressコントローラーのPodが起動しているかどうか確認してみます。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-f9fd979d6-4v8qh 1/1 Running 0 58m
etcd-minikube 1/1 Running 0 58m
ingress-nginx-admission-create-rwbgs 0/1 Completed 0 30m
ingress-nginx-admission-patch-b4t8t 0/1 Completed 0 30m
ingress-nginx-controller-789d9c4dc-sp6dt 1/1 Running 0 30m
kube-apiserver-minikube 1/1 Running 0 58m
kube-controller-manager-minikube 1/1 Running 0 58m
kube-proxy-cwnrw 1/1 Running 0 58m
kube-scheduler-minikube 1/1 Running 0 58m
storage-provisioner 1/1 Running 0 58m
まずはサンプルのアプリケーションとしてNginxイメージをNodePort経由で公開してみます。
ServiceのNodePortについて詳しくは【Kubernetes】Serviceの各タイプについて解説をご覧ください。
apiVersion: v1
kind: Service
metadata:
name: webapp1-nodeport-svc
labels:
app: webapp1-nodeport-svc
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
selector:
app: webapp1-nodeport-pod
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp1-nodeport-deployment
spec:
replicas: 2
selector:
matchLabels:
app: webapp1-nodeport-pod
template:
metadata:
labels:
app: webapp1-nodeport-pod
spec:
containers:
- name: webapp1-nodeport-container
image: nginx:1.18.0-alpine
ports:
- containerPort: 80
---
yamlファイルを適用させます。
$ kubectl apply -f deployment.yaml
今Nodeのポート越しにサービスにアクセスできるようになっています。
$ minikube service webapp1-nodeport-svc --url
http://192.168.39.30:30551
次にyamlファイルからingressルールを作成します。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: sample-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
backend:
serviceName: webapp1-nodeport-svc
servicePort: 8080
.spec.rules.hostで対象のHostを設定します。
.spec.rules.http.paths.pathでパスを設定しています。今回の場合hello-world.infoのルートパスをwebapp1-nodeport-svcのポート8080番に流すように設定します。
$ kubectl apply -f ingress.yaml
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/sample-ingress created
今回使用したkubectlはバージョン1.19なのですが、1.22ではnetworking.k8s.io/v1beta1が削除されるようでdepricatedになっています。
とりあえずこのまま続行。
作成されたIngressリソースを確認してみます。
$ kubectl get ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
sample-ingress <none> hello-world.info 192.168.39.30 80 27m
実際に公開するサービスではドメインプロバイダーからドメインを購入し、Ingressの.spec.rules.hostに購入したドメインを設定し、DNSサーバーにNodeのIPアドレスを設定することでアクセスできる様になります。
今回設定したドメインは仮のドメインで実際には購入したドメインではないので/etc/hostを編集します。
[...]
192.168.39.30 hello-world.info
[...]
ファイルを保存したらブラウザからhttp://helo-world.infoにアクセスできるかどうか確認してみます。
念の為IPアドレスでアクセスしてみます。
これはServiceが単にNodeの80番ポートに公開されているわけではなく、ちゃんとIngressによってコントロールされていることを表しています。