Kubernetes 服务无法访问

Urr4

我在 2 个 Rasberry Pis(模型 3 和 3B+)上创建了一个 Kubernetes 集群,用作 Kubernetes 游乐场。

我已经部署了一个 postgresql 和一个 spring 启动应用程序(称为餐刨)来玩。膳食计划者应该从 postgresql 读取数据和向 postgresql 写入数据。

但是,该应用程序无法访问数据库。

这是 postgresql 的部署描述符:

kind: Service
apiVersion: v1
metadata:
  name: postgres
  namespace: home
  labels:
    app: postgres
spec:
  selector:
    app: postgres
  ports:
  - port: 5432
    targetPort: 5432
    name: postgres
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: postgres
  namespace: home
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:13.2
          imagePullPolicy: IfNotPresent
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: dev-db-secret
                  key: username
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: dev-db-secret
                  key: password
            - name: POSTGRES_DB
              value: home
          ports:
            - containerPort: 5432
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgres-data
      volumes:
        - name: postgres-data
          persistentVolumeClaim:
            claimName: postgres-pv-claim
---

这是餐刨机的部署描述符

kind: Service
apiVersion: v1
metadata:
  name: meal-planner
  namespace: home
  labels:
    app: meal-planner
spec:
  type: ClusterIP
  selector:
    app: meal-planner
  ports:
    - port: 8080
      name: meal-planner
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: meal-planner
  namespace: home
spec:
  replicas: 1
  selector:
    matchLabels:
      app: meal-planner
  template:
    metadata:
      labels:
        app: meal-planner
    spec:
      containers:
        - name: meal-planner
          image: 08021986/meal-planner:v1
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
---

Meal-planer 镜像是一个运行 jar 文件的 arm32v7 镜像。在集群内部,膳食计划者使用连接字符串 jdbc:postgresql://postgres:5432/home连接到数据库。

我绝对确定 DB 凭据是正确的,因为我可以在端口转发服务时访问 DB。

当部署这两个应用程序时,我可以kubectl exec -it <<podname>> -n home -- bin/sh进入它。如果我打电话wget -O- postgreswget -O- postgres.home从那里打电话,我总是得到Connecting to postgres (postgres)|10.43.62.32|:80... failed: Network is unreachable.

我不知道,为什么网络无法访问,我不知道我能做些什么。

劳斯瓦夫·萨姆祖尔

首先,不要将部署工作负载用于需要保存状态的应用程序。这可能会给您带来一些麻烦甚至数据丢失。为此,您应该使用statefulset

StatefulSet 是用于管理有状态应用程序的工作负载 API 对象。

管理一组 Pod 的部署和扩展,并提供有关这些 Pod 的排序和唯一性的保证。

与 Deployment 一样,StatefulSet 管理基于相同容器规范的 Pod。与 Deployment 不同,StatefulSet 为其每个 Pod 维护一个粘性标识。这些 pod 是根据相同的规范创建的,但不可互换:每个 pod 都有一个持久标识符,它在任何重新调度时都会维护。

同样对于数据库,存储应尽可能靠近引擎(由于延迟),最好hostpath storageClass使用ReadWriteOnce.

现在关于您的问题,我的猜测是您如何在应用程序中连接到数据库的问题,或者远程连接可能被 pg_hba.conf 中的定义拒绝

这是一个可以帮助您入门的最小工作示例:

kind: Namespace
apiVersion: v1
metadata:
  name: test
  labels:
    name: test
---
kind: Service
apiVersion: v1
metadata:
  name: postgres-so-test
  namespace: test
  labels:
    app: postgres-so-test
spec:
  selector:
    app: postgres-so-test
  ports:
  - port: 5432
    targetPort: 5432
    name: postgres-so-test
---
kind: StatefulSet
apiVersion: apps/v1
metadata:
  namespace: test
  name: postgres-so-test
spec:
  replicas: 1
  serviceName: postgres-so-test
  selector:
    matchLabels:
      app: postgres-so-test
  template:
    metadata:
      labels:
        app: postgres-so-test
    spec:
      containers:
        - name: postgres
          image: postgres:13.2
          imagePullPolicy: IfNotPresent
          env:
            - name: POSTGRES_USER
              value: johndoe
            - name: POSTGRES_PASSWORD
              value: thisisntthepasswordyourelokingfor
            - name: POSTGRES_DB
              value: home
          ports:
            - containerPort: 5432

