首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从postgres容器本身通过服务访问postgres

无法从postgres容器本身通过服务访问postgres
EN

Stack Overflow用户
提问于 2022-04-15 00:50:34
回答 2查看 764关注 0票数 0

我正在试图验证我的postgres吊舱是否可以通过我刚刚设置的服务访问。到目前为止,我无法证实这一点。我所能做的就是登录到运行postgres本身的容器中,并尝试通过服务的IP与postgres服务器对话。这是不成功的。但是,我不确定这是否是一个有效的测试,以确定集群中的其他豆荚是否可以通过服务与postgres对话,或者我的测试方式是否有问题,或者我的服务或吊舱配置中是否存在根本问题。

我都是在迷你机群上做的。

设置吊舱和服务:

代码语言:javascript
复制
$> kubectl create -f postgres-pod.yml
$> kubectl create -f postgres-service.yml

postgres-pod.yml

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
    name: postgres
    labels:
        env: prod
        creation_method: manual
        domain: infrastructure
spec:
    containers:
        - image: postgres:13-alpine
          name: kubia-postgres
          ports:
              - containerPort: 5432
                protocol: TCP
          env:
              - name: POSTGRES_PASSWORD
                value: dave
              - name: POSTGRES_USER
                value: dave
              - name: POSTGRES_DB
                value: tmp
# TODO:
#    volumes:
#        - name: postgres-db-volume

postgres-service.yml

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
    name: postgres-service
spec:
    ports:
        - port: 5432
          targetPort: 5432
    selector:
        name: postgres

检查服务是否已启动kubectl get services

代码语言:javascript
复制
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP    35d
postgres-service   ClusterIP   10.110.159.21   <none>        5432/TCP   71m

然后,登录到postgres容器:

$> kubectl exec --stdin --tty postgres -- /bin/bash

然后,尝试访问该服务的IP:

代码语言:javascript
复制
bash-5.1# psql -U dave -h 10.110.159.21 -p 5432 tmp
psql: error: could not connect to server: Connection refused
    Is the server running on host "10.110.159.21" and accepting
    TCP/IP connections on port 5432?

因此,使用这种方法,我无法使用服务的IP连接到postgres服务器。

我不确定在这个过程中有几个步骤:

  1. 是服务配置中的按名称选择块吗?
  2. 您能从服务背后的豆荚访问服务的IP吗?
  3. 实际上是验证DB服务器通过服务可访问的有效方法吗?还是有其他方式?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-11 15:22:54

如果只有一(1)个副本,您就不能从该服务“后面”的吊舱中访问服务的IP,至少使用minikube是如此。

票数 0
EN

Stack Overflow用户

发布于 2022-04-15 04:06:11

您好,希望您正在为您的Kubernetes之旅加油!

我想在我的同类(码头中的Kubernetes)集群上尝试这一点。所以这就是我所做的

