问题出现在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时的时间戳一样?
谢谢!
答案 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