我必须在我的kubernetes集群上部署两个使用相同服务进行通信的部署,但这两个部署位于两个不同的命名空间中:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1
namespace: namespace1
labels:
app: app1
spec:
replicas: 2
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:
- name: app1
image: eu.gcr.io/direct-variety-20998876/test1:dev
resources:
requests:
cpu: "100m"
memory: "128Mi"
ports:
- containerPort: 8000
imagePullPolicy: Always
env:
...
和一个相同的秒,但在另一个命名空间:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app2
namespace: namespace2
labels:
app: app2
spec:
replicas: 2
selector:
matchLabels:
app: app2
template:
metadata:
labels:
app: app2
spec:
containers:
- name: app2
image: eu.gcr.io/direct-variety-20998876/test1:prod
resources:
requests:
cpu: "100m"
memory: "128Mi"
ports:
- containerPort: 8000
imagePullPolicy: Always
env:
...
因此,我必须为bot部署创建一个通用服务,该服务在两个命名空间上运行:我尝试:
kind: Service
apiVersion: v1
metadata:
name: apps-service
namespace: ???
spec:
selector:
app: ???
ports:
- protocol: TCP
port: 8000
targetPort: 8000
type: NodePort
到目前为止,我为特定命名空间中的任何应用程序创建了一个服务,但有一种方法可以创建一个服务来管理这两个部署(然后关联一个唯一的入口(?
提前感谢
首先,我想提供一些一般性的解释。正如我们在Ingress文档中看到的:
必须有一个Ingress控制器才能满足Ingress。仅创建Ingress资源没有任何效果。
入口控制器可以部署在任何命名空间中,并且通常部署在与应用程序命名空间分离的命名空间中。
入口资源(入口规则(应部署在与其指向的服务相同的命名空间中。
对于多个入口资源,可以具有一个入口控制器。
在与其指向的Services
相同的命名空间中部署Ingress
资源是最常见的方法(我推荐这种方法(。然而,有一种方法可以使用externalName Services将Ingress
放在一个命名空间中,将Services
放在另一个命名空间。
我将创建一个示例来说明它是如何工作的。
假设我有两个Deployments
(app1
,app2
(部署在两个不同的Namespaces
(namespace1
,namespace2
(中:
$ cat app1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: app1
name: app1
namespace: namespace1
spec:
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:
- image: nginx
name: nginx
$ cat app2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: app2
name: app2
namespace: namespace2
spec:
selector:
matchLabels:
app: app2
template:
metadata:
labels:
app: app2
spec:
containers:
- image: nginx
name: nginx
我用ClusterIP
Services
:曝光了这些Deployments
$ cat svc-app1.yml
apiVersion: v1
kind: Service
metadata:
labels:
app: app1
name: app1
namespace: namespace1
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: app1
$ cat svc-app2.yml
apiVersion: v1
kind: Service
metadata:
labels:
app: app2
name: app2
namespace: namespace2
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: app2
我们希望在单独的Namespace
(default
(中具有单个Ingress
资源。首先,我们需要部署ExternalName类型的服务,将服务映射到DNS名称。
$ cat external-app1.yml
kind: Service
apiVersion: v1
metadata:
name: external-app1
spec:
type: ExternalName
externalName: app1.namespace1.svc
$ cat external-app2.yml
kind: Service
apiVersion: v1
metadata:
name: external-app2
spec:
type: ExternalName
externalName: app2.namespace2.svc
然后我们可以部署Ingress资源:
$ cat ingress.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
name: app-ingress
spec:
rules:
- http:
paths:
- path: /app1
backend:
serviceName: external-app1
servicePort: 80
- path: /app2
backend:
serviceName: external-app2
servicePort: 80
$ kubectl apply -f ingress.yml
ingress.networking.k8s.io/app-ingress created
最后,我们可以检查它是否按预期工作:
$ curl 34.118.X.207/app1
app1
$ curl 34.118.X.207/app2
app2
注意:这是一种变通方法,对于不同的入口控制器可能会有不同的工作方式。通常最好在不同的命名空间中有两个或多个Ingress资源。