我有一个 aks 集群,其中有两个 neo4j 数据库映像(db-1 和 db-2),为它们提供服务。使用 nginx 入口控制器,我想根据用户请求的 url 将用户路由到特定数据库,例如,如果用户想要访问 db-1,我的 neo4j url 将是
http://<external-ip>/db1
我想使用内部 IP,并将我的 aks 集群链接到它。
我使用以下步骤创建数据库和 nginx 控制器。但我的数据库尚未连接。 Neo4j 说
Service Unavailable
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace ingress-test --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz --set-string controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"="true" --tcp-services-configmap=ingress-test/tcp-services
应用以下 yaml
kubectl apply -f ingress.yaml
kind: Deployment
metadata:
name: aks-neo4j-one
spec:
replicas: 1
selector:
matchLabels:
app: aks-neo4j-one
template:
metadata:
labels:
app: aks-neo4j-one
spec:
containers:
- name: neo4j
image: neo4j:latest
env:
- name: NEO4J_AUTH
value: neo4j/<mypassword>
ports:
- containerPort: 7474
name: http
- containerPort: 7687
name: tcp
---
apiVersion: v1
kind: Service
metadata:
name: aks-neo4j-one
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 7687
selector:
app: aks-neo4j-one
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: neo4j-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /neo4jone
pathType: Prefix
backend:
service:
name: aks-neo4j-one
port:
number: 80
---
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-test
data:
7687: "ingress-test/aks-neo4j-one:80"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-test
spec:
template:
spec:
containers:
- name: controller
args:
- /nginx-ingress-controller
- --tcp-services-configmap=ingress-test/tcp-services
尝试过使用和不使用配置图以及neo4j需要7687螺栓端口
将服务端口更改为7474,然后浏览外部IP会弹出用户名和密码,并且不会继续进行任何输入。
要在 AKS 集群中配置两个单独的 Neo4j 实例并使用基于 URL 路径的 Nginx Ingress 将流量定向到它们,请按照以下说明操作:
首先,添加 Nginx Ingress 的 Helm 存储库并安装:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace ingress-nginx
为每个 Neo4j 实例创建 Kubernetes 部署文件。对于第一个数据库(
db-1
):
#File: db1-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: neo4j-db1
spec:
replicas: 1
selector:
matchLabels:
app: neo4j-db1
template:
metadata:
labels:
app: neo4j-db1
spec:
containers:
- name: neo4j
image: neo4j:latest
env:
- name: NEO4J_AUTH
value: "neo4j/your_password_here"
ports:
- containerPort: 7474
name: http
- containerPort: 7687
name: bolt
对于第二个数据库(
db-2
):
#File: db2-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: neo4j-db2
spec:
replicas: 1
selector:
matchLabels:
app: neo4j-db2
template:
metadata:
labels:
app: neo4j-db2
spec:
containers:
- name: neo4j
image: neo4j:latest
env:
- name: NEO4J_AUTH
value: "neo4j/your_password_here"
ports:
- containerPort: 7474
name: http
- containerPort: 7687
name: bolt
使用以下方式部署这些配置:
kubectl apply -f db1-deployment.yaml
kubectl apply -f db2-deployment.yaml
现在,为每个 Neo4j 部署定义服务。 对于
db-1
:
# db1-service.yaml
apiVersion: v1
kind: Service
metadata:
name: neo4j-db1-service
spec:
type: ClusterIP
ports:
- name: http
protocol: TCP
port: 7474
targetPort: 7474
- name: bolt
protocol: TCP
port: 7687
targetPort: 7687
selector:
app: neo4j-db1
对于
db-2
:
# db2-service.yaml
apiVersion: v1
kind: Service
metadata:
name: neo4j-db2-service
spec:
type: ClusterIP
ports:
- name: http
protocol: TCP
port: 7474
targetPort: 7474
- name: bolt
protocol: TCP
port: 7687
targetPort: 7687
selector:
app: neo4j-db1
应用它们:
kubectl apply -f db1-service.yaml
kubectl apply -f db2-service.yaml
设置 Ingress 资源来路由外部请求:
# File: neo4j-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: neo4j-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /db1
pathType: Prefix
backend:
service:
name: neo4j-db1-service
port:
number: 7474
- path: /db2
pathType: Prefix
backend:
service:
name: neo4j-db2-service
port:
number: 7474
使用
kubectl apply -f neo4j-ingress.yaml
应用它
应用上述配置后,为 TCP 路由创建 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-ingress-tcp
namespace: ingress-nginx
data:
"7687": "default/neo4j-db1-service:7687"
应用ConfigMap:
kubectl apply -f tcp-routing-configmap.yaml
然后,更新 Nginx Ingress Controller 部署以将此 ConfigMap 用于 TCP 服务:
kubectl edit deployment ingress-nginx-controller -n ingress-nginx
在
--tcp-services-configmap=default/nginx-ingress-tcp
下添加 spec.template.spec.containers[0].args
参数。
应用上述配置后,您应该能够通过
http://<external-ip>/db1
(对于 HTTP)和 <external-ip>:7687
(对于 Bolt)访问 Neo4j 实例。使用以下命令查找 Nginx 入口控制器的外部 IP:
kubectl get svc -n ingress-nginx