K8s 入口有 2 个域都在端口 80 上侦听
K8s ingress with 2 domains both listening on port 80
我正在尝试在一次部署中用两个 docker 图像复制一个 Name based virtual hosting。不幸的是,由于端口冲突,我只能得到 1 运行:
2019/03/19 20:37:52 [ERR] Error starting server: listen tcp :5678: bind: address already in use
作为同一部署的一部分,真的不可能让两个图像在同一端口上侦听吗?还是我哪里出错了?
改编自here
的最小示例
# set up ingress
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
# set up load balancer
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/cloud-generic.yaml
# spin up two containers in one deployment, same container port
kubectl apply -f test.yaml
test.yaml
:
apiVersion: v1
kind: Service
metadata:
name: echo1
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo1
---
apiVersion: v1
kind: Service
metadata:
name: echo2
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo12
spec:
selector:
matchLabels:
app: echo12
replicas: 1
template:
metadata:
labels:
app: echo12
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo1"
ports:
- containerPort: 5678
- name: echo2
image: hashicorp/http-echo
args:
- "-text=echo2"
ports:
- containerPort: 5678
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
更新:
如果我添加一个单独的部署,它就可以工作。这是设计使然,还是有任何方法可以在一次部署中实现这一点(原因:我希望能够一次重置所有已部署的域)?
问题 1:在一个部署的一个 pod 中创建两个不同的服务后端。这不是 pods 的设计目的。如果您想公开多个服务,您应该(至少)有一个 pod 来支持每个服务。部署通过允许您定义复制和活跃度选项来环绕 Pod。在您的情况下,您应该为其相应的服务进行一次部署(创建一个或多个 pods 来响应一个回显请求)。
问题 2:您没有正确地将您的服务链接到后端。该服务显然正在尝试 select 标签 app=echo
或 app=echo2
。在您的部署中,您的 app=echo12
。因此,该服务根本无法找到任何活动端点。
要解决上述问题,请尝试以下操作:
apiVersion: v1
kind: Service
metadata:
name: echo1
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo1
---
apiVersion: v1
kind: Service
metadata:
name: echo2
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo1
spec:
selector:
matchLabels:
app: echo1
replicas: 1
template:
metadata:
labels:
app: echo1
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo1"
ports:
- containerPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo2
spec:
selector:
matchLabels:
app: echo2
replicas: 1
template:
metadata:
labels:
app: echo2
spec:
containers:
- name: echo2
image: hashicorp/http-echo
args:
- "-text=echo2"
ports:
- containerPort: 5678
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
我已经在我自己的集群中测试了上面的内容并验证它正在工作(当然使用不同的入口 url)。希望这对您有所帮助!
我正在尝试在一次部署中用两个 docker 图像复制一个 Name based virtual hosting。不幸的是,由于端口冲突,我只能得到 1 运行:
2019/03/19 20:37:52 [ERR] Error starting server: listen tcp :5678: bind: address already in use
作为同一部署的一部分,真的不可能让两个图像在同一端口上侦听吗?还是我哪里出错了?
改编自here
的最小示例# set up ingress
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
# set up load balancer
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/cloud-generic.yaml
# spin up two containers in one deployment, same container port
kubectl apply -f test.yaml
test.yaml
:
apiVersion: v1
kind: Service
metadata:
name: echo1
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo1
---
apiVersion: v1
kind: Service
metadata:
name: echo2
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo12
spec:
selector:
matchLabels:
app: echo12
replicas: 1
template:
metadata:
labels:
app: echo12
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo1"
ports:
- containerPort: 5678
- name: echo2
image: hashicorp/http-echo
args:
- "-text=echo2"
ports:
- containerPort: 5678
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
更新: 如果我添加一个单独的部署,它就可以工作。这是设计使然,还是有任何方法可以在一次部署中实现这一点(原因:我希望能够一次重置所有已部署的域)?
问题 1:在一个部署的一个 pod 中创建两个不同的服务后端。这不是 pods 的设计目的。如果您想公开多个服务,您应该(至少)有一个 pod 来支持每个服务。部署通过允许您定义复制和活跃度选项来环绕 Pod。在您的情况下,您应该为其相应的服务进行一次部署(创建一个或多个 pods 来响应一个回显请求)。
问题 2:您没有正确地将您的服务链接到后端。该服务显然正在尝试 select 标签 app=echo
或 app=echo2
。在您的部署中,您的 app=echo12
。因此,该服务根本无法找到任何活动端点。
要解决上述问题,请尝试以下操作:
apiVersion: v1
kind: Service
metadata:
name: echo1
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo1
---
apiVersion: v1
kind: Service
metadata:
name: echo2
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo1
spec:
selector:
matchLabels:
app: echo1
replicas: 1
template:
metadata:
labels:
app: echo1
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo1"
ports:
- containerPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo2
spec:
selector:
matchLabels:
app: echo2
replicas: 1
template:
metadata:
labels:
app: echo2
spec:
containers:
- name: echo2
image: hashicorp/http-echo
args:
- "-text=echo2"
ports:
- containerPort: 5678
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
我已经在我自己的集群中测试了上面的内容并验证它正在工作(当然使用不同的入口 url)。希望这对您有所帮助!