【k8s】尝试在VPS上搭建的Kubernetes集群进行公开的经历
首先
这篇文章是”创建家中的Kubernetes环境”系列的一部分。上一篇文章已经介绍了在minikube上搭建Next.js + nginx服务器的步骤。
这次,我打算在之前搭建的VPS上的Kubernetes集群上部署Next.js + Nginx服务器。
我已经把完成品放在Github上进行了公开,仅供参考,请查看。
(本次涉及的项目是kubernetes/metallb和kubernetes/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)可以为类型为LoadBalancer的Service提供从外部访问的机制。但在VPS或本地服务器上,这种机制并不存在。因此,MetalLB可以提供一种让Service在外部公开访问的替代方式。
关于MetalLB的详细说明,这个网站讲得很清楚。
我会按照文件的指示进行安装。
# 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文件中。
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
使用Kustomize进行了安装。
namespace: metallb-system
resources:
- github.com/metallb/metallb/config/native?ref=v0.13.12
記述IPAddressPool和L2Advertisement的设置。
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中。
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 .
我认为通过查看服务,我们可以确认Ingress-Nginx控制器已经设置了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上发布
只要访问已在 Cloudflare 中设置的地址,应该可以显示 Next.js 的页面!
最終的に
這次我們在 VPS 上建立了 Kubernetes 集群,並部署了 Next.js + nginx 伺服器進行公開。下次我們將著手建立家用 Kubernetes 集群。
请查阅相关资料。