Kubernetes - 服务集群IP地址与Pod IP地址的区别

4
我已经在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地址10.244.0.46访问Pod,但该服务没有提供访问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故障排除提示进行了操作,但是我没有发现DNS设置中的任何错误。
我的StatefulSet或Service是否有配置错误?
非常感谢您的帮助! 最好的问候, Eric MANUGUERRA

很抱歉,但是您是否也在单独创建一个未在问题中显示的服务对象? - Vishal Biyani
是的,我已经部署了一个Postgres服务。它在yaml代码的底部进行了描述。 - Eric Manuguerra
1个回答

0

你只打开了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更低的层次上运行。正如这里所解释的那样,它不使用任何端口。但是您给我的telnet命令确实有效。事实上,它帮助我解决了问题:我可以使用服务的完全限定名称postgres.default.svc.cluster.local从容器中访问postgres服务 :-)! - Eric Manuguerra
使用直接服务IP并不是一个好的实践。无论如何,对于节点,请使用ping而不是服务。如果这解决了您的问题,您可以将其标记为已接受吗? - vascop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接