Kubernetes在不同的命名空间中为两个部署部署一个NodePort



我必须在我的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(app1app2(部署在两个不同的Namespaces(namespace1namespace2(中:

$ 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

我用ClusterIPServices:曝光了这些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资源。

相关内容

  • 没有找到相关文章

最新更新