我正在Kubernetes集群上工作,在那里我将服务从GCloud Ingress定向到我的服务。其中一个服务端点未通过运行状况检查(如HTTP),但将其作为TCP传递。
当我将GCloud中的运行状况检查选项更改为TCP时,运行状况检查通过,并且我的端点正常工作,但是几分钟后,GCloud上的运行状况检查将该端口重置为HTTP,运行状况检查再次失败,在端点上给了我502响应。
我不知道这是Google Cloud内部的错误还是Kubernetes中我做错的事情。我在这里粘贴了我的YAML配置:
命名空间
apiVersion: v1
kind: Namespace
metadata:
name: parity
labels:
name: parity
存储类
apiVersion: storage.k8s.io/v1
metadata:
name: classic-ssd
namespace: parity
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
zones: us-central1-a
reclaimPolicy: Retain
秘密
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
namespace: ingress-nginx
data:
tls.crt: ./config/redacted.crt
tls.key: ./config/redacted.key
状态集
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: parity
namespace: parity
labels:
app: parity
spec:
replicas: 3
selector:
matchLabels:
app: parity
serviceName: parity
template:
metadata:
name: parity
labels:
app: parity
spec:
containers:
- name: parity
image: "etccoop/parity:latest"
imagePullPolicy: Always
args:
- "--chain=classic"
- "--jsonrpc-port=8545"
- "--jsonrpc-interface=0.0.0.0"
- "--jsonrpc-apis=web3,eth,net"
- "--jsonrpc-hosts=all"
ports:
- containerPort: 8545
protocol: TCP
name: rpc-port
- containerPort: 443
protocol: TCP
name: https
readinessProbe:
tcpSocket:
port: 8545
initialDelaySeconds: 650
livenessProbe:
tcpSocket:
port: 8545
initialDelaySeconds: 650
volumeMounts:
- name: parity-config
mountPath: /parity-config
readOnly: true
- name: parity-data
mountPath: /parity-data
volumes:
- name: parity-config
secret:
secretName: parity-config
volumeClaimTemplates:
- metadata:
name: parity-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "classic-ssd"
resources:
requests:
storage: 50Gi
服务
apiVersion: v1
kind: Service
metadata:
labels:
app: parity
name: parity
namespace: parity
annotations:
cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
selector:
app: parity
ports:
- name: default
protocol: TCP
port: 80
targetPort: 80
- name: rpc-endpoint
port: 8545
protocol: TCP
targetPort: 8545
- name: https
port: 443
protocol: TCP
targetPort: 443
type: LoadBalancer
入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-parity
namespace: parity
annotations:
#nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.global-static-ip-name: cluster-1
spec:
tls:
secretName: tls-classic
hosts:
- www.redacted.com
rules:
- host: www.redacted.com
http:
paths:
- path: /
backend:
serviceName: web
servicePort: 8080
- path: /rpc
backend:
serviceName: parity
servicePort: 8545
问题
我已经编辑了主机名等,但这是我的基本配置。我还在以下文档中运行了此文档的hello-app容器进行调试:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
/
服务的入口端点在hello-app
上指向端口8080。效果很好,这不是问题,但此处仅作澄清。
因此,这里的问题是,在Google Cloud上使用GKE和入口LoadBalancer创建了集群(入口文件中的cluster-1
全局静态ip名称)之后,在文件中创建了Kubernetes配置上面的代码,当我转到Google Compute Engine->运行状况检查-> /rpc
端点的特定运行状况检查时,Google Cloud上/rpc
端点的运行状况检查失败。
当我将运行状况检查编辑为不使用HTTP协议而不使用TCP协议时,运行状况检查通过了/rpc
端点,我可以将其卷曲起来,然后返回正确的响应。 / p>
问题在于,几分钟后,即使我将其编辑为TCP,相同的Health-Check仍返回到HTTP协议,然后运行状况检查失败并且再次卷曲它时得到502响应
我不确定在kubernetes中创建Ingress之前是否可以将Google Cloud Health Check配置附加到我的Kubernetes Ingress。也不确定为什么要重置它,无法确定这是Google Cloud上的错误还是Kubernetes中我做错的事情。如果您注意到在我的statefulset
部署中,我已指定livenessProbe
和readinessProbe
使用TCP来检查端口8545。
650秒的延迟是由于此票务问题而导致的,该问题通过将延迟增加至大于600秒(以避免提及的比赛条件)解决:https://github.com/kubernetes/ingress-gce/issues/34
我真的不确定为什么将Google Cloud运行状况检查指定为TCP后会重置为HTTP。任何帮助将不胜感激。
答案 0 :(得分:1)
我找到了一个解决方案,其中在/ healthz端点上的有状态集上添加了用于运行状况检查的新容器,并配置了入口的运行状况检查,以检查kubernetes分配的8080端口上的端点是否为HTTP运行状况类型-check,使其正常工作。
在TCP重置时为什么会发生重置并不清楚。