我们在裸机云(OVH Cloud)上的一台虚拟机上部署了 Minikube。
- Kubernetes 版本:v1.28.3
- 安装方式:Minikube
- 主机操作系统:Debian 10
- CRI 和版本:docker://24.0.7
我们已经部署了 Nginx Ingress 和 MetalLB,但找不到从外部(服务器的公共 IP)连接到集群的方法。我们想要做的是有一个单一的集群入口点,监听 :80 和 :443,然后将请求分发到集群内的目标服务。
如果我们尝试与 Web 应用程序进行内部通信(带有卷曲)它给了我们一个回应,但没有办法从互联网上得到同样的回应
可能重复的(我见过它们,但似乎对我们不起作用):
- https://stackoverflow.com/questions/66223566/adding-public-ip-to-nginx-ingress-controller-with-metallb
- https://stackoverflow.com/questions/57031505/metallb-with-nginx-ingress-controller-on-minkube-keeps-resetting-external-ip-for
- https://stackoverflow.com/questions/57099703/metallb-external-ip-to-internet
请记住我是 Kubernetes 的新手。
基本上我们遵循了这个教程(https://www.youtube.com/watch?v=k8bxtsWe9qw)
使用 Helm 部署 Nginx Ingress
helm install nginx-ingress oci://ghcr.io/nginxinc/charts/nginx-ingress --version 0.17.1 --namespace nginx-ingress
使用 MANIFEST 部署的 MetalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
IP地址池:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.XXX.XX.XX-192.XXX.XX.XX
对于我们尝试过的地址:
- minikube 内部 IP 范围在 10 个 IP 之间
- 我们也尝试使用 <minikube_internal_IP>/32 的单个 IP
- 我们还尝试使用 <SERVER_PUBLIC_IP>/32 的单个 IP
L2广告
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: homelab-l2
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
一个简单的APP部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app.kubernetes.io/name: web-app
name: web-app
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: web-app
template:
metadata:
labels:
app.kubernetes.io/name: web-app
spec:
containers:
- image: nginx
name: web-app
command:
- /bin/sh
- -c
- "echo 'welcome to my web app!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"
dnsConfig:
options:
- name: ndots
value: "2"
---
apiVersion: v1
kind: Service
metadata:
name: web-app
labels:
app.kubernetes.io/name: web-app
spec:
selector:
app.kubernetes.io/name: web-app
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
应用程序的入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-app
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: web-app.home-k8s.lab
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app
port:
number: 80