docker swarm 上的服务未被与 vpc 对等的 atlas 集群列入白名单
services on docker swarm are not whitelisted by atlas cluster that is peered with the vpc
环境概览:
- Mongodb Atlas 上与 vpc 对等的集群
- VPC
中的EC2实例运行
- docker EC2 实例中的集群。
我遇到了什么:
- 我可以使用来自 EC2 实例的 mongo cli 连接到 mongo
- 我的所有容器都无法连接到 mongodb,即使它们在这个 EC2 实例上 运行
- 只要我将 EC2 实例的 public ip 列入白名单,他们就可以连接 - 但这很奇怪,我希望他们能够连接,因为他们是 运行 on 无需任何特殊白名单即可连接。
我使用的swarm初始化命令:
docker swarm --init --advertise-addr <private ip of the EC2>
当我尝试使用 public ip 时它不起作用,当我没有将 --advertise-addr
添加到 swarm init 时它也不起作用。
其他有用信息:
Docker 文件:
FROM node:12-alpine as builder
ENV TZ=Europe/London
RUN npm i npm@latest -g
RUN mkdir /app && chown node:node /app
WORKDIR /app
RUN apk add --no-cache python3 make g++ tini \
&& apk add --update tzdata
USER node
COPY package*.json ./
RUN npm install --no-optional && npm cache clean --force
ENV PATH /app/node_modules/.bin:$PATH
COPY . .
EXPOSE 8080
FROM builder as dev
USER node
CMD ["nodemon", "src/services/server/server.js"]
FROM builder as prod
USER node
HEALTHCHECK --interval=30s CMD node healthcheck.js
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "--max-old-space-size=2048" ,"src/services/server/server.js"]
我不知道为什么会这样,我该如何解决?
您的 swarm 容器 运行 在您的 EC2 上的单独网络上。
如 here 所述,docker 在初始化 swarm 时创建了一个特殊的 'ingress' 网络。
为了允许它们连接,您可能需要重新配置 docker 设置的默认设置,或者将 docker 的入口网络使用的特定网络接口列入白名单。
在与高级 DevOps 工程师会面后,我们终于找到了问题所在。
原来容器 运行 所在的网络的 CIDR 块与 VPC 的 CIDR 重叠。我们所做的是将以下内容添加到 docker-compose
networks:
wm-net:
driver: overlay
ipam:
driver: default
config:
- subnet: 172.28.0.0/16 #this CIDR doesn't overlap with the VPC
环境概览:
- Mongodb Atlas 上与 vpc 对等的集群
- VPC 中的EC2实例运行
- docker EC2 实例中的集群。
我遇到了什么:
- 我可以使用来自 EC2 实例的 mongo cli 连接到 mongo
- 我的所有容器都无法连接到 mongodb,即使它们在这个 EC2 实例上 运行
- 只要我将 EC2 实例的 public ip 列入白名单,他们就可以连接 - 但这很奇怪,我希望他们能够连接,因为他们是 运行 on 无需任何特殊白名单即可连接。
我使用的swarm初始化命令:
docker swarm --init --advertise-addr <private ip of the EC2>
当我尝试使用 public ip 时它不起作用,当我没有将 --advertise-addr
添加到 swarm init 时它也不起作用。
其他有用信息:
Docker 文件:
FROM node:12-alpine as builder
ENV TZ=Europe/London
RUN npm i npm@latest -g
RUN mkdir /app && chown node:node /app
WORKDIR /app
RUN apk add --no-cache python3 make g++ tini \
&& apk add --update tzdata
USER node
COPY package*.json ./
RUN npm install --no-optional && npm cache clean --force
ENV PATH /app/node_modules/.bin:$PATH
COPY . .
EXPOSE 8080
FROM builder as dev
USER node
CMD ["nodemon", "src/services/server/server.js"]
FROM builder as prod
USER node
HEALTHCHECK --interval=30s CMD node healthcheck.js
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "--max-old-space-size=2048" ,"src/services/server/server.js"]
我不知道为什么会这样,我该如何解决?
您的 swarm 容器 运行 在您的 EC2 上的单独网络上。
如 here 所述,docker 在初始化 swarm 时创建了一个特殊的 'ingress' 网络。
为了允许它们连接,您可能需要重新配置 docker 设置的默认设置,或者将 docker 的入口网络使用的特定网络接口列入白名单。
在与高级 DevOps 工程师会面后,我们终于找到了问题所在。 原来容器 运行 所在的网络的 CIDR 块与 VPC 的 CIDR 重叠。我们所做的是将以下内容添加到 docker-compose
networks:
wm-net:
driver: overlay
ipam:
driver: default
config:
- subnet: 172.28.0.0/16 #this CIDR doesn't overlap with the VPC