我正在试图验证我的postgres吊舱是否可以通过我刚刚设置的服务访问。到目前为止,我无法证实这一点。我所能做的就是登录到运行postgres本身的容器中,并尝试通过服务的IP与postgres服务器对话。这是不成功的。但是,我不确定这是否是一个有效的测试,以确定集群中的其他豆荚是否可以通过服务与postgres对话,或者我的测试方式是否有问题,或者我的服务或吊舱配置中是否存在根本问题。
我都是在迷你机群上做的。
设置吊舱和服务:
$> kubectl create -f postgres-pod.yml
$> kubectl create -f postgres-service.ymlpostgres-pod.yml
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-volumepostgres-service.yml
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
ports:
- port: 5432
targetPort: 5432
selector:
name: postgres检查服务是否已启动kubectl get services
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:
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服务器。
我不确定在这个过程中有几个步骤:
发布于 2022-05-11 15:22:54
如果只有一(1)个副本,您就不能从该服务“后面”的吊舱中访问服务的IP,至少使用minikube是如此。
发布于 2022-04-15 04:06:11
您好,希望您正在为您的Kubernetes之旅加油!
我想在我的同类(码头中的Kubernetes)集群上尝试这一点。所以这就是我所做的
首先,我在本地设置了一个具有以下配置的集群(信息在这里:https://kind.sigs.k8s.io/docs/user/quick-start/):
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之后,我使用以下命令创建了集群:
kind create cluster --config=config.yaml接下来,我创建了一个测试命名空间(通过: kubectl创建ns,所以- test,-o yaml --dry获得的清单):
apiVersion: v1
kind: Namespace
metadata:
name: so-tests在那里,我设置了我的环境,所以我不得不在上面部署一个postgres,但是下面是我所做的改变:
我创建了一个状态集(它的目标是部署数据库),而不是创建一个单例吊舱。
2-为了知道postgres用户的id是什么,我决定继续使用您的docker映像“postgres :13-阿尔卑斯”,并添加了一个安全上下文,作为本地postgres用户(而不是dave not root)运行--为了知道postgres用户的id是什么,我首先在没有安全上下文的情况下部署状态集并执行以下命令:
❯ 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,我就将其添加到状态集清单中:
securityContext:
runAsUser: 70
fsGroup: 703-我决定创建一个秘密和一个configmap,而不是直接将配置和机密作为环境变量添加到状态集的pod配置中:
首先,让我们创建一个包含密码的kubernetes秘密,下面是清单(从下面的命令获得:"k创建来自文本的password=dave postgres- -o yaml
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 )
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)公开。
以下是清单:
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
---我使用以下方法进行了部署:
kubectl apply -f postgres.yaml我测试了如何连接到Postgres-0pod,以便用$POSTGRES_USER和$POSTGRES_PASSWORD凭据连接数据库:
❯ 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=#我列出了数据库:
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:
tmp=# \c tmp
Password:
You are now connected to database "tmp" as user "dave".很成功。
我还试图使用IP连接数据库,就像您尝试的那样:
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港口-前进:
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“。
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,而不是使用吊舱,而是使用服务:
❯ 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 (通过服务器名作为主机名),下面是吊舱的清单:
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内部连接的结果:
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
i.e: postgres-0.postgres-service.so-tests.svc.cluster.local从集群外部访问状态集工作负载的How to expose a headless service for a StatefulSet externally in Kubernetes是一个很好的开端:
希望这能帮到你。谢谢你的问题。布吉
https://stackoverflow.com/questions/71878984
复制相似问题