监视pod iptables映射的服务是最新的

时间:2016-08-04 16:44:43

标签: kubernetes

问题出现在kubernetes 1.2.3上,但我们现在正在运行1.3.3。

我们有两种情况,其中kube-proxy正在运行但是被楔入并且没有使用当前服务状态更新iptables到pods。这导致了一种情况,即发往serviceA的流量被路由到属于serviceB的pod。所以我们在kube-proxy上查询/ healthz之后改进了我们的监控。我想知道我是否应该监控除了kube-proxy进程之外的任何内容,并且它从/ healthz返回200.

您是否正在监视任何其他内容以确保对pod映射的服务是最新的。我意识到,随着服务格局的变化,我们可能会有一段时间所有主机可能都不准确,但我只想抓住3分钟以上的情况,并且每个节点上的iptables都不是最新的。似乎向我表明某些东西在某处被破坏的集群。

我曾经考虑过做一些像金丝雀服务这样的事情,其中​​每5分钟重新部署一次支持部署,然后我从每个节点验证我可以通过服务集群ip访问所有后备pod。

我不确定这是否是正确的做法。它似乎可以解决我们之前遇到的问题,但我也在想其他一些更简单的方法可能就像检查上次更新iptables时的时间戳一样?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在pod中运行kube-proxy(通过在每个节点上删除/etc/kubernetes/manifests内的清单),受益于Kubernetes提供的运行状况检查/活性探测,并让它重新启动为您提供服务,以防万一。

只要/healthz端点响应时间过长,就会在活动探测器上设置一个非常低的阈值将触发重启。它不能保证IPtables规则始终是最新的,但会确保kube-proxy始终健康(这反过来将确保IPtables规则一致)

示例:

每10秒检查一次healthz kube-proxy端点。如果在不到1秒的时间内没有响应,请重新启动pod:

apiVersion: v1
kind: Pod

metadata:
  name: kube-proxy
  namespace: kube-system

spec:
  hostNetwork: true

  containers:

  - name: kube-proxy
    image: gcr.io/google_containers/hyperkube:v1.3.4
    command:
    - /hyperkube
    - proxy
    - --master=https://master.kubernetes.io:6443
    - --kubeconfig=/conf/kubeconfig
    - --proxy-mode=iptables

    livenessProbe:
      httpGet:
        path: /healthz
        port: 10249
      timeoutSeconds: 1
      periodSeconds: 10
      failureThreshold: 1

    securityContext:
      privileged: true

    volumeMounts:
    - mountPath: /conf/kubeconfig
      name: kubeconfig
      readOnly: true
    - mountPath: /ssl/kubernetes
      name: ssl-certs-kubernetes
      readOnly: true
    - mountPath: /etc/ssl/certs
      name: ssl-certs-host
      readOnly: true

  volumes:
  - hostPath:
      path: /etc/kubernetes/proxy-kubeconfig.yml
    name: kubeconfig
  - hostPath:
      path: /etc/kubernetes/ssl
    name: ssl-certs-kubernetes
  - hostPath:
      path: /usr/share/ca-certificates
    name: ssl-certs-host