[英]Problem deploying “express-gateway” to Google Kubernetes Engine with Ingress service type
[英]Kubernetes - Ingress / Service / LB
我是K8s的新手,这是我第一次尝试掌握它。 我正在尝试使用此deployment.yml设置基本的Nodejs Express API:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: api
spec:
replicas: 1
template:
metadata:
labels:
app: api
spec:
containers:
- image: registry.gitlab.com/<project>/<app>:<TAG>
imagePullPolicy: Always
name: api
env:
- name: PORT
value: "8080"
ports:
- containerPort: 8080
hostPort: 80
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
timeoutSeconds: 1
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
timeoutSeconds: 1
imagePullSecrets:
- name: registry.gitlab.com
这是通过gitlab-ci部署的。 这是有效的,我已经设置了一个服务来公开它:
apiVersion: v1
kind: Service
metadata:
name: api-svc
labels:
app: api-svc
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: api
type: LoadBalancer
但我一直在寻找入口,可能有多个服务的单一入口点。 我一直在阅读Kubernetes指南,我通读了这个Kubernetes Ingress示例 ,这是我创建的ingress.yml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
backend:
serviceName: api-svc
servicePort: 80
但是当我访问从入口生成的外部IP地址时,这不起作用,我只有502个错误页面。
任何人都可以指出我正确的方向,我做错了什么或我错过了什么? 我看到在上面的示例链接中有一个nginx-rc.yml,我在部署时完全像在示例中那样创建但是仍然没有从端点获得任何内容。 API可从服务外部IP访问,但..
非常感谢
我再次调查它,并认为我弄清楚了。
为了使Ingress能够在GCE上工作,您需要将NodePort
后端服务定义为ClusterIP或LoadBalancer。
此外,您需要确保http运行状况检查/
工作(您将看到Google L7 Loadbalancer在该网址上大量点击您的服务)然后它可用。
以为我会发布我的工作部署/服务/入口
因此,经过努力才能实现这一目标,以下是我以前的工作方式:
部署
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: backend-api-v2
spec:
replicas: 2
template:
metadata:
labels:
app: backend-api-v2
spec:
containers:
- image: registry.gitlab.com/<project>/<app>:<TAG>
imagePullPolicy: Always
name: backend-api-v2
env:
- name: PORT
value: "8080"
ports:
- containerPort: 8080
livenessProbe:
httpGet:
# Path to probe; should be cheap, but representative of typical behavior
path: /healthz
port: 8080
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
timeoutSeconds: 5
imagePullSecrets:
- name: registry.gitlab.com
服务
apiVersion: v1
kind: Service
metadata:
name: api-svc-v2
labels:
app: api-svc-v2
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 31810
protocol: TCP
name: http
selector:
app: backend-api-v2
入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: app-ingress
spec:
rules:
- host: api.foo.com
http:
paths:
- path: /v1/*
backend:
serviceName: api-svc
servicePort: 80
- path: /v2/*
backend:
serviceName: api-svc-v2
servicePort: 80
要注意的重要事项是@Tigraine指出的是服务使用type: NodePort
而不是LoadBalancer
,我还定义了一个nodePort,但我相信如果你把它留出来它会创建一个。
对于与规则不匹配的任何路由,它将使用default-http-backend
这是GKE在kube-system
命名空间中运行的默认容器。 因此,如果我访问了http://api.foo.com/bob
我会收到default backend - 404
的默认响应default backend - 404
。
希望这可以帮助
看起来您将服务暴露给端口80
但您的容器暴露8080
因此对服务的任何请求都将失败。
另外,看一下示例入口资源( https://github.com/nginxinc/kubernetes-ingress/blob/master/examples/complete-example/cafe-ingress.yaml ),您还需要定义哪些主机/命中入口控制器时路径路由。 (即example.foo.com - > api-svc)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.