kind で Ingress を使って nginx を動かす

kubernetes

kubernetes のマルチノードをローカル環境でも構築できる
kind(Kubernetes in Docker) を使って、macOS で最小限の手順で Ingress + nginx を使ってローカルでバーチャルホストを実現できるようにします。

Ingressとは
https://kubernetes.io/docs/concepts/services-networking/ingress

以下の書籍を参考にさせていただきました。

Kubernetes小学校 夏休みのしおり

macOS Catalina で動作確認済み

kind のインストールは以下の記事を参考にしてください。
https://nomad.office-aship.info/kind-nginx

cluster.ymlを用意します

cluster.yml


kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
kubeadmConfigPatches:
- |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
        authorization-mode: "AlwaysAllow"

クラスターを作成します

% kind create cluster --config cluster.yml 

Contour というのを設定(Contourが何かよくわかってませんが、中身は Namespaceや ServiceAccount、ConfigMap等を設定しているようです)

% kubectl apply -f https://projectcontour.io/quickstart/contour.yaml

内容確認

% kubectl get all -n projectcontour

デプロイを設定

% kubectl create deploy app-a --image=nginx
% kubectl create deploy app-b --image=nginx

サービスを設定

% kubectl expose deploy/app-a --type NodePort --port 80 --target-port 80
% kubectl expose deploy/app-b --type NodePort --port 80 --target-port 80

確認

% kubectl get po,svc

app-a の方にテキストを配置

% echo 'Hello! This is App A!' > test.txt
% kubectl cp test.txt $(kubectl get po -l app=app-a -o name | cut -d '/' -f 2):/usr/share/nginx/html/

app-b の方にテキストを配置

% echo 'Hello! This is App B!' > test.txt
% kubectl cp test.txt $(kubectl get po -l app=app-b -o name | cut -d '/' -f 2):/usr/share/nginx/html/

ingress.ymlを作成します

ingress.yml は、参考にさせていただいた書籍の内容では、
apiVersionが networking.k8s.io/v1alpha4 で kind 0.9.0 では serviceName がない、というエラーが出て動作しませんでした。

調査して、networking.k8s.io/v1 に書き換えて、serviceName の部分も service: name: に書き換えました。

ingress.yml


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-nginx
spec:
  rules:
  - host: a.example.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: app-a
            port:
              number: 80
  - host: b.example.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: app-b
            port:
              number: 80

Ingress を設定

% kubectl apply -f ingress.yml

/etc/hosts を書き換えます

% sudo vi /etc/hosts

/etc/hosts に以下の行を追加してくだい

127.0.0.1 a.example.com
127.0.0.1 b.example.com

以下のURLにブラウザでアクセスして画像のように表示されれば成功です。

http://a.example.com/test.txt

http://b.example.com/test.txt

kubernetes の学習にオススメの本

Kubernetes完全ガイド 第2版 impress top gearシリーズ

みんなのDocker/Kubernetes

Docker/Kubernetes 実践コンテナ開発入門

コメント

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