Kubernetes多层容器应用程序

时间:2015-10-25 10:53:07

标签: docker kubernetes

我有两个运行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和服务文件如下:

荚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

服务redis.yaml

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

荚flask.yaml

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

服务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.

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

您需要在containerPort

中添加pod-redis.yaml
- name: redis
  image: dharmit/redis
  command:
    - "redis-server"
  ports: 
    - containerPort: 6379
      hostPort: 6379

答案 1 :(得分:0)

您正在尝试连接到redis:6379。但谁是主机名redis?可能不是你刚推出的吊舱。

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

修改

你不想直接连接到pod,你想使用服务ip地址。

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

或者,您可以拥有服务的主机名,以便连接到您的广告连接。

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