kubernetes - Kubernetes 部署中的 DNS 未按预期工作
问题描述
我精通 Docker,但在这里用 K8 肯定做错了什么。我正在运行skaffold
并minikube
试图让容器之间的 DNS 正常工作。这是我的部署:
kind: Deployment
apiVersion: apps/v1
metadata:
name: my-api
labels:
app: my-api
spec:
replicas: 1
selector:
matchLabels:
app: my-api
template:
metadata:
name: my-api
labels:
app: my-api
spec:
containers:
- name: my-api-postgres
image: postgres:11.2-alpine
env:
- name: POSTGRES_USER
value: "my-api"
- name: POSTGRES_DB
value: "my-api"
- name: POSTGRES_PASSWORD
value: "my-pass"
ports:
- containerPort: 5432
- name: my-api-redis
image: redis:5.0.4-alpine
command: ["redis-server"]
args: ["--appendonly", "yes"]
ports:
- containerPort: 6379
- name: my-api-node
image: my-api-node
command: ["npm"]
args: ["run", "start-docker-dev"]
ports:
- containerPort: 3000
但是,在这种情况下my-api-node
无法my-api-postgres
通过 DNS 主机名联系my-api-postgres
。知道我做错了什么吗?
解决方案
您已将所有 3 个容器定义为同一个 pod 的一部分。Pod 有一个通用的网络命名空间,因此在您当前的设置中(这是不正确的,稍后会详细介绍),您可以使用localhost:<port>
.
这样做的“正确”方法是为每个应用程序创建一个部署,并在这些部署前面加上services。
您的示例将大致变为(未经测试):
kind: Deployment
apiVersion: apps/v1
metadata:
name: my-api-node
namespace: my-api
labels:
app: my-api-node
spec:
replicas: 1
selector:
matchLabels:
app: my-api-node
template:
metadata:
name: my-api-node
labels:
app: my-api-node
spec:
containers:
- name: my-api-node
image: my-api-node
command: ["npm"]
args: ["run", "start-docker-dev"]
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
namespace: my-api
name: my-api-node
spec:
selector:
app: my-api-node
ports:
- protocol: TCP
port: 3000
targetPort: 3000
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: my-api-redis
namespace: my-api
labels:
app: my-api-redis
spec:
replicas: 1
selector:
matchLabels:
app: my-api-redis
template:
metadata:
name: my-api-redis
labels:
app: my-api-redis
spec:
containers:
- name: my-api-redis
image: redis:5.0.4-alpine
command: ["redis-server"]
args: ["--appendonly", "yes"]
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
namespace: my-api
name: my-api-redis
spec:
selector:
app: my-api-redis
ports:
- protocol: TCP
port: 6379
targetPort: 6379
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: my-api-postgres
namespace: my-api
labels:
app: my-api-postgres
spec:
replicas: 1
selector:
matchLabels:
app: my-api-postgres
template:
metadata:
name: my-api-postgres
labels:
app: my-api-postgres
spec:
containers:
- name: my-api-postgres
image: postgres:11.2-alpine
env:
- name: POSTGRES_USER
value: "my-api"
- name: POSTGRES_DB
value: "my-api"
- name: POSTGRES_PASSWORD
value: "my-pass"
ports:
- containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
namespace: my-api
name: my-api-postgres
spec:
selector:
app: my-api-postgres
ports:
- protocol: TCP
port: 5432
targetPort: 5432
DNS 记录为服务注册,因此您连接到这些服务并被转发到其背后的 pod(简化)。如果您需要从外部世界访问您的节点应用程序,那是一个额外的交易,您应该查看LoadBalancer
类型服务或Ingress。
推荐阅读
- prolog - 使用最大值进行选择排序
- python - Tkinter:从画布中删除图像时出错
- google-sheets - 将列转换为行
- sql - 需要知道&&在这个查询中的作用
- php - 为什么我的 html 文件在 wordpress 侧边栏小部件中的回显会破坏其他小部件前端小部件样式?
- c++ - 如何在没有任务切换的情况下创建 QThread
- python - 使用 Pandas 聚合 JSON 对象中的相似字段
- memory-management - cython 内存不足
- php - 如何修复 PHP/Sendgrid/Heroku 中的 "401Array{"errors":[{"message":"Permission denied, wrong credentials","field":null,"help":null}]}" 错误?
- css - 在 Less 样式表中使用 Angular 组件名称与生成的 DOM 不匹配