0

我最近在测试我的 Kubernetes 服务。而且我发现它非常不可靠。情况如下:
1. 在端口 80 接收 HTTP 请求的测试服务“A”在三个节点上部署了五个 Pod。
2. nginx 入口设置为将外部流量路由到服务“A”。
3.入口设置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-A
  annotations:    
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "1s"
    nginx.ingress.kubernetes.io/proxy-next-upstream: "error timeout invalid_header http_502 http_503 http_504"
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
spec:
  rules:
  - host: <test-url>
    http:
      paths:
      - path: /
        backend:
          serviceName: A
          servicePort: 80
  1. http_load 在客户端主机上启动,并以每秒 1000 的速度不断向入口 nginx 发送请求。所有请求都被路由到 k8s 中的服务“A”,一切顺利。

当我手动重启其中一个节点时,出现了问题:
在接下来的 3 分钟内,大约 20% 的请求超时,这在产品环境中是不可接受的。

不知道为什么k8s反应这么慢,有没有办法解决这个问题?

4

2 回答 2

1

感谢@VAS 的回答!
活体探测就是解决这个问题的一种方法。
但我最终发现我想要的是被动健康检查,k8s 不支持。
我通过将 istio 引入我的集群解决了这个问题。

于 2019-03-04T15:45:44.667 回答
1

您可以通过在 pod 的规范中配置liveness 和 readiness 探针来加速故障转移过程:

容器探针

...

livenessProbe:指示 Container 是否正在运行。如果 liveness 探测失败,kubelet 会杀死 Container,Container 会受到其重启策略的约束。如果 Container 不提供 liveness 探测,则默认状态为 Success。

readinessProbe:指示容器是否准备好为请求提供服务。如果就绪探测失败,端点控制器会从与 Pod 匹配的所有服务的端点中删除 Pod 的 IP 地址。初始延迟之前的默认就绪状态是失败。如果 Container 不提供就绪探测,则默认状态为 Success。

活性探针示例:

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
于 2019-03-04T15:11:40.727 回答