我在 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- postgres
或wget -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
如果您仍然无法连接到数据库,请附上以下内容:
kubectl describe pod <<postgres_pod_name>>
kubectl logs <<postgres_pod_name>>
理想情况下,在您尝试连接到它之后kubectl exec -it <<postgres_pod_name>> -- cat /var/lib/postgresql/data/pg_hba.conf
也是 K8s 算子的研究课题。它们对于部署更复杂的生产就绪应用程序堆栈非常有用(例如,具有主 + 副本 + LB 的数据库)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句