我有几个应用程序,它们在Docker容器中运行(都在同一VM上)。 在它们前面,我有一个nginx容器作为反向代理。 现在我想将其迁移到Kubernetes。
当我通过docker-composer在本地启动它们时,它的工作与预期的一样。 在Kubernetes上没有。
http {
server {
location / {
proxy_pass http://app0:80;
}
location /app1/ {
proxy_pass http://app1:80;
rewrite ^/app1(.*)$ $1 break;
}
location /app2/ {
proxy_pass http://app2:80;
rewrite ^/app2(.*)$ $1 break;
}
}
}
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app0
spec:
replicas: 1
template:
metadata:
labels:
app: app0
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
containers:
- name: app0
image: appscontainerregistry1.azurecr.io/app0:latest
imagePullPolicy: Always
ports:
- containerPort: 80
name: nginx
---
#the other apps
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
# use the shared ingress-nginx
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: apps-url.com
http:
paths:
- path: /
backend:
serviceName: app0
servicePort: 80
- path: /app1
backend:
serviceName: app1
servicePort: 80
- path: /app2
backend:
serviceName: app2
servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
name: loadbalancer
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: ingress-nginx
我在/(app0)上得到响应。不幸的是,子路由不起作用。我在做什么错了?
我想通了。 Ich错过了安装入口控制器的机会。就像在此页面(https://kubernetes.io/docs/concepts/services-networking/ingress/)所述,如果未安装控制器,则无法使用入口。 我将ingress-nginx用作控制器(https://kubernetes.github.io/ingress-nginx/deploy/)是因为它是我能找到的最详尽描述的安装指南,并且我不想使用HELM。 我还有一个问题。如何更改子网域正在运行的入口。 例如,k8url.com / app1 / subroute每次在我的app1的起始页面上显示给我。 而且,如果我使用域名代理,则每次使用IP都会重写域名。
答案 0 :(得分:0)
您已经成功创建了部署,但是应该有该服务。 kubernetes上的nginx ngress根据该服务管理流量。
所以流程就像
nginx-ingress > service > deployment pod.
您缺少为两个应用程序创建服务并基于kubernetes入口中的路由添加正确的路由的方法。
答案 1 :(得分:0)
添加此内容:
apiVersion: v1
kind: Service
metadata:
name: loadbalancer
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: ingress-nginx
因为您没有将Service
负载均衡器路由到targetPort
到80