【问题标题】:Kubernetes multi-tier container applicationKubernetes 多层容器应用
【发布时间】:2015-10-25 10:53:06
【问题描述】:

我有两个运行 Flaskredis 的 Docker 容器,它们在使用 Docker 容器链接进行链接时可以很好地通信。

我正在尝试使用服务和 pod 在 Kubernetes 上部署相同的内容,但是它不起作用。我正在学习 Kubernetes,所以我一定在这里做错了。

以下是运行良好的 Docker 命令:

$ docker run -d --name=redis -v /opt/redis:/redis -p 6379 redis_image redis-server
$ docker run -d -p 5000:5000 --link redis:redis --name flask flask_image

kubernetes pod 和 services 文件如下:

pod-redis.yaml

apiVersion: v1
kind: Pod
metadata:
  name: redis
  labels:
    name: redis
    app: redis
spec:
  containers:
  - name: redis
    image: dharmit/redis
    command:
    - "redis-server"
  volumeMounts:
  - mountPath: /redis
    name: redis-store
  volumes:
  - name: redis-store
    hostPath:
      path: /opt/redis

service-redis.yaml

apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    name: redis
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis

pod-flask.yaml

apiVersion: v1
kind: Pod
metadata:
  name: flask
  labels:
    name: flask
    app: flask
spec:
  containers:
  - name: flask
    image: dharmit/flask 
    ports:
    - containerPort: 5000

service-flask.yaml

apiVersion: v1
kind: Service
metadata:
  name: flask
  labels:
    name: flask
spec:
  ports: 
  - port: 5000
  selector:
    app: flask

当我执行kubectl create -f /path/to/dir/ 时,所有服务和 pod 都可以正常启动并被kubectl 命令列出。但是当我尝试访问端口 5000 时,Flask 应用程序抱怨它无法与 redis 容器通信。以下是与服务相关的输出:

烧瓶服务

Name:           flask
Namespace:      default
Labels:         name=flask
Selector:       app=flask
Type:           ClusterIP
IP:         10.254.155.179
Port:           <unnamed>   5000/TCP
Endpoints:      172.17.0.2:5000
Session Affinity:   None
No events.

redis 服务

Name:           redis
Namespace:      default
Labels:         name=redis
Selector:       app=redis
Type:           ClusterIP
IP:         10.254.153.217
Port:           <unnamed>   6379/TCP
Endpoints:      172.17.0.1:6379
Session Affinity:   None
No events.

以及curl命令的输出:

Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/app/app/views.py", line 9, in index
    if r.get("count") == None:
  File "/usr/lib/python2.7/site-packages/redis/client.py", line 863, in get
    return self.execute_command('GET', name)
  File "/usr/lib/python2.7/site-packages/redis/client.py", line 570, in execute_command
    connection.send_command(*args)
  File "/usr/lib/python2.7/site-packages/redis/connection.py", line 556, in send_command
    self.send_packed_command(self.pack_command(*args))
  File "/usr/lib/python2.7/site-packages/redis/connection.py", line 532, in send_packed_command
    self.connect()
  File "/usr/lib/python2.7/site-packages/redis/connection.py", line 436, in connect
    raise ConnectionError(self._error_message(e))
ConnectionError: Error -2 connecting to redis:6379. Name or service not known.

我在这里做错了什么?

【问题讨论】:

  • 您是否在flask 容器中添加音量。好像你在docker中添加了
  • @AerofoilKite 不,我没有提到烧瓶容器中的体积。我需要吗?
  • 您真的在运行 DNS 服务器吗?你没有提到你正在使用什么环境。

标签: docker kubernetes


【解决方案1】:

您需要在您的pod-redis.yaml 中添加containerPort

- name: redis
  image: dharmit/redis
  command:
    - "redis-server"
  ports: 
    - containerPort: 6379
      hostPort: 6379

【讨论】:

  • 这在一定程度上确实有帮助。在docker ps 输出中,我现在看到主机上的端口 6379 被映射到容器的同一端口。但我仍然从 Flask 容器中得到同样的错误
【解决方案2】:

您正在尝试连接到 redis:6379。但是谁是主机名redis?可能不是您刚刚启动的 pod。

为了在 pod 和服务中使用主机名,请检查您是否也可以在集群中部署 sky-dns。对于您的情况,我假设您只需要使用 redis 服务的主机名。

编辑

你不想直接连接到 Pod,你想使用服务 IP 地址。

因此,您可以使用服务的 IP 地址进行连接。

或者您可以为您的服务提供主机名,以便连接到您的 pod。

为此,最简单的方法是使用 kube-skydns。阅读有关如何部署它以及如何使用它的文档。

【讨论】:

  • 我感觉这可能是问题所在。服务名称为redis。但是我在哪里可以找到redis服务的主机名?我在我的问题中粘贴了kubectl describe service redis
猜你喜欢
  • 2021-10-18
  • 2017-08-25
  • 1970-01-01
  • 2020-02-21
  • 2015-09-16
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多