はじめに
今回は、さくらインターネットのVPS上に構築しているapp(Webサービス)を自宅のおうちk8sであるオンプレに移す経緯の第2回目です。
今回の構築部分
今回構築する部分は以下の赤塗になっている部分です。ingress-nginx-controllerとmetalLBの実装に取り掛かろうと思います。

ingress-nginx-controller
ingressってのもあるけど、ingressってpodに対してロードバランシングを行うk8sの機能を指していて、
一方で、ingress controllerってのはingressというリソースの設定に従って動く実態のことを指しています。
envoyベースとか、
HAProxyベースとか、
nginxベースとか、、、
色んなものがあって、それぞれがingressが定める使用を満たしつつ、独自の拡張機能を提供しています。
今回はnginxベースのingress controllerを使用するという訳です。
ingress controllerはhelm installで立ち上げます。
helm install ingress-nginx-1 ingress-nginx/ingress-nginx -n ingress-nginx
ちょっとpodを見てみると、
ingress-nginx-controllerのpodは一つだけです。
$ kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-1-controller-5548cd7c87-ffz86 1/1 Running 0 6h45m
なので、このpodの中にnginxがある事はなんとなくわかります。
でも、serviceというと、2つあります。
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-1-controller LoadBalancer 10.110.88.237 <pending> 80:31503/TCP,443:31414/TCP 6h16m
ingress-nginx-1-controller-admission ClusterIP 10.110.166.69 <none> 443/TCP 6h16m
ingress-nginx-controller:
外部に公開するIngress Controllerのエンドポイントingress-nginx-controller-admission
:Ingressリソースのチェックする時に使われる内部的なServiceリソース(実際に使う時は特に考えずに使っていてよい)
の2つとのことです。
参考:https://developer.mamezou-tech.com/containers/k8s/tutorial/ingress/ingress-nginx/
ingress
で、上記にも記載の通り、ingress controllerってのはingressというリソースの設定に従って動く実態です。
つまり、ingressリソースの設定をしてあげないといけない訳です。
以下に、設定したingressリソースの設定を参考のため載せておきます。
namespaceが2つあり、それぞれで別のサービスが動いているので、2つのingressを設定します。
①
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-slim-ingress
namespace: go-slim
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: "nginx"
rules:
- host: go-slim.cospa-tank.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-slim-frontend-svc
port:
number: 5173
②
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: change-view-ingress
namespace: change-view
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: "nginx"
rules:
- host: change-view.cospa-tank.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: change-view-frontend-svc
port:
number: 8080
今回はnginxベースのものを使用するのでingressClassName
フィールドにnginx
と記述しています。
さて、以下から分かるように、現状では、EXTERNAL-IPのところがingress-nginx-1-controllerはpendingになっています。
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-1-controller LoadBalancer 10.110.88.237 <pending> 80:31503/TCP,443:31414/TCP 6h16m
ingress-nginx-1-controller-admission ClusterIP 10.110.166.69 <none> 443/TCP 6h16m
これでは外部との通信ができません。
その時に登場するのが、metal LBです。
metalLB
過去にmetal LBは以下の記事でも取り上げました。
「自作Helm Chartのwordpressをブラウザで確認する①(案の定k8sが上手くいかない #8)」
参考は以下のサイト👇

$ helm repo add metallb https://metallb.github.io/metallb
$ kubectl create namespace metallb-system
$ helm install metallb metallb/metallb -n metallb-system
$ ip route | grep wlan
default via 192.168.40.1 dev wlan0 proto dhcp src 192.168.40.146 metric 600
192.168.40.0/24 dev wlan0 proto kernel scope link src 192.168.40.146 metric 600
例えば、自分の家のLANが192.168.40.0/24で、192.168.40.11~30のIPアドレスをLoadbalanserで利用可能にする場合は、以下になります。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 192.168.40.11-192.168.40.30
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- ingress-address-pool
$ kubectl apply -f metal_lb/configmap.yaml
ipaddresspool.metallb.io/default created
l2advertisement.metallb.io/default created
外部IPが割り当てられたことを確認できます👇。
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-1-controller LoadBalancer 10.110.88.237 192.168.40.11 80:31503/TCP,443:31414/TCP 13h
ingress-nginx-1-controller-admission ClusterIP 10.110.166.69 <none> 443/TCP 13h
最後の仕上げ
さて、外部IPとイングレスとingress controllerが揃ったので立ち上げていきます。
$ sudo cat /etc/hosts
・・・【略】・・・
192.168.40.11 go-slim.cospa-tank.com
192.168.40.11 change-view.cospa-tank.com
・・・【略】・・・
2つのingressを立ち上げます。
$ kubectl apply -f helm/helm_contents/ingress/go-slim-ingress.yaml -n go-slim
ingress.networking.k8s.io/go-slim-ingress created
$ kubectl apply -f helm/helm_contents/ingress/change-view-ingress.yaml -n change-view
ingress.networking.k8s.io/change-view-ingress created
curlでそれぞれにアクセスすると以下のようになっています。
$ curl go-slim.cospa-tank.com
<!doctype html>
<html lang="en">
<head>
<script type="module" src="/@vite/client"></script>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
$ curl change-view.cospa-tank.com
<!DOCTYPE html>
<html lang="">
<head>
<script type="module" src="/@vite/client"></script>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="/favicon.ico">
<title>Season App</title>
</head>
<body>
<noscript>
<strong>We're sorry but doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
<!-- built files will be auto injected -->
</body>
</html>
動いていることを確認できました。
最後に
一旦、ingress-nginx-controllerとmetalLBのところは実装できました。
外からのアクセスによる挙動確認がまだなので、次回アプリを乗せて動くかアクセスして確認していきます。