LoginSignup
0
0

[k8s] VPS上で立てたkubernetesクラスタを公開してみた話

Last updated at Posted at 2023-12-06

はじめに

この記事は「お家Kubernetes環境を作ろう」シリーズの1つです。前回はminikube上でNext.js + nginxサーバーを立てるところまで行いました。

今回は、前々回↓構築したVPS上のkubernetesクラスタ上にNext.js + nginxのサーバーをデプロイしようと思います。

完成品はGithub上に公開してありますので参考程度にどうぞ
(kubernetes/metallbkubernetes/portfolioが今回扱う対象です)。
https://github.com/piny940/infra/tree/main/kubernetes

環境

  • lemon: Kagoya Cloud VPS 2コア 2GB
  • lime: Kagoya Cloud VPS 2コア 2GB

(lemonやlimeはマシン名です)

  • デプロイツール: kubeadm
  • CRI: cri-dockerd
  • CNI: Weave net

ingress-nginxをインストール

まずはingress-nginxをインストールします。(私はこれを忘れて数十分悩んだ)

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

MetalLBをインストール

次にMetalLBをインストールします。
これは何かと言うと、AWS等のクラウドが提供しているk8sサービス(EKSとか)はtype=LoadBalancerであるServiceに対して外からアクセスする仕組みを提供してくれているのですが、VPSやオンプレミスのサーバーではその仕組みが存在しないため、代わりにServiceを外部に公開する仕組みを提供してくれるものです。
MetalLBについての詳しい説明はこのサイトが分かりやすかったです。
https://blog.framinal.life/entry/2020/04/16/022042

ドキュメントに従ってインストールをしていきます。

# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system

# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system$ kubectl edit configmap -n kube-system kube-proxy

次回以降kubeadm initしたときにこの設定をしなくてもいいように、kubeadm-config.yamlに次のコードを書き足します。

kubeadm-config.yaml
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

インストールはkustomizeを使って行いました。

metallb/kustomization.yaml
namespace: metallb-system

resources:
  - github.com/metallb/metallb/config/native?ref=v0.13.12

IPAddressPool, L2Advertisementの設定を記述します。

metallb/config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default
  namespace: metallb-system
spec:
  addresses:
    - 192.168.11.61-192.168.11.70
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metallb-system
spec:
  ipAddressPools:
    - default

kustomization.yamlでこの設定ファイルをresourcesに追加しておきます。

metallb/kustomization.yaml
namespace: metallb-system

resources:
  - github.com/metallb/metallb/config/native?ref=v0.13.12
  - config.yaml

最後にkubectl applyします。

$ kubectl apply -k metallb

Next.jsのデプロイ

Next.jsアプリのデプロイです。

$ kubectl apply -k .

これでデプロイ作業は完了です。serviceを見てみるとingress-nginx-controllerにEXTERNAL-IPが設定されていると思います。

kubectl get service -A
NAMESPACE        NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
default          kubernetes                           ClusterIP      10.96.0.1        <none>          443/TCP                      4d7h
default          {アプリ名}                            ClusterIP      10.106.129.21    <none>          4400/TCP                     8h
ingress-nginx    ingress-nginx-controller             LoadBalancer   10.109.36.122    192.168.11.61   80:30292/TCP,443:31968/TCP   6h22m
ingress-nginx    ingress-nginx-controller-admission   ClusterIP      10.106.213.123   <none>          443/TCP                      6h22m
kube-system      kube-dns                             ClusterIP      10.96.0.10       <none>          53/UDP,53/TCP,9153/TCP       4d7h
metallb-system   webhook-service                      ClusterIP      10.111.253.56    <none>          443/TCP                      3m1s

VPS上でEXTERNAL-IPのアドレスにcurlすると確かにnginxのページが返ってきます。

$ curl 192.168.11.61

cloudflareで公開

このままだとEXTERNAL-IPに外部からアクセスすることが出来ません。
これがいい方法なのかはわからないのですが、私はCloudflare Tunnelを使って公開することにしました。
CloudflareのコンソールからZero Trust > Access > Tunnelsを開き、「Create a tunnel」からTunnelを作成します。
image.png

Subdomainにはingress-nginxで指定したサブドメインを使用し、URLにはServiceのIPとポートを指定します。
image.png

これでCloudflareに設定したアドレスにアクセスするとNext.jsのページが表示されるようになるはずです!

最後に

今回はVPSで立てているkubernetesクラスタ上でNext.js + nginxサーバーを立てて公開する作業を行いました。
次回はいよいよお家kubernetesクラスタ作りに取り掛かりたいと思います。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0