Docker Kubernetes多层容器应用程序

Docker Kubernetes多层容器应用程序,docker,kubernetes,Docker,Kubernetes,我有两个运行Flask和redis的Docker容器,当使用Docker容器链接时,每个容器都能很好地通信 我正试图使用服务和吊舱在Kubernetes上部署相同的功能,但它不起作用。我在学习库伯内特,所以我一定是做错了什么 下面是运行良好的Docker命令: $ docker run -d --name=redis -v /opt/redis:/redis -p 6379 redis_image redis-server $ docker run -d -p 5000:5000 --link

我有两个运行
Flask
redis
的Docker容器,当使用Docker容器链接时,每个容器都能很好地通信

我正试图使用服务和吊舱在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
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    name: redis
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
apiVersion: v1
kind: Pod
metadata:
  name: flask
  labels:
    name: flask
    app: flask
spec:
  containers:
  - name: flask
    image: dharmit/flask 
    ports:
    - containerPort: 5000
apiVersion: v1
kind: Service
metadata:
  name: flask
  labels:
    name: flask
spec:
  ports: 
  - port: 5000
  selector:
    app: flask
服务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
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    name: redis
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
apiVersion: v1
kind: Pod
metadata:
  name: flask
  labels:
    name: flask
    app: flask
spec:
  containers:
  - name: flask
    image: dharmit/flask 
    ports:
    - containerPort: 5000
apiVersion: v1
kind: Service
metadata:
  name: flask
  labels:
    name: flask
spec:
  ports: 
  - port: 5000
  selector:
    app: flask
豆荚烧瓶。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
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    name: redis
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
apiVersion: v1
kind: Pod
metadata:
  name: flask
  labels:
    name: flask
    app: flask
spec:
  containers:
  - name: flask
    image: dharmit/flask 
    ports:
    - containerPort: 5000
apiVersion: v1
kind: Service
metadata:
  name: flask
  labels:
    name: flask
spec:
  ports: 
  - port: 5000
  selector:
    app: flask
服务瓶。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
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    name: redis
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
apiVersion: v1
kind: Pod
metadata:
  name: flask
  labels:
    name: flask
    app: flask
spec:
  containers:
  - name: flask
    image: dharmit/flask 
    ports:
    - containerPort: 5000
apiVersion: v1
kind: Service
metadata:
  name: flask
  labels:
    name: flask
spec:
  ports: 
  - port: 5000
  selector:
    app: flask
当我执行
kubectl创建-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.
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.

我做错了什么?

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

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

您正在尝试连接到redis:6379。但谁是redis?可能不是你刚刚发射的吊舱

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

编辑 您不想直接连接到POD,您需要使用服务ip地址

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

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


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

是否在
烧瓶
容器中添加体积。好像你加进去了docker@AerofoilKite不,我没有提到烧瓶容器中的体积。我需要吗?你真的在运行DNS服务器吗?你没有提到你在使用什么环境。我觉得这可能是问题所在。服务的名称是
redis
。但是我在哪里可以找到redis服务的主机名呢?在我的问题中,我粘贴了
kubectl description service redis
。这在一定程度上有所帮助。在
docker ps
输出中,我现在看到主机上的6379端口映射到容器的同一端口。但我还是从烧瓶容器中得到了同样的错误