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
参考書籍
仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん – 2021/2/1
Kubernetes小学校 夏休みのしおり – 2020/9/18
Kubernetes完全ガイド 第2版 – 2020/8/7
実践入門 Kubernetesカスタムコントローラーへの道 (技術の泉シリーズ(NextPublishing)) – 2020/2/28
みんなのDocker/Kubernetes – 2019/4/18
Docker/Kubernetes 実践コンテナ開発入門 – 2018/8/25
コメント