【问题标题】:Single node Kubernetes cluster - Containers in different pods can't communicate with each other单节点 Kubernetes 集群 - 不同 pod 中的容器无法相互通信
【发布时间】:2021-07-26 22:36:15
【问题描述】:

我有一个反复出现的问题,即不同 pod 中的容器无法相互通信。 为简单起见,我在不同的 pod 中创建了一个只有 2 个容器的集群:

  1. 只做一件事的应用程序:连接到 redis 服务器。
  2. redis 服务器容器

长话短说:尝试从应用程序连接到 redis 时,我不断收到“连接被拒绝”:

$ kubectl logs app-deployment-86f848b46f-n7672

> app@1.0.0 start
> node ./app.js

LATEST
Error: connect ECONNREFUSED 10.104.95.63:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1133:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '10.104.95.63',
  port: 6379
}

应用识别redis-service成功但连接失败

$ kubectl get services
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
app-service     ClusterIP   10.107.18.112   <none>        4000/TCP   2m42s
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP    29h
redis-service   ClusterIP   10.104.95.63    <none>        6379/TCP   29h

应用代码:

const redis = require("redis");
const bluebird = require("bluebird");
bluebird.promisifyAll(redis);
console.log('LATEST');
const host = process.env.HOST;
const port = process.env.PORT;
const client = redis.createClient({ host, port });

client.on("error", function (error) {
    console.error(error);
}); 

应用的 docker 文件:

FROM node
WORKDIR "/app"
COPY ./package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]

对于redis服务器,我尝试了redis的默认镜像,当它不起作用时,我使用了一个定制的镜像,没有绑定到特定的ip,也没有保护模式。

redis dockerfile:

FROM redis:latest
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

最后,我用受人尊敬的 ClusterIP 服务创建了 2 个部署:

应用部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: app
  template:
    metadata:
      labels:
        component: app
    spec: 
      containers:
      - name: app
        image: user/redis-app:latest
        ports:
          - containerPort: 4000
        env:
          - name: HOST
            valueFrom:
              configMapKeyRef:
                name: app-env
                key: HOST
          - name: PORT
            valueFrom:
              configMapKeyRef:
                name: app-env
                key: PORT

应用服务:

apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  type: ClusterIP
  selector:
    component: app
  ports:
    - port: 4000
      targetPort: 4000

环境文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-env
data:
   PORT: "6379"
   HOST: "redis-service.default"

redis 部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      db: redis
  template:
    metadata:
      labels:
        db: redis
    spec: 
      containers:
        - name: redis
          image: user/custome-redis:latest
          ports:
            - containerPort: 6379

redis 服务:

apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  type: ClusterIP
  selector:
    component: redis
  ports:
  - protocol: TCP
    port: 6379
    targetPort: 6379

最初,我使用带有 WSL2 的 Windows 环境和在 docker 上运行的 Kubernetes,并安装了 Docker Desktop。当它失败时,我在 virtualbox 上配置了一个 centos8 vm,并使用 minikube 安装了 kubernets - 得到了相同的结果..

有什么想法吗?....

【问题讨论】:

  • 嗨,AbuJed,欢迎来到 SO。听起来您的 redis.conf 中有一些东西正在更改 redis 侦听的地址。您是否检查过 redis pod 的日志输出以了解它的内容?出于调试目的,您是否尝试过交换“vanilla”redis 映像并查看此行为是否仍然存在?您已经尝试了哪些故障排除步骤,结果如何?祝你好运
  • 您的 Service 绑定到标有 component: redis 的 Pod,但 Deployment 会创建标有 db: redis 的 Pod。这些需要匹配。如果你是kubectl describe service refis-service,它应该说类似Endpoints: &lt;none&gt;,这表明它们不匹配。
  • 大卫迷宫谢谢!!解决了问题..
  • @DavidMaze 您能否发表您的评论作为对该问题的回答?谢谢

标签: docker kubernetes redis


【解决方案1】:

在 David Maze 发现问题后发布 cmets 的答案(作为社区 wiki 添加,随时编辑)

在 pod、部署、服务和其他元素之间匹配标签非常重要。

在上面的示例中,redis 服务使用了不同的标签:

component: redisdb: redis 导致了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2021-12-30
    • 2019-02-08
    • 1970-01-01
    • 2020-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多