Nginx Ingress 控制器设置问题
Nginx Ingress controller set up issues
我已经设置了一个裸机 k8 集群(1 个主节点 - intel NUC 和 Raspberry pi 上的 2 个工作节点)。我设法设置了一个 metal-lb 负载平衡和 nginx 入口控制器。我启动了两个应用程序,ghost(在默认端口 2368 上侦听)和 nextcloud(在默认端口 80 上侦听)。我正在尝试从 public ip myhomeserver.io(访问 ghost 应用程序)和 nextcloud.myhomeserver.io(访问下一个云应用程序)访问应用程序。我可以访问 ghost 应用程序,但我似乎无法访问 nextcloud.Given 下面是入口和服务的 yaml 文件。不确定我哪里出错了。
kubectl get services --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98d
ghost ghost-service ClusterIP 10.107.116.108 <none> 2368/TCP 7h37m
ingress-nginx ingress-nginx LoadBalancer 10.109.177.223 192.168.178.200 80:31619/TCP,443:30365/TCP 7d23h
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 98d
nextcloud nextcloud-service ClusterIP 10.105.24.162 <none> 8080/TCP 137m
=============================================================================================================================
NAMESPACE NAME HOSTS ADDRESS PORTS AGE
ghost ingress-ghost myhomeserver.io 192.168.178.200 80 7d22h
nextcloud ingress-nextcloud nextcloud.myhomeserver.io 192.168.178.200 80 140m
=============================================================================================================================
cat ingress-object-ghost.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-ghost
namespace: ghost
spec:
rules:
- host: myhomeserver.io
http:
paths:
- backend:
serviceName: ghost-service
servicePort: 2368
=============================================================================================================================
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nextcloud
namespace: nextcloud
spec:
rules:
- host: nextcloud.myhomeserver.io
http:
paths:
- backend:
serviceName: nextcloud-service
servicePort: 8080
================================================================================================================================
cat ingress-object-nextcloud.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nextcloud
namespace: nextcloud
spec:
rules:
- host: nextcloud.myhomeserver.io
http:
paths:
- backend:
serviceName: nextcloud-service
servicePort: 8080
===================================================================================
apiVersion: apps/v1
kind: Deployment
metadata:
name:
deployment-nextcloud
namespace: nextcloud
labels:
env: prod
app: nextcloud-app
spec:
template:
metadata:
name: nextcloud-app-pod
labels:
app: nextcloud-app
env: production
spec:
containers:
- name: nextcloud
image: arm32v7/nextcloud
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /var/www/html
name: nextcloud-data
securityContext:
privileged: True
volumes:
- name: nextcloud-data
persistentVolumeClaim:
claimName: pvc-nextcloud
nodeSelector:
kubernetes.io/arch: arm
replicas: 2
selector:
matchLabels:
app: nextcloud-app
================================================================================================================
apiVersion: v1
kind: Service
metadata:
name: nextcloud-service
namespace: nextcloud
labels:
app: nextcloud-app
spec:
type: ClusterIP
selector:
app: nextcloud-app
ports:
- port: 8080
targetPort: 8080
protocol: TCP
请注意,您的 nginx 入口控制器 运行 在 ghost 命名空间中,因此它只知道 ghost 服务。如果你想在那里有一个入口,你需要为你的 nextcloud 命名空间有另一个入口控制器。如果您不想要另一个入口控制器,那么您可以通过以下方式定位其 dns 来解析 nextcloud 服务 servicename.namespacename.svc.cluster.local
一方面,将您的应用程序划分得如此之多并没有什么意义。 Kubernetes 已经为您在同一命名空间中的应用程序之间提供了足够的隐私。
更新
Ingress 适合您,因为您只有 1 INGRESS CONTROLLER
。由于有两个服务,我添加了一个路径规则,该规则将被重写为 /
,因此每个服务都会收到一个干净的 URI。使用 myhomeserver.io/ghost
访问 ghost
,使用 myhomeserver.io/nextcloud
访问 nextcloud。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-ghost
namespace: ghost
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myhomeserver.io
http:
paths:
- path: /ghost
backend:
serviceName: ghost-service
servicePort: 2368
- path: /nextcloud
backend:
serviceName: nextcloud-service.nextcloud.svc.cluster.local
servicePort: 8080
更新 2
所以你的 ingress controller
在 ghost 命名空间中是 运行。因此,您的入口 必须部署在 ghost 命名空间中。 请注意每个主机的 http 规则。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-ghost
namespace: ghost
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myhomeserver.io
http:
paths:
- path: /
backend:
serviceName: ghost-service
servicePort: 2368
- host: nextcloud.myhomeserver.io
http:
- path: /
backend:
serviceName: nextcloud-service.nextcloud.svc.cluster.local
servicePort: 8080
我已经设置了一个裸机 k8 集群(1 个主节点 - intel NUC 和 Raspberry pi 上的 2 个工作节点)。我设法设置了一个 metal-lb 负载平衡和 nginx 入口控制器。我启动了两个应用程序,ghost(在默认端口 2368 上侦听)和 nextcloud(在默认端口 80 上侦听)。我正在尝试从 public ip myhomeserver.io(访问 ghost 应用程序)和 nextcloud.myhomeserver.io(访问下一个云应用程序)访问应用程序。我可以访问 ghost 应用程序,但我似乎无法访问 nextcloud.Given 下面是入口和服务的 yaml 文件。不确定我哪里出错了。
kubectl get services --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98d
ghost ghost-service ClusterIP 10.107.116.108 <none> 2368/TCP 7h37m
ingress-nginx ingress-nginx LoadBalancer 10.109.177.223 192.168.178.200 80:31619/TCP,443:30365/TCP 7d23h
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 98d
nextcloud nextcloud-service ClusterIP 10.105.24.162 <none> 8080/TCP 137m
=============================================================================================================================
NAMESPACE NAME HOSTS ADDRESS PORTS AGE
ghost ingress-ghost myhomeserver.io 192.168.178.200 80 7d22h
nextcloud ingress-nextcloud nextcloud.myhomeserver.io 192.168.178.200 80 140m
=============================================================================================================================
cat ingress-object-ghost.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-ghost
namespace: ghost
spec:
rules:
- host: myhomeserver.io
http:
paths:
- backend:
serviceName: ghost-service
servicePort: 2368
=============================================================================================================================
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nextcloud
namespace: nextcloud
spec:
rules:
- host: nextcloud.myhomeserver.io
http:
paths:
- backend:
serviceName: nextcloud-service
servicePort: 8080
================================================================================================================================
cat ingress-object-nextcloud.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nextcloud
namespace: nextcloud
spec:
rules:
- host: nextcloud.myhomeserver.io
http:
paths:
- backend:
serviceName: nextcloud-service
servicePort: 8080
===================================================================================
apiVersion: apps/v1
kind: Deployment
metadata:
name:
deployment-nextcloud
namespace: nextcloud
labels:
env: prod
app: nextcloud-app
spec:
template:
metadata:
name: nextcloud-app-pod
labels:
app: nextcloud-app
env: production
spec:
containers:
- name: nextcloud
image: arm32v7/nextcloud
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /var/www/html
name: nextcloud-data
securityContext:
privileged: True
volumes:
- name: nextcloud-data
persistentVolumeClaim:
claimName: pvc-nextcloud
nodeSelector:
kubernetes.io/arch: arm
replicas: 2
selector:
matchLabels:
app: nextcloud-app
================================================================================================================
apiVersion: v1
kind: Service
metadata:
name: nextcloud-service
namespace: nextcloud
labels:
app: nextcloud-app
spec:
type: ClusterIP
selector:
app: nextcloud-app
ports:
- port: 8080
targetPort: 8080
protocol: TCP
请注意,您的 nginx 入口控制器 运行 在 ghost 命名空间中,因此它只知道 ghost 服务。如果你想在那里有一个入口,你需要为你的 nextcloud 命名空间有另一个入口控制器。如果您不想要另一个入口控制器,那么您可以通过以下方式定位其 dns 来解析 nextcloud 服务 servicename.namespacename.svc.cluster.local
一方面,将您的应用程序划分得如此之多并没有什么意义。 Kubernetes 已经为您在同一命名空间中的应用程序之间提供了足够的隐私。
更新
Ingress 适合您,因为您只有 1 INGRESS CONTROLLER
。由于有两个服务,我添加了一个路径规则,该规则将被重写为 /
,因此每个服务都会收到一个干净的 URI。使用 myhomeserver.io/ghost
访问 ghost
,使用 myhomeserver.io/nextcloud
访问 nextcloud。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-ghost
namespace: ghost
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myhomeserver.io
http:
paths:
- path: /ghost
backend:
serviceName: ghost-service
servicePort: 2368
- path: /nextcloud
backend:
serviceName: nextcloud-service.nextcloud.svc.cluster.local
servicePort: 8080
更新 2
所以你的 ingress controller
在 ghost 命名空间中是 运行。因此,您的入口 必须部署在 ghost 命名空间中。 请注意每个主机的 http 规则。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-ghost
namespace: ghost
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myhomeserver.io
http:
paths:
- path: /
backend:
serviceName: ghost-service
servicePort: 2368
- host: nextcloud.myhomeserver.io
http:
- path: /
backend:
serviceName: nextcloud-service.nextcloud.svc.cluster.local
servicePort: 8080