如何解决无法从外部登录Kubernetes集群内部的Postgres
我只想从K8集群外部登录到postgres数据库。我创建了以下配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: database-persistent-volume-claim
containers:
- name: postgres
image: postgres
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
subPath: postgres
env:
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PORT
value: '5432'
- name: POSTGRES_DB
value: postgres
- name: POSTGRES_PASSWORD
value: password
- name: POSTGRES_HOST_AUTH_METHOD
value: trust
---
apiVersion: v1
kind: Service
metadata:
name: postgres-srv
spec:
selector:
app: postgres
type: NodePort
ports:
- name: postgres
protocol: TCP
port: 5432
targetPort: 5432
配置图:
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
5432: "default/postgres-srv:5432"
我已检查kubectl get services
并尝试使用端点和cluster-ip。这些都不起作用。
psql "postgresql://postgres:password@[ip]:5432/postgres"
吊舱正在运行,日志显示一切就绪。我在这里想念什么吗?我正在数字海洋中运行集群。
编辑:
我希望能够从主机访问数据库。 (sub.domain.com)我已经退出了部署,但仍然无法进入。我针对的唯一配置是上面显示的内容。我的网域确实有A记录,可以通过我的Ingress Nginx服务访问其他暴露的Pod。
解决方法
您可以expose TCP and UDP services进行ingress-nginx
配置。
例如将GKE与ingress-nginx
,nfs-server-provisioner和bitnami/postgresql
helm
图表结合使用:
kubectl create secret generic -n default postgresql \
--from-literal=postgresql-password=$(openssl rand -base64 32) \
--from-literal=postgresql-replication-password=$(openssl rand -base64 32)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install -n default postgres bitnami/postgresql \
--set global.storageClass=nfs-client \
--set existingSecret=postgresql
修补ingress-nginx
tcp-services
ConfigMap
:
kubectl patch cm -n ingress-nginx tcp-services -p '{"data": {"5432": "default/postgres-postgresql:5432"}}'
更新代理端口(即Service
)的控制器kubectl edit svc -n ingress-nginx ingress-nginx
:
- name: postgres
port: 5432
protocol: TCP
targetPort: 5432
注意:您可能必须更新现有的ingress-nginx
控制器部署args
(即kubectl edit deployments.apps -n ingress-nginx nginx-ingress-controller
),使其包含--tcp-services-configmap=ingress-nginx/tcp-services
并退回{ {1}}控制器(如果您编辑部署规范(即ingress-nginx
)。
测试连接:
kubectl scale deployment -n ingress-nginx --replicas=0 && kubectl scale deployment -n ingress-nginx --replicas=3
注意:我在Google Cloud DNS中手动创建了一个export PGPASSWORD=$(kubectl get secrets -n default postgresql -o jsonpath={.data.postgresql-password} |base64 -d)
docker run --rm -it \
-e PGPASSWORD=${PGPASSWORD} \
--entrypoint psql \
--network host \
postgres:13-alpine -U postgres -d postgres -h example.com
记录,以将主机名解析为群集的外部IP。
更新:除了创建A
配置,安装ingress-nginx
图表等外,还必须在负载均衡器上禁用“代理协议”以获取用于DigitalOcean中的部署的连接(否则bitnami/postgresql
会postgres
):
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。