在 kubernetes 中基于 Pod 名称链接容器



我试图让不同的 pod 每个都运行自己的容器,我试图遵循链接两个 docker 容器的相同说明:

docker run -d -e POSTGRES_USER=name -e POSTGRES_PASSWORD=pass -e POSTGRES_DB=postgres --name db postgres:10

另一个容器:

docker run -p port:port --name image-name --link db:db -t image

和 Kubernetes 部署:

.DB

apiVersion: apps/v1
kind: Deployment
metadata:
name: db
labels:
app: db
spec:
replicas: 1
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- name: db
image: postgres
ports:
- containerPort: 5432
env:
- name: "POSTGRES_DB"
value: "postgres"
- name: "POSTGRES_USERNAME"
value: "name"
- name: "POSTGRES_PASSWORD"
value: "pass"

.APP

apiVersion: apps/v1
kind: Deployment
metadata:
name: APP
labels:
app: APP
spec:
replicas: 1
selector:
matchLabels:
app: APP
template:
metadata:
labels:
app: APP
spec:
containers:
- name: APP
image: image
ports:
- containerPort: port

现在的问题是,我是否需要在同一个 pod 中创建容器,并以与 docker 命令(db=db( 类似的名称命名它? 还是需要正确配置网络,以便容器可以找到主机名?

您必须创建一个指向 pod(部署(的服务。通过服务,可以跨部署管理流量。

有关更多信息,您可以查看此文档:https://kubernetes.io/docs/concepts/services-networking/service/

如果您正在寻找内部 DNS 通信

请检查 : https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

您需要在数据库上创建服务。kubernetes 文档解释了执行此操作的各种选项。一旦你有了服务,你的 Pod 将能够使用 kubernetes 提供给 pod 的 DNS 按名称查找该服务。该服务充当(在本例中为数据库(Pod 的代理。

在 Kubernetes 中,Pod 被认为是最小的单元,因此将它们放在单独的 pod 中更有意义,这样它们就有自己的生命周期。你的做法绝对是正确的;要使它们工作,您需要公开数据库,以便您的应用程序可以连接到它,即将数据库公开为 ClusterIP 类型的服务,然后您可以通过集群内的服务名称访问它。

一个简单的例子——

apiVersion: v1
kind: Service
metadata:
name: "postgres"
labels:
app.kubernetes.io/name: postgres
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
protocol: TCP
name: dbport
selector:
app.kubernetes.io/name: postgres