现在让我们测试一下。注意:我还将从 Postgres 映像创建一个部署,只是为了在这个命名空间中有一个 pod,它将有pg_isready二进制文件,以便测试与创建的数据库的连接。

pi@rsdev-pi-master:~/test $ kubectl apply -f test_db.yml 
namespace/test created
service/postgres-so-test created
statefulset.apps/postgres-so-test created
pi@rsdev-pi-master:~/test $ kubectl apply -f test_container.yml 
deployment.apps/test-container created
pi@rsdev-pi-master:~/test $ kubectl get pods -n test
NAME                             READY   STATUS    RESTARTS   AGE
postgres-so-test-0               1/1     Running   0          19s
test-container-d77d75d78-cgjhc   1/1     Running   0          12s
pi@rsdev-pi-master:~/test $ sudo kubectl get all -n test
NAME                                 READY   STATUS    RESTARTS   AGE
pod/postgres-so-test-0               1/1     Running   0          26s
pod/test-container-d77d75d78-cgjhc   1/1     Running   0          19s

NAME                       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/postgres-so-test   ClusterIP   10.43.242.51   <none>        5432/TCP   30s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/test-container   1/1     1            1           19s

NAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/test-container-d77d75d78   1         1         1       19s

NAME                                READY   AGE
statefulset.apps/postgres-so-test   1/1     27s

pi@rsdev-pi-master:~/test $ kubectl exec -it test-container-d77d75d78-cgjhc -n test -- /bin/bash
root@test-container-d77d75d78-cgjhc:/# pg_isready -d home -h postgres-so-test -p 5432 -U johndoe
postgres-so-test:5432 - accepting connections

如果您仍然无法连接到数据库,请附上以下内容:

  1. kubectl describe pod <<postgres_pod_name>>
  2. kubectl logs <<postgres_pod_name>> 理想情况下,在您尝试连接到它之后
  3. kubectl exec -it <<postgres_pod_name>> -- cat /var/lib/postgresql/data/pg_hba.conf

也是 K8s 算子的研究课题。它们对于部署更复杂的生产就绪应用程序堆栈非常有用(例如,具有主 + 副本 + LB 的数据库)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法访问将externalTrafficPolicy作为“本地”的kubernetes服务

如何用kubernetes和soap解决我的问题。客户端无法访问服务器

Pod无法访问本地机器Kubernetes服务

kubernetes服务IP无法访问

随着年龄的增长,Kubernetes服务无法访问

无法访问Kubernetes服务

kubectl无法访问新配置的kubernetes节点

Kubernetes Pod无法访问外部IP地址

如果在kubernetes集群中将externalTrafficPolicy设置为Local,为什么无法访问服务

Kubernetes节点无法访问外部Kafka集群

在Kubernetes中无法访问Sidecar容器

删除默认令牌后无法访问kubernetes API

无法访问kubernetes上的暴露端口

无法访问通过NodePort公开的Kubernetes服务

无法访问本地主机上的kubernetes服务

Kubernetes无法访问Pod

无法访问kubernetes pod的代理

集群内无法访问Kubernetes POD

使用hostNetwork True的Kubernetes Pod无法访问同一集群中的服务的外部IP

Kubernetes 正在创建一个端口不正确的 nodeport 服务并且无法访问

Kubernetes:无法访问 kubernetes 仪表板

无法访问部署在 kubernetes 集群上的应用程序

由于无法访问 kubernetes api 服务器集群 IP,大使 pod 在 kubernetes 中失败 - [Errno 113] 主机无法访问',)

无法访问 Kubernetes 中的服务

docker-for-desktop 窗口中的 pod 无法访问 kubernetes 外部名称服务

无法访问 Kubernetes 上的 LoadBalancer 服务

Kubernetes 上的 nginx 无法访问角度应用程序

Kubernetes:无法访问 flannel pod

Kubernetes pod 无法访问互联网,而主机可以