我正在GKE中进行部署,这是我的第一个部署,因此我对这些概念还很陌生,但是我知道它们在工具中的应用,只需要经验使人充满信心即可。
首先,我有一个群集,其中包含大约五个服务,我想通过外部负载平衡器公开其中两个。我为Gcloud定义了一个注释,以在负载平衡下进行设置,这似乎可行,我还设置了注释,以为服务设置网络端点组。这就是在部署和服务清单中的配置方式。
---
#api-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert -f ./docker-compose.yml
kompose.version: 1.21.0 ()
creationTimestamp: null
labels:
io.kompose.service: api
name: api
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: api
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose convert -f ./docker-compose.yml
kompose.version: 1.21.0 ()
creationTimestamp: null
labels:
io.kompose.service: api
spec:
containers:
- args:
- bash
- -c
- node src/server.js
env:
- name: NODE_ENV
value: production
- name: TZ
value: America/New_York
image: gcr.io/<PROJECT_ID>/api
imagePullPolicy: Always
name: api
ports:
- containerPort: 8087
resources: {}
restartPolicy: Always
serviceAccountName: ""
status: {}
---
#api-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/load-balancer-type: "Internal"
cloud.google.com/neg: '{"ingress": true}'
creationTimestamp: null
labels:
io.kompose.service: api
name: api
spec:
type: LoadBalancer
ports:
- name: "8087"
port: 8087
targetPort: 8087
status:
loadBalancer: {}
我想我可能在这里缺少某种配置,但是不确定。
我还看到了可以通过添加在Yaml中定义活动检查的地方
livenessProbe:
httpGet:
path: /healthz
port: 8080
我的入口也配置如下:
---
# master-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: master-application-ingress
annotations:
ingress.kubernetes.io/secure-backends: "true"
spec:
rules:
- http:
paths:
- path: /api
backend:
serviceName: api
servicePort: 8087
- http:
paths:
- path: /ui
backend:
serviceName: ui
servicePort: 80
,我已经看到它只需要用于TCP检查的端口,但是我已经在我的应用程序和负载平衡器中定义了它们。我想我想知道应该在哪里定义这些检查。
我还有一个问题,就是注释为空创建的NEG,还是清单创建的NEG的正常显示?
答案 0 :(得分:1)
运行状况检查是根据您的readinessProbe(而不是livenessProbe)创建的。创建入口资源之前,请确保在pod规范中配置了readinessProbe。
对于空的NEG,这可能是由于运行状况检查不匹配所致。 NEG将依赖于就绪门功能(explained here),因为仅定义了livenessProbe,所以很可能会导致健康检查配置错误并因此失败。
您还应该为您创建的内部LB提供一个内部IP,这样可以到达吊舱吗?如果两者均失败,则可能是健康检查问题,因为NEG并未将吊舱添加到它认为尚未准备就绪的组中
答案 1 :(得分:0)
现在,您还可以创建BackendConfig
作为单独的Kubernetes声明。
我的例子:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: cms-backend-config
namespace: prod
spec:
healthCheck:
checkIntervalSec: 60
port: 80
type: HTTP #case-sensitive
requestPath: /your-healthcheck-path
connectionDraining:
drainingTimeoutSec: 60
我没有任何明确定义的就绪/活跃性调查,并且一切正常。我还注意到,有时GKE与GCP的其余部分之间仍然存在故障。我记得在玩了一段时间之后,需要重新创建部署和从头开始的入口。
我所做的也是我开始在自动注册的NEG中看到端点的主要原因,可能是向入口添加了一个默认后端,以便没有在Load Balancer中注册单独的默认值:>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: prod-ingress
namespace: prod
annotations:
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.global-static-ip-name: load-balancer-ip
networking.gke.io/managed-certificates: my-certificate
spec:
backend:
serviceName: my-service
servicePort: 80
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80