DNS в Kubernetes не работает должным образом
Я хорошо разбираюсь в 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
, Есть идеи, что я делаю не так?
2 ответа
Вы определили все 3 контейнера как часть одного модуля. Модули имеют общее сетевое пространство имен, поэтому в текущей настройке (что не правильно, подробнее об этом в секунду) вы можете общаться с другими контейнерами, используя localhost:<port>
,
"Правильный" способ сделать это состоит в том, чтобы создать развертывание для каждого приложения и обеспечить его развертывание службами.
Ваш пример будет примерно (не проверен):
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-записи регистрируются для служб, поэтому вы подключаетесь к ним и пересылаетесь в модули за ними (упрощенно). Если вам нужно получить доступ к приложению-узлу из внешнего мира, это целая дополнительная сделка, и вы должны взглянуть на LoadBalancer
Тип услуг, или Ingress.
В качестве дополнения к johnharris85 DNS, когда вы будете отделять свои приложения, что вы должны сделать в вашем сценарии.
Модули с несколькими контейнерами обычно используются в конкретных случаях использования, таких как, например, контейнеры с коляской, чтобы помочь основному контейнеру с некоторыми конкретными задачами или прокси-серверами, мостами и адаптерами, например, для обеспечения подключения к некоторому конкретному месту назначения.
В вашем случае вы можете легко разделить их. В этом случае у вас есть развертывание с 1 Pod, в котором есть 3 контейнера, которые взаимодействуют друг с другом по локальному хосту, а не по DNS-именам, как уже упоминалось. После чего я рекомендую вам прочитать о DNS внутри Kubernetes и о том, как работает связь с сервисами, входящими в игру. В случае стручков вы можете прочитать больше здесь.