如何让两个Kubernetes服务相互交谈?

Wil*_*bok 7 cluster-computing kubernetes kubectl

目前,我在K8s服务中使用K8s API pod,该服务连接到K8s Redis服务,其中有K8s pod.问题是,我使用NodePort意味着BOTH暴露给公众.我只希望API可以访问公众.问题是如果我将Redis服务不公开,API就无法看到它.有没有办法连接两个服务而不向公众公开?

这是我的API服务yaml:

apiVersion: v1
kind: Service
metadata:
   name: app-api-svc
spec:
   selector:
     app: app-api
     tier: api
   ports:
     - protocol: TCP
       port: 5000
       nodePort: 30400
   type: NodePort
Run Code Online (Sandbox Code Playgroud)

这是我的Redis服务yaml:

apiVersion: v1
kind: Service
metadata:
   name: app-api-redis-svc
spec:
   selector:
     app: app-api-redis
     tier: celery_broker
   ports:
     - protocol: TCP
       port: 6379
       nodePort: 30537
   type: NodePort
Run Code Online (Sandbox Code Playgroud)

Mar*_*o S 8

首先,将Redis服务配置为ClusterIP服务。它是私有的,仅对其他服务可见。这可以通过使用option删除行来完成type

apiVersion: v1
kind: Service
metadata:
   name: app-api-redis-svc
spec:
   selector:
     app: app-api-redis
     tier: celery_broker
   ports:
     - protocol: TCP
       port: 6379
       targetPort: [the port exposed by the Redis pod]
Run Code Online (Sandbox Code Playgroud)

最后,当您配置API以访问Redis时,地址应为 app-api-redis-svc:6379

就这样。我有很多服务都以这种方式相互交流。如果这对您不起作用,请在评论中告诉我。

  • 应用程序如何将“ app-api-redis-svc”解析为群集IP? (2认同)

new*_*ere 5

我将尝试从所有答案和我自己的研究中发挥最大作用,并制作一个简短的指南,希望对您有所帮助:

1. 测试连通性

连接到不同的 pod,例如 ruby​​ pod:

kubectl exec -it some-pod-name -- /bin/sh
Run Code Online (Sandbox Code Playgroud)

验证它可以 ping 到有问题的服务:

ping redis
Run Code Online (Sandbox Code Playgroud)

它可以连接到端口吗?(我发现 telnet 对此不起作用)

nc -zv redis 6379
Run Code Online (Sandbox Code Playgroud)

2. 验证您的服务选择器是否正确

如果您的服务配置如下所示:

kind: Service
apiVersion: v1
metadata:
  name: redis
  labels:
    app: redis
    role: master
    tier: backend
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
    role: master
    tier: backend
Run Code Online (Sandbox Code Playgroud)

验证这些选择器是否也设置在您的 pod 上?

get pods --selector=app=redis,role=master,tier=backend
Run Code Online (Sandbox Code Playgroud)

通过运行以下命令确认您的服务已绑定到您的 Pod:

$> describe service redis
Name:           redis
Namespace:      default
Labels:         app=redis
            role=master
            tier=backend
Annotations:        <none>
Selector:       app=redis,role=master,tier=backend
Type:           ClusterIP
IP:         10.47.250.121
Port:           <unset> 6379/TCP
Endpoints:      10.44.0.16:6379
Session Affinity:   None
Events:         <none>
Run Code Online (Sandbox Code Playgroud)

检查该Endpoints:字段并确认它不是空白

更多信息请访问:https : //kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#my-service-is-missing-endpoints