首先,我在本地设置了一个具有以下配置的集群(信息在这里:https://kind.sigs.k8s.io/docs/user/quick-start/):

代码语言:javascript
复制
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: so-cluster-1
nodes:
- role: control-plane
  image: kindest/node:v1.23.5
- role: control-plane
  image: kindest/node:v1.23.5
- role: control-plane
  image: kindest/node:v1.23.5
- role: worker
  image: kindest/node:v1.23.5
- role: worker
  image: kindest/node:v1.23.5
- role: worker
  image: kindest/node:v1.23.5

之后,我使用以下命令创建了集群:

代码语言:javascript
复制
kind create cluster --config=config.yaml

接下来,我创建了一个测试命名空间(通过: kubectl创建ns,所以- test,-o yaml --dry获得的清单):

代码语言:javascript
复制
apiVersion: v1
kind: Namespace
metadata:
  name: so-tests

在那里,我设置了我的环境,所以我不得不在上面部署一个postgres,但是下面是我所做的改变:

我创建了一个状态集(它的目标是部署数据库),而不是创建一个单例吊舱。

2-为了知道postgres用户的id是什么,我决定继续使用您的docker映像“postgres :13-阿尔卑斯”,并添加了一个安全上下文,作为本地postgres用户(而不是dave not root)运行--为了知道postgres用户的id是什么,我首先在没有安全上下文的情况下部署状态集并执行以下命令:

代码语言:javascript
复制
❯ k exec -it postgres-0 -- bash
bash-5.1# whoami
root
bash-5.1# id
uid=0(root) gid=0(root) groups=1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
bash-5.1# id postgres
uid=70(postgres) gid=70(postgres) groups=70(postgres),70(postgres)
bash-5.1# exit

因此,一旦我知道postgres用户的id为70,我就将其添加到状态集清单中:

代码语言:javascript
复制
securityContext:
runAsUser: 70
fsGroup: 70

3-我决定创建一个秘密和一个configmap,而不是直接将配置和机密作为环境变量添加到状态集的pod配置中:

首先,让我们创建一个包含密码的kubernetes秘密,下面是清单(从下面的命令获得:"k创建来自文本的password=dave postgres- -o yaml

代码语言:javascript
复制
apiVersion: v1
data:
  password: ZGF2ZQ==
kind: Secret
metadata:
  name: postgres-secret

在此之后,我创建了一个configmap来存储我们的postgres配置,下面是清单(通过运行获得: kubectl创建configmap postgres-config -from-from- user=dave -from- db=tmp -dry=client -o yaml )

代码语言:javascript
复制
apiVersion: v1
data:
  db: tmp
  user: dave
kind: ConfigMap
metadata:
  name: postgres-config

因为,这只是为了测试目的,我没有为状态集设置动态卷,也没有预先提供卷。相反,我配置了一个简单的emptyDir来存储postgres数据(/var/lib/postgresql/ data )。

注:默认情况下,emptyDir卷存储在支持节点的任何介质上--这可能是磁盘、SSD或网络存储,这取决于您的环境。但是,您可以将emptyDir.medium字段设置为"Memory“,让Kubernetes替您挂载tmpfs (RAM支持的文件系统)。(这是从这里来的Create a new volume when pod restart in a statefulset)

由于它是一个状态集,它必须由无头库服务(https://kubernetes.io/fr/docs/concepts/services-networking/service/#headless-services)公开。

以下是清单:

代码语言:javascript
复制
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: "postgres"
  replicas: 2
  selector:
    matchLabels:
      env: prod
      domain: infrastructure
  template:
    metadata:
      labels:
        env: prod
        domain: infrastructure
    spec:
      terminationGracePeriodSeconds: 20
      securityContext:
        runAsUser: 70
        fsGroup: 70
      containers:
      - name: kubia-postgres
        image: postgres:13-alpine
        env:
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: password
        - name: POSTGRES_USER
          valueFrom:
            configMapKeyRef:
              name: postgres-config
              key: user
        - name: POSTGRES_DB
          valueFrom:
            configMapKeyRef:
              name: postgres-config
              key: db
        ports:
        - containerPort: 5432
          protocol: TCP
        volumeMounts:
        - name: postgres-test-volume
          mountPath: /var/lib/postgresql
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
      volumes:
      - name: postgres-test-volume
        emptyDir: {}

---

apiVersion: v1
kind: Service
metadata:
  name: postgres-service
  labels:
    env: prod
    domain: infrastructure
spec:
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
    name: pgsql
  clusterIP: None
  selector:
    env: prod
    domain: infrastructure

---

apiVersion: v1
data:
  password: ZGF2ZQ==
kind: Secret
metadata:
  name: postgres-secret

---

apiVersion: v1
data:
  db: tmp
  user: dave
kind: ConfigMap
metadata:
  name: postgres-config
---

我使用以下方法进行了部署:

代码语言:javascript
复制
kubectl apply -f postgres.yaml

我测试了如何连接到Postgres-0pod,以便用$POSTGRES_USER和$POSTGRES_PASSWORD凭据连接数据库:

代码语言:javascript
复制
❯  k exec -it pod/postgres-0 -- bash
bash-5.1$ psql --username=$POSTGRES_USER -W --host=localhost --port=5432 --dbname=tmp
Password:
psql (13.6)
Type "help" for help.

tmp=#

我列出了数据库:

代码语言:javascript
复制
tmp=# \l
                             List of databases
   Name    | Owner | Encoding |  Collate   |   Ctype    | Access privileges
-----------+-------+----------+------------+------------+-------------------
 postgres  | dave  | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | dave  | UTF8     | en_US.utf8 | en_US.utf8 | =c/dave          +
           |       |          |            |            | dave=CTc/dave
 template1 | dave  | UTF8     | en_US.utf8 | en_US.utf8 | =c/dave          +
           |       |          |            |            | dave=CTc/dave
 tmp       | dave  | UTF8     | en_US.utf8 | en_US.utf8 |
(4 rows)

我连接到"tmp“db:

代码语言:javascript
复制
tmp=# \c tmp
Password:
You are now connected to database "tmp" as user "dave".

很成功。

我还试图使用IP连接数据库,就像您尝试的那样:

代码语言:javascript
复制
bash-5.1$ ip a | grep /24
    inet 10.244.4.8/24 brd 10.244.4.255 scope global eth0
bash-5.1$ psql --username=$POSTGRES_USER -W --host=10.244.4.8 --port=5432 --dbname=tmp
Password:
psql (13.6)
Type "help" for help.

tmp=#

很成功。

然后,我下载了dbeaver (从这里https://dbeaver.io/download/ )来测试来自集群外部的访问:

有一个kubectl港口-前进:

代码语言:javascript
复制
kubectl port-forward statefulset/postgres 5432:5432

Forwarding from 127.0.0.1:5432 -> 5432
Forwarding from [::1]:5432 -> 5432

我在dbeaver上创建了连接,并且可以使用dave:dave凭据轻松地从localhost:5361访问db "tmp“。

代码语言:javascript
复制
kubectl port-forward statefulset/postgres 5432:5432

Forwarding from 127.0.0.1:5432 -> 5432
Forwarding from [::1]:5432 -> 5432
Handling connection for 5432
Handling connection for 5432

太完美了。

和以前一样(使用dbeaver),我尝试使用端口向前连接db,而不是使用吊舱,而是使用服务:

代码语言:javascript
复制
❯ kubectl port-forward service/postgres-service 5432:5432
Forwarding from 127.0.0.1:5432 -> 5432
Forwarding from [::1]:5432 -> 5432
Handling connection for 5432
Handling connection for 5432

也起作用了!

我还根据我们的配置创建了一个独立的吊舱,以访问另一个吊舱中的db (通过服务器名作为主机名),下面是吊舱的清单:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: postgres
  labels:
    app: test
spec:
  terminationGracePeriodSeconds: 20
  securityContext:
    runAsUser: 70
    fsGroup: 70
  containers:
  - name: kubia-postgres
    image: postgres:13-alpine
    env:
    - name: POSTGRES_PASSWORD
      valueFrom:
        secretKeyRef:
          name: postgres-secret
          key: password
    - name: POSTGRES_USER
      valueFrom:
        configMapKeyRef:
          name: postgres-config
          key: user
    - name: POSTGRES_DB
      valueFrom:
        configMapKeyRef:
          name: postgres-config
          key: db
    ports:
    - containerPort: 5432
      protocol: TCP
    volumeMounts:
    - name: postgres-test-volume
      mountPath: /var/lib/postgresql
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  volumes:
  - name: postgres-test-volume
    emptyDir: {}

下面是从podtest内部连接的结果:

代码语言:javascript
复制
bash-5.1$ psql --username=$POSTGRES_USER -W --host=postgres-service --port=5432 --dbname=tmp
Password:
psql (13.6)
Type "help" for help.

tmp=#

这里是如何从pod/命名空间外部访问它(确保没有阻止connection):的网络规则)

StatefulSetName-Ordinal.Service.Namespace.svc.cluster.local

代码语言:javascript
复制
i.e: postgres-0.postgres-service.so-tests.svc.cluster.local

从集群外部访问状态集工作负载的How to expose a headless service for a StatefulSet externally in Kubernetes是一个很好的开端:

希望这能帮到你。谢谢你的问题。布吉

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71878984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档