我已经使用kubespray创建了一个内部部署的kubernetes集群。集群由3个主节点和3个工作节点组成。我已经遵循了这个网站上的文档:https://www.linuxtechi.com/install-kubernetes-using-kubespray/
然后我使用这个github repo配置了MetalLB和nginx-ingress控制器:https://github.com/morrismusumi/kubernetes/blob/main/clusters/homelab-k8s/apps/metallb-plus-nginx-ingress/README.md
现在我的所有节点都可用,它们工作正常,但是当我在链接https://github.com/morrismusumi/kubernetes/blob/main/clusters/homelab-k8s/apps/metallb-plus-nginx-ingress/web-app-ingress.yml中部署示例webapp时,我无法从本地机器访问它,除非我输入“type:我的web-app-deployment.yaml中的“LoadBalancer
我的集群ip如下
- M01 -11.11.120.50
- M02 -11.11.120.51
- M03 -11.11.120.52
- W01 -11.11.120.53
- W02 -11.11.120.54
- W03 -11.11.120.55
对于我的metal-lb地址池,我使用11.11.120.150-11.11.120.170
当我使用“LoadBalancer”类型部署一个示例nginx Web应用程序时,它可以分配一个外部IP,当我 curl 到这个外部IP时,我可以成功地从本地看到输出“欢迎来到我的第一个网站”。当我将服务类型从LoadBalancer更改为Cluster IP并创建ingress yaml时,我可以在“kubectl get ingress”输出中看到外部IP地址。但在这种情况下,当我试图从我的本地机器 curl 我不能达到这个地址。如果我尝试从集群节点,我可以访问.
示例Web应用程序的清单文件如下所示:
web-deployment.yaml:
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
type: ClusterIP
web-app-ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: example-webapp.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app
port:
number: 80
我在/etc/hosts文件中添加了主机名和IP,如“11.11.120.151 example-webapp.com“
我的输入输出:
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
web-app <none> example-webapp.com 11.11.120.151 80 63m
我的服务输出:
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.x.x <none> 443/TCP 42h
web-app ClusterIP 10.233.x.x <none> 80/TCP 70m
顺便说一句,我把我的web应用服务externaldaticPolicy从Cluster改为Local。但一切都没有改变。
从我的本地机器到达它的唯一方法是使“类型:”““我开始的时候是这样的。虽然我可以通过LoadBalancer访问,但我不能通过Ingress访问。你能帮我解决这个问题吗?
先谢了。
1条答案
按热度按时间33qvvth11#
我解决了这个问题;
我没有使用官方nginx安装文档中的镜像,而是使用了Kubernetes自己网站上的镜像:https://kubernetes.github.io/ingress-nginx
(将nginx helm repo从oci://www.example.com更改为https://kubernetes.github.io/ingress-nginx)ghcr.io/nginxinc/charts/nginx-ingress
当我跟着这个医生时,我的问题得到了解决。实际上,不同之处在于它只创建了一个控制器和一个默认后端部署。当我在示例ingress yaml中应用它时(在spec下而不是annotation下编写ingressClassName),我的问题得到了解决,我能够成功地访问ingress资源。