所以我尝试使用ExternalName服务来允许跨命名空间应用程序使用入口(命名空间1中的应用程序通过ExternalName服务类型使用命名空间2中的入口)。这是我原来的服务
metadata:
annotations:
cloud.google.com/neg: '{"ingress":true}'
labels:
app.kubernetes.io/component: app1
app.kubernetes.io/instance: app1
name: app1-svc
namespace: app1-namespace
spec:
internalTrafficPolicy: Cluster
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app.kubernetes.io/component: app1
app.kubernetes.io/instance: app1
sessionAffinity: None
type: ClusterIP
namespace2 中的设置包括入口和服务(类型:ExternalName),如下
apiVersion: v1
kind: Service
metadata:
name: external-svc-for-app1-svc
namespace: app2-namespace
annotations:
cloud.google.com/neg: '{"ingress": true}'
spec:
type: ExternalName
externalName: app1-svc.app1-namespace.svc.cluster.local
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
--------------------------------------------------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-ns2
namespace: app2-namespace
annotations:
kubernetes.io/ingress.allow-http: "false"
cert-manager.io/cluster-issuer: letsencrypt
kubernetes.io/ingress.class: gce-internal
kubernetes.io/ingress.regional-static-ip-name: <ip-address>
spec:
tls:
- secretName: ingress-ns2-tls
hosts:
- <app1.example.com>
rules:
- host: <app1.example.com>
http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: external-svc-for-app1-svc
port:
number: 80
为此外部服务创建了后端服务,因此作为 NEG,问题是未为外部服务配置网络端点。我必须手动提供网络端点才能使其工作。
我尝试过使用 nginx ingress 和 gce ingress,但没有成功。 理论上,它应该在 NEG 中配置端点,因为外部 svc 通过内部 DNS 指向实际服务
<service>.<name-space>.svc.cluster.local
,我可以从 app2-namespace
中的任何 pod 进行卷曲,并将流量路由到原始服务以及我提到的当我手动提供 app1 的网络端点时它起作用。
我查看了一些帖子,但大多数都说流量路由不起作用,它现在可以与ExternalName服务一起使用,唯一的问题是网络端点未配置。
使用无头服务和 DNS:您可以使用带有 DNS 的无头服务来实现相同的功能,而不是使用ExternalName 服务。无头服务(ClusterIP:无)不会分配 IP 地址,而是返回支持服务的 pod 的 IP 集。
apiVersion: v1
kind: Service
metadata:
name: app1-svc-headless
namespace: app1-namespace
spec:
clusterIP: None
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app.kubernetes.io/component: app1
app.kubernetes.io/instance: app1
apiVersion: v1
kind: Service
metadata:
name: external-svc-for-app1-svc
namespace: app2-namespace
annotations:
cloud.google.com/neg: '{"ingress": true}'
spec:
type: ExternalName
externalName: app1-svc-headless.app1-namespace.svc.cluster.local
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-ns2
namespace: app2-namespace
annotations:
kubernetes.io/ingress.allow-http: "false"
cert-manager.io/cluster-issuer: letsencrypt
kubernetes.io/ingress.class: gce-internal
kubernetes.io/ingress.regional-static-ip-name: <ip-address>
spec:
tls:
- secretName: ingress-ns2-tls
hosts:
- <app1.example.com>
rules:
- host: <app1.example.com>
http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: external-svc-for-app1-svc
port:
number: 80
无头服务:通过创建无头服务(ClusterIP:无),您可以允许 Kubernetes 直接返回 Pod 的 IP 地址,而不是单个 ClusterIP。
DNS 解析: Headless 服务使用 Kubernetes DNS 来解析 Pod IP 地址,然后可以由其他命名空间中的ExternalName 服务访问。
NEG: 由于 GKE 入口控制器不会为ExternalName 服务创建 NEG,因此此方法不依赖于 NEG,而是使用 DNS 来解析端点。