kubernetes 如何将 pod 暴露给集群机器之外的东西?

时间:2021-05-03 08:27:39

标签: postgresql kubernetes networking pgadmin

我阅读了以下 kubernetes docs,这导致以下 yaml 在集群中运行 postgresql 和 pgadmin:

--- pgadmin-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgadmin-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pgadmin-pod
  template:
    metadata:
      labels:
        app: pgadmin-pod
    spec:
      containers:
        - name: pgadmin-container
          image: dpage/pgadmin4
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 80
          env:
            - name: PGADMIN_DEFAULT_EMAIL
              value: email@example.com
            - name: PGADMIN_DEFAULT_PASSWORD
              value: password

--- pgadmin-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: pgadmin-service
spec:
  type: NodePort
  ports:
    - port: 30000
      targetPort: 80
  selector:
    app: pgadmin-pod

--- postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-pod
  template:
    metadata:
      labels:
        app: postgres-pod
    spec:
      containers:
        - name: postgres-container
          image: postgres:9.6-alpine
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: database
            - name: POSTGRES_PASSWORD
              value: password
            - name: POSTGRES_USER
              value: username
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgrepvc
      volumes:
        - name: postgrepvc
          persistentVolumeClaim:
            claimName: postgres-pv-claim

--- postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  type: NodePort
  ports:
    - port: 30001
      targetPort: 5432
  selector:
    app: postgres-pod

--- postgres-storage.yaml
postgres-storage.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
  name: postgres-pv-volume
  labels:
    type: local
    app: postgres
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-pv-claim
  labels:
    app: postgres
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

然后我运行以下命令 kubectl create -f ./,结果如下: kubernetes pods / svc's

然后我尝试从集群外部访问 10.43.225.170:30000 上的 pgAdmin,但我收到“10.43.225.170 响应时间过长”。无论我尝试什么。

那么我如何将 pgAdmin 和 postgress 暴露给外部世界,有没有办法给它们静态 ip,这样我每次在 kubernetes 上重新部署时就不必更新连接字符串中的 ip,或者我做必须为此使用 statefulset?

1 个答案:

答案 0 :(得分:0)


这里的问题

  1. 您正在尝试访问节点内部 ip 10.43.225.170 而不是 外部 一个。
  2. nodePort 服务配置不正确。此外,您正在尝试调用不正确的端口

您尚未指定您使用的平台。我正在使用 GKE,所以在我的情况下它更容易,因为我在集群节点创建期间自动分配了外部 IP。但我必须手动创建入口防火墙规则以允许从外部访问节点和所需端口 (30000,30001)

在任何情况下,为了能够使用 nodePort - 您应该具有外部 IP 地址分配给集群中的一个节点以及允许进入该端口的流量的防火墙规则


接下来。您正在尝试呼叫 <NodeIP>:spec.ports[*].port

根据Type NodePort documentation

<块引用>

服务显示为 <NodeIP>:spec.ports[*].nodePort

您需要明确指定 nodePort


我对你的部署做了一点改动,部署后可以访问pgAdmin并在防火墙中打开相应的端口。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgadmin-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pgadmin-pod
  template:
    metadata:
      labels:
        app: pgadmin-pod
    spec:
      containers:
        - name: pgadmin-container
          image: dpage/pgadmin4
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 80
          env:
            - name: PGADMIN_DEFAULT_EMAIL
              value: email@example.com
            - name: PGADMIN_DEFAULT_PASSWORD
              value: password

---
apiVersion: v1
kind: Service
metadata:
  name: pgadmin-service
spec:
  type: NodePort
  ports:
    - nodePort: 30000
      targetPort: 80
      port: 80
  selector:
    app: pgadmin-pod

--- postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-pod
  template:
    metadata:
      labels:
        app: postgres-pod
    spec:
      containers:
        - name: postgres-container
          image: postgres:9.6-alpine
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: database
            - name: POSTGRES_PASSWORD
              value: password
            - name: POSTGRES_USER
              value: username
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgrepvc
      volumes:
        - name: postgrepvc
          persistentVolumeClaim:
            claimName: postgres-pv-claim

---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  type: NodePort
  ports:
    - nodePort: 30001
      targetPort: 5432
      port: 5432
  selector:
    app: postgres-pod

---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: postgres-pv-volume
  labels:
    type: local
    app: postgres
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-pv-claim
  labels:
    app: postgres
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

检查:

kubectl apply -f pg_my.yaml
deployment.apps/pgadmin-deployment created
service/pgadmin-service created
service/postgres-service created
persistentvolume/postgres-pv-volume created
persistentvolumeclaim/postgres-pv-claim created


#In my case I take node external ip from any node from `kubectl get nodes -o wide` output:
NAME                                       STATUS   ROLES    AGE   VERSION            INTERNAL-IP   EXTERNAL-IP
gke-cluster-1-default-pool-*******-*****   Ready    <none>   20d   v1.18.16-gke.502   10.186.0.7    *.*.*.*

curl *.*.*.*:30000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/login?next=%2F">/login?next=%2F</a>.

enter image description here enter image description here

相关问题