【问题标题】:Kubernetes - service cluster IP address vs Pod IP addressKubernetes - 服务集群 IP 地址与 Pod IP 地址
【发布时间】:2017-11-03 11:58:27
【问题描述】:

我已经在 Azure (ACS) 上使用 Kubernetes 部署了一个 Postgres 数据库。

我已将 StatefulSet 与 Service 结合使用。

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: postgres
spec:
  selector:
    matchLabels:
      app: postgres
  serviceName: "postgres"
  # 1 instance
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      # Postgres database
      - name: postgres
        image: postgres:10
        ports:
        - containerPort: 5432
        volumeMounts:
          - name: pv-postgres
            mountPath: /var/lib/postgresql/data
        env:
        - name: POSTGRES_USER
          value: postgres
        - name: POSTGRES_DB
          value: tariffbook_db
        - name: PGDATA
          value: /var/lib/postgresql/data
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: password
      hostname: postgres
      volumes:
      - name: pv-postgres
      # Upon node restart, restart the container
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  ports:
  - port: 5432
    protocol: TCP
  selector:
    app: postgres

Kubernetes 部署数据库并在 kube-dns 中注册:

kubectl exec -ti busybox -- nslookup postgres
...
Name:      postgres
Address 1: 10.0.209.61 postgres.default.svc.cluster.local

现在当我 ping postgres 时,我没有收到任何响应。

kubectl exec -ti busybox -- ping postgres
PING postgres (10.0.209.61): 56 data bytes

--- postgres ping statistics ---
14 packets transmitted, 0 packets received, 100% packet loss

可以通过其内部 IP 访问 Pod:10.244.0.46,但该服务不提供对 postgres Pod 的访问。

kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                            READY     
STATUS    RESTARTS   AGE       IP             NODE
default       azure-files-pod                                 1/1       
Running   0          19h       10.244.2.16    k8s-agent-52f7ae4d-1
default       busybox                                         1/1       
Running   12         12h       10.244.2.49    k8s-agent-52f7ae4d-1
default       postgres-0                                      1/1       
Running   0          1m        10.244.0.46    k8s-agent-52f7ae4d-0

我已关注DNS troubleshooting tips,但我没有注意到 DNS 设置中有任何错误。

我的 StatefulSet 或 Service 中是否有错误配置?

非常感谢您的帮助! 最好的祝福, 埃里克·曼努格拉

【问题讨论】:

  • 很抱歉,您是否还单独创建了一个未显示的服务对象?
  • 是的,我已经部署了一个 postgres 服务。 yaml代码底部有说明。

标签: azure networking dns kubernetes


【解决方案1】:

你只打开了 5432 端口,从来没有一个端口可以 ping 你的服务。如果您尝试连接到端口 5432,您应该能够:

kubectl exec -ti busybox -- telnet postgres.default.svc.cluster.local 5432

或者(你真的不应该尝试直接连接到 IP)

kubectl exec -ti busybox -- telnet 10.0.209.61 5432

【讨论】:

  • 感谢您的回答。恕我直言 ping 使用 ICMP 并在低于 telnet 的级别上运行。正如here 解释的那样,它没有使用任何端口。但是你给我的 telnet 命令是有效的。事实上,它帮助我解决了我的问题:我可以使用服务的完全限定名称从容器访问 postgres 服务:postgres.default.svc.cluster.local :-)!
  • 是的,使用直接服务 IP 不是一个好习惯。在任何情况下,对节点使用 ping,而不是服务。如果这解决了您的问题,您能否将其标记为已接受?
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多