首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes入侵错误:服务器遇到临时错误,无法完成请求

Kubernetes入侵错误:服务器遇到临时错误,无法完成请求
EN

Stack Overflow用户
提问于 2018-07-23 20:01:09
回答 1查看 8.8K关注 0票数 14

在我们的GKE中,我们有一个名为php-services的服务。它的定义如下:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: php-services
  labels:
    name: php-services
spec:
  type: NodePort
  ports:
  - port: 80
  selector:
    name: php-services

我可以从集群内部访问此服务。如果我在我们的一个豆荚上运行这些命令(在Default名称空间中),就会得到预期的结果:

代码语言:javascript
复制
bash-4.4$ nslookup 'php-services'
   Name:      php-services
   Address 1: 10.15.250.136 php-services.default.svc.cluster.local

代码语言:javascript
复制
bash-4.4$ wget -q -O- 'php-services/health'
   {"status":"ok"}

因此,服务已经准备就绪并正确响应。我需要把这项服务暴露在国外的交通上。我正试图使用以下配置来完成这一任务:

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-tls
  annotations:
    kubernetes.io/ingress.class: "gce"
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.global-static-ip-name: "kubernetes-ingress"
    kubernetes.io/ingress.allow-http: "false"
    external-dns.alpha.kubernetes.io/hostname: "gke-ingress.goout.net"
  namespace: default
spec:
  tls:
  - hosts:
     - php.service.goout.net
    secretName: router-tls
  rules:
  - host: php.service.goout.net
    http:
      paths:
      - backend:
          serviceName: php-services
          servicePort: 80
        path: /*

但是,访问http://php.service.goout.net/health会产生一个502错误:

错误:服务器错误服务器遇到一个临时错误,并且 没有完成你的请求。 请在30秒后再试。

我们还有其他具有相同配置的服务,可以运行ok,并且可以访问外部的表单。

我找到了一个相似问题,但这也不能给出足够的答案。

我也一直在关注调试服务的文章,但这也没有帮助,因为服务本身是可以的。

对此问题的任何帮助都表示高度赞赏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-24 10:39:41

编辑TLDR

GKE负载平衡器只接受HTTP状态200,而Kubernetes健康检查接受大于或等于200但小于400的任何代码

原语回答

好吧,我们已经弄清楚出了什么问题。

看看yamlphp-services服务的部署的定义:(缩写)

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: php-services
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      name: php-services
  template:
    metadata:
      labels:
        name: php-services
    spec:
      containers:
        - name: php-services
          image: IMAGE_TAG
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /health
              port: 80
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 60
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /health
              port: 80
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 60
            successThreshold: 1
            timeoutSeconds: 10
          ports:
          - containerPort: 80

映像中的Apache服务器的配置方式是将其从路径重定向,而不尾随斜杠到它的路径。因此,当您请求/health时,您实际上得到了HTTP 301,指向/health/,然后响应为200。

在Kubernetes健康检查的范围内,这可以作为"任何大于或等于200或小于400的代码都表示成功。

然而,问题在于GKE负载平衡器。它还拥有自己的GKE健康检查,这些健康检查来自于部署定义中的检查。重要的区别是它只接受HTTP状态200。如果负载平衡器找不到一个健康的后端服务,它就不会把任何外国的流量传递给它。

因此,我们有两种方法来解决这个问题:

  • 使容器内的服务器以HTTPS状态200响应于/health/health/ (或者更准确地说,只响应/health)
  • 或者将readinessProbelivenessProbe路径定义更改为/health/

我们选择后者,它解决了问题。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51486410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档