VPSに乗せていたappを自宅のオンプレに移す試み(ingress-nginx-controllerとmetalLBのところ)

スポンサーリンク
個人開発

はじめに

今回は、さくらインターネットの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)

参考は以下のサイト👇

オンプレKubernetes環境にMetallbをインストールしてLoadbalanserServiceを利用できるようにする
$ 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のところは実装できました。

外からのアクセスによる挙動確認がまだなので、次回アプリを乗せて動くかアクセスして確認していきます。

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