Kubernetes跨命名空间入口网络

Col*_*rk1 3 kubernetes microservices kubernetes-ingress

我有一个简单的入口网络,我想从该入口网络访问不同名称空间的服务。

我该怎么做?我的入口网络yaml文件:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
 - host: api.myhost.com
 http:
 paths:
  - backend:
      serviceName: bookapi-2
      servicePort: 8080
    path: /booking-service/
Run Code Online (Sandbox Code Playgroud)

我已经将ExternalNames服务类型设置为yaml文件:

 apiVersion: v1
 kind: Service
 metadata:
   name: bookapi-2
   namespace: booking-namespace
 spec:
   type: ExternalName
   externalName: bookapi-2
   ports:
     - name: app
     protocol: TCP
      port: 8080
      targetPort: 8080
   selector:
      app: bookapi-2
      tier: backend-2
Run Code Online (Sandbox Code Playgroud)

aur*_*ius 7

ExternalName服务是一种特殊的服务,它没有选择器,而是使用DNS名称。

您可以从Kubernetes官方文档中找到有关ExternalName服务的更多信息:

当您想从其他名称空间访问服务时,例如,您的Yaml可能如下所示:

kind: Service
apiVersion: v1
metadata:
  name: test-service-1
  namespace: namespace-a
spec:
  type: ExternalName
  externalName: test-service-2.namespace-b.svc.cluster.local
  ports:
  - port: 80
Run Code Online (Sandbox Code Playgroud)

至于您的Ingress yaml文件,请重新检查它并确保它与官方示例兼容,例如,此文件包含一些不一致之处:

apiVersion: extensions/v1beta1  
kind: Ingress  
metadata:  
  name: my-ingress  
spec:  
  rules:  
  - host: www.mysite.com  
    http:  
      paths:  
      - backend:  
          serviceName: website  
          servicePort: 80  
  - host: forums.mysite.com  
    http:  
      paths:  
      - path:  
        backend:  
          serviceName: forums  
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

还请重新检查ExternalName yaml,因为它具有在此类型的服务中未使用的TargetPort和选择器,并确保:

ExternalName Services仅在kube-dns1.7版和更高版本中可用。

如果您无法成功,请分享您遇到的问题。

  • 以防万一它对未来的读者有所帮助:当我运行“kubectl描述入口”时,我看到一条错误,指出没有找到ExternalName服务的端点。不过事情进展顺利。(在 microk8s 上,对于 `externalName: kubernetes-dashboard.kube-system.svc.cluster.local`。) (2认同)
  • 首先,您真的打算将 Ingress 指向“外部”服务“test-service-1”,该服务指向不同命名空间中的另一个服务吗?我不确定您是否真的是这个意思,因为您的 Ingress 指向完全不同的服务名称...无论如何,在 GKE 上,此设置不起作用,因为它需要对后端服务进行运行状况检查,并且对于外部服务总是失败(它是正确配置并手动测试)。 (2认同)

Roh*_*cha 6

  1. 创建命名空间 service-ns
  2. 创建一个名为 nginx-service 的 ClusterIP 类型(默认)的服务,在命名空间 service-ns 中监听端口 80
  3. 在service-ns中创建nginx部署
  4. 创建命名空间 ingress-ns
  5. 在类型为ExternalName的ingress-ns中创建一个服务,并指向nginx-service的FQDN,将其指向nginx-internal.service-ns.svc.cluster.local
  6. 创建入口规则

注意:演示代码不要在生产中运行。只是想了解它如何跨命名空间工作

---
#1
apiVersion: v1
kind: Namespace
metadata:
  name: service-ns
---
#2
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx-internal
  namespace: service-ns
spec:
  ports:
  - name: "80"
    port: 80
    targetPort: 80  
  selector:
    app: nginx
---
#3
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: service-ns
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        image: nginx
        name: nginx
        ports:
        - containerPort: 80
      restartPolicy: Always
---
#4
apiVersion: v1
kind: Namespace
metadata:
  name: ingress-ns
---
#5
kind: Service
apiVersion: v1
metadata:
  name: nginx
  namespace: ingress-ns
spec:
  type: ExternalName
  externalName: nginx-internal.service-ns.svc.cluster.local
  ports:
  - port: 80
---
#6
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: main-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
  namespace: ingress-ns    
spec:
  rules:
    - host: whatever.domain.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  number: 80
Run Code Online (Sandbox Code Playgroud)