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端口映射到容器的同一端口。但我还是从烧瓶容器中得到了同样的错误