【问题标题】:Cross namespace communication across pods in kubernetesKubernetes 中跨 pod 的跨命名空间通信
【发布时间】:2021-11-10 06:08:49
【问题描述】:

如何在 Kubernetes 中跨 pod 进行跨命名空间通信?假设 webserver & application pod 位于命名空间 A 中,DB 位于命名空间 B 中。我也创建了外部名称,但仍然无法正常工作。

我们可以在 deployments.yaml 中有多个选择器

frontend-service

apiVersion: v1
kind: Service
metadata:
  name: mongo-express-service
  namespace: db
spec:
  type: NodePort
  selector:
    app: mongo-express
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 8081
DB-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mongodb-service
  namespace: db
spec:
  type: ExternalName
  externalName: mongo-express-service.frontend.svc.cluster.local
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017
$ kubectl get svc -n db
NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP                                        PORT(S)          AGE
mongo-express-service   NodePort       10.103.8.140   <none>                                             8081:32468/TCP   5h20m
mongodb-service         ExternalName   <none>         mongo-express-service.frontend.svc.cluster.local   27017/TCP        5h19m
$ kubectl get svc -n frontend
NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
mongo-express-service   NodePort   10.102.174.70   <none>        8081:30928/TCP   5h20m

【问题讨论】:

    标签: kubernetes amazon-eks kubernetes-networkpolicy


    【解决方案1】:

    您应该创建一个网络策略:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: simple-policy
      namespace: db
    spec:
      podSelector:
        matchLabels:
          app: mongo-db
      policyTypes:
      - Ingress
      - Egress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              name: frontend
        - podSelector:
            matchLabels:
              app: mongo-express
        ports:
        - protocol: TCP
          port: 27017
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              name: frontend
        - podSelector:
            matchLabels:
              app: mongodb-express
        ports:
        - protocol: TCP
          port: 27017
    

    你可以通过你喜欢的限制来精简它,无论是整个命名空间,只有两个 pod 和一个特定的端口,还是全部。

    docs中查看更多信息

    【讨论】:

    • Noam,上述解决方案对我没有帮助。有什么我想念的吗?
    • 您是否根据使用情况修改了这些值?
    • 是的,我做了,还删除了外部服务 `podSelector: matchLabels: app: mongodb policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: name: frontend - podSelector: matchLabels: app: mongo-express 端口:-协议:TCP 端口:27017 出口:-to:-namespaceSelector:matchLabels:名称:前端-podSelector:matchLabels:app:mongo-express 端口:-协议:TCP 端口:27017`
    • 那你是 from namespace 是什么意思?
    • 我的集群在 EKS 中。为了使网络策略起作用,我需要安装任何网络插件(calico)吗? kubernetes.io/docs/concepts/services-networking/…
    【解决方案2】:

    一个命名空间中的 Pod 无需任何外部名称或网络策略即可与其他命名空间通信。默认情况下,Pod 之间会进行通信,除非通过网络策略配置任何拒绝流量。

    我像往常一样通过将它与选择器部分中的 mongodb 应用程序关联来创建具有 clusterIP 的 db 服务

    $ kubectl.exe describe svc mongodb-service -n db
    
    Name:              **mongodb-service**
    
    Namespace:         **db**
    
    Labels:            <none>
    
    Annotations:       <none>
    
    **Selector:          app=mongodb**
    
    Type:              **ClusterIP**
    
    IP Families:       <none>
    
    IP:                10.109.25.141
    
    IPs:               10.109.25.141
    
    Port:              <unset>  27017/TCP
    
    TargetPort:        27017/TCP
    
    Endpoints:         10.0.0.48:27017
    
    Session Affinity:  None
    
    Events:            <none>
    
    $ kubectl.exe get svc -n  db
    NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
    mongodb-service   ClusterIP   10.109.25.141   <none>        27017/TCP   47m
    
    

    然后在前端命名空间中,我使用 nameofservice.anothernamespace.svc.cluster.local (mongodb-service.db.svc.cluster.local) 更新了 configmap。

    apiVersion: v1
    
    kind: ConfigMap
    
    metadata:
    
      name: mongodb-configmap
    
      namespace: frontend
    
    data:
    
      database_url: mongodb-service.db.svc.cluster.local 
    
    

    前端命名空间中的 pod 工作正常。

    $ kubectl.exe get pods,svc -n  frontend
    
    NAME                                 READY   STATUS    RESTARTS   AGE
    
    pod/mongo-express-78fcf796b8-m4xhj   1/1     Running   8          19m
    
    pod/mongo-express-78fcf796b8-mf4bf   1/1     Running   8          19m
    
    pod/mongo-express-78fcf796b8-zgjkh   1/1     Running   8          19m
    
    NAME                            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    
    service/mongo-express-service   NodePort   10.105.0.117   <none>        8081:31097/TCP   19m
    
    

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2019-01-23
      • 2023-03-17
      • 2021-10-16
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多