我正在尝试将一个简单的python应用程序部署到Google Container Engine:
我创建了一个集群,然后运行kubectl create -f deployment.yaml
它已经在我的集群上创建了一个部署容器。之后,我创建了以下服务:kubectl create -f deployment.yaml
这是我的Yaml配置:
pod.yaml :
apiVersion: v1
kind: Pod
metadata:
name: test-app
spec:
containers:
- name: test-ctr
image: arycloud/flask-svc
ports:
- containerPort: 5000
这是我的Dockerfile:
FROM python:alpine3.7
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD python ./app.py
deployment.yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: test-app
name: test-app
spec:
replicas: 1
template:
metadata:
labels:
app: test-app
name: test-app
spec:
containers:
- name: test-app
image: arycloud/flask-svc
resources:
requests:
cpu: "100m"
imagePullPolicy: Always
ports:
- containerPort: 8080
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: test-app
labels:
app: test-app
spec:
type: LoadBalancer
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
nodePort: 32000
selector:
app: test-app
入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: frontend
servicePort: 80
它创建一个LoadBalancer并提供一个外部IP,当我打开IP时,它会返回Connection Refused error
怎么了?
请帮帮我!
谢谢, 阿卜杜勒
答案 0 :(得分:1)
您的部署文件没有selector
,这意味着service
找不到任何Pod来重定向请求。
此外,您必须将部署文件上的conteinerPOrt
与服务文件中的targetPort
匹配。
我已经在实验室环境中进行了测试,并且对我有用:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-app
name: test-app
spec:
selector:
matchLabels:
app: test-app
replicas: 1
template:
metadata:
labels:
app: test-app
spec:
containers:
- name: test-app
image: arycloud/flask-svc
imagePullPolicy: Always
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: test-app
labels:
app: test-app
spec:
type: LoadBalancer
ports:
- name: http
port: 80
protocol: TCP
targetPort: 5000
selector:
app: test-app
答案 1 :(得分:1)
首先请确保您的入口控制器正在运行,以检查kubectl get pods -n ingress-nginx
,如果您没有发现任何正在运行的Pod,则需要部署kubernetes入口,您可以通过kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml
进行。
如果您已正确安装了入口控制器,则只需应用以下yaml,您就需要在部署中具有选择器,以便该部署可以管理副本,除了您无需公开副本您将要通过负载均衡器访问应用程序的节点端口。
apiVersion: v1
kind: Service
metadata:
name: test-app
labels:
app: test-app
spec:
type: LoadBalancer
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app: test-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-app
name: test-app
spec:
selector:
matchLabels:
app: test-app
replicas: 1
template:
metadata:
labels:
app: test-app
spec:
containers:
- name: test-app
image: arycloud/flask-svc
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: frontend
servicePort: 80
答案 2 :(得分:0)
您可以先检查curl podip:port
处的吊舱是否在您的情况下工作,curl podip:8080
;如果效果不佳,则必须检查进程是否在使用的映像中绑定8080端口。
如果可以,请尝试使用curl svcip:svcport
进行服务,在您的情况下,应为curl svcip:80
;如果无法正常运行,将是kubernetes网络[配置]问题。
如果仍然有效,则该问题应该在入口层上发生。
从理论上讲,如果所有条件都与k8s规则匹配,那么它应该可以工作。