【发布时间】:2018-10-03 12:59:10
【问题描述】:
我正在尝试在 Google 容器引擎上部署两个服务,我创建了一个包含 3 个节点的集群。
我的 docker 映像位于私有 docker hub 存储库中,这就是为什么我创建了一个秘密并在部署中使用,入口正在 Google 云控制台中创建一个负载均衡器,但它显示后端服务不是 healthy 并且在 kubernetes 部分下上面写着Does not have minimum availability的工作负载。
我是 Kubernetes 新手,有什么问题?
这是我的 yaml:
Deployment.yaml:
kind: Deployment
apiVersion: apps/v1
metadata:
name: pythonaryapp
labels:
app: pythonaryapp
spec:
replicas: 1 #We always want more than 1 replica for HA
selector:
matchLabels:
app: pythonaryapp
template:
metadata:
labels:
app: pythonaryapp
spec:
containers:
- name: pythonaryapp #1st container
image: docker.io/arycloud/docker_web_app:pythonaryapp #Dockerhub image
ports:
- containerPort: 8080 #Exposes the port 8080 of the container
env:
- name: PORT #Env variable key passed to container that is read by app
value: "8080" # Value of the env port.
readinessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 2
timeoutSeconds: 2
successThreshold: 2
failureThreshold: 10
imagePullSecrets:
- name: docksecret
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: pythonaryapp1
labels:
app: pythonaryapp1
spec:
replicas: 1 #We always want more than 1 replica for HA
selector:
matchLabels:
app: pythonaryapp1
template:
metadata:
labels:
app: pythonaryapp1
spec:
containers:
- name: pythonaryapp1 #1st container
image: docker.io/arycloud/docker_web_app:pythonaryapp1 #Dockerhub image
ports:
- containerPort: 8080 #Exposes the port 8080 of the container
env:
- name: PORT #Env variable key passed to container that is read by app
value: "8080" # Value of the env port.
readinessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 2
timeoutSeconds: 2
successThreshold: 2
failureThreshold: 10
imagePullSecrets:
- name: docksecret
---
这里是 services.yaml:
kind: Service
apiVersion: v1
metadata:
name: pythonaryapp
spec:
type: NodePort
selector:
app: pythonaryapp
ports:
- protocol: TCP
port: 8080
---
---
kind: Service
apiVersion: v1
metadata:
name: pythonaryapp1
spec:
type: NodePort
selector:
app: pythonaryapp1
ports:
- protocol: TCP
port: 8080
---
这是我的 ingress.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mysvcs
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: pythonaryapp
servicePort: 8080
- path: /<name>
backend:
serviceName: pythonaryapp1
servicePort: 8080
更新:
这是烧瓶服务代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World, from Python Service.', 200
if __name__ == '__main__':
app.run()
并且,在运行它的 docker 映像的容器时,它会在根路径 / 处返回 200 个 sttaus 代码。
提前致谢!
【问题讨论】:
-
您能否确保服务返回 200 响应代码? L7LB 健康检查将针对该服务进行解析。使用 curl [node_external_ip]:[nodeport] 并确保得到 200 响应
-
您可以通过“gcloud计算实例列表”获取节点外部IP,选择任何节点。您可以使用“kubectl get svc”获取节点端口 IP 并查找端口(它将在 30000 范围内)
-
确保防火墙规则允许 curl,如果您使用默认网络,最好的测试方法是从项目中的 VM 执行此操作并使用节点的内部 IP 地址
-
我之所以问上述问题是因为“没有最低可用性”,这意味着 pod 部署存在问题。能否也提供“kubectl get po”的输出
-
嗨@PatrickW,实际上一个服务正在工作,但另一个没有,你能看看这个问题:stackoverflow.com/q/52685701/7644562,拜托!
标签: docker kubernetes google-kubernetes-engine kubernetes-ingress