※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。

<前のページ
【Kubernetes】Serviceの各タイプについて解説
次のページ>
【Kubernetes】Ingressで複数のServiceをパスごとに公開

【Kubernetes】MinikubeでIngressによるServiceの公開方法の解説

kubernetes 負荷分散 Ingress Minikube インフラ k8s サーバー開発

投稿日:2020年10月19日

このエントリーをはてなブックマークに追加
IngressはServiceを公開するためのリソースです。 この記事ではMinikubeでのIngressの使い方と解説をしています。

はじめに

この記事について

IngressはServiceを公開するためのリソースです。

この記事ではMinikubeでのIngressの使い方と解説をしています。

環境

  • kubectl version 1.19.2
  • minikube version 1.13.1

Ingressとは

Ingressの公式による定義は以下のようになっています。

クラスター内のServiceに対する外部からのアクセス(主にHTTP)を管理するAPIオブジェクトです。

Ingressは負荷分散、SSL終端、名前ベースの仮想ホスティングの機能を提供します。

Ingressコントローラー

Ingressリソースを作成しただけでは何も起こりません。これが動作するにはIngressコントローラーと呼ばれるものが必要になります。


実践(その1)

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の各タイプについて解説をご覧ください。

deployment.yaml
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

Ingressルールを作成

次にyamlファイルからingressルールを作成します。

ingress.yaml
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を編集します。

/etc/hosts
[...]

192.168.39.30 hello-world.info

[...]

ファイルを保存したらブラウザからhttp://helo-world.infoにアクセスできるかどうか確認してみます。

▲Nginxのサンプルページ

念の為IPアドレスでアクセスしてみます。

▲IPアドレスでアクセスした際のエラーページ

これはServiceが単にNodeの80番ポートに公開されているわけではなく、ちゃんとIngressによってコントロールされていることを表しています。

このエントリーをはてなブックマークに追加

<前のページ
【Kubernetes】Serviceの各タイプについて解説
次のページ>
【Kubernetes】Ingressで複数のServiceをパスごとに公開

関連記事

記事へのコメント