使用kubefwd对k8s中的service进行本地化调试

大家都知道,k8s中的服务(service)是对k8s中的deployment等对象的一个一致访问点.所以service会有一个vip(headless service没有).无论是普通service的vip或者headless service的pod ip其实都是k8s集群中的内部ip,在集群内访问它是非常容易的.比如有一个service叫nginx,我们在集群内的另一个pod里既可以对这个nginx service的vip进行get访问,也可以通过coredns对这个nginx service的域名如(nginx, nginx.default等)进行访问.但是在集群外呢?这就麻烦了.

常见的集群外访问service的方式大致分为 LoadBalance, NodePort, ExternalIp等方式, 再细致一点也可以通过Ingress在7层做一层分发再外接上述流量接入,甚至你可以直接将api server做proxy. 很显然的,这些方式如果在我们只是需要对服务进行调试或者随便用用的场景都是要么太复杂(Ingress), 要么花钱(LoadBanlence),要么不靠谱(NodePort).

这时候你会说,嗷,我们可以使用kubectl port-forward 功能,将service的端口port-forward到本地端口.对,没错,这确实是一个不错的解决方式,但这仍然存在非常多的问题。

比如,我们并不想要将nginx service的80端口port-forward到我的8080端口上,就想用80端口,那么如果有两个service分别叫nginx1和nginx2,这不就没法弄了吗?再比如,如果我们port-forward的svc的pod发生了变动,怎么办?再比如,我们就是想像在集群内一样,通过service的内部域名对其访问(nginx, nginx.default等),怎么办?再比如,如果我们有100个服务,难道我们要手动对每个服务port-forward然后手动选择一个没用过的端口吗?甚至,当我们的服务创建,删除,我们又得手动操作,这是何等的麻烦?

基于上述问题,一个叫kubefwd的工具出现了。
继续阅读“使用kubefwd对k8s中的service进行本地化调试”

使用kubectl-debug来调试pod

在k8s环境中,我们经常会碰到各种疑难杂症.比如下面这个例子:
某pod无法启动,查看日志显示原来是init时容器无法拉取某个外部网络上的包.我们exec登陆容器后试图调试下产生这个问题的原因,我们输入ping xxx.xxx.xxx,但sh直接提示"找不到ping命令",甚至直接无法exec到一个没有sh的容器中.
这样的情况我们该怎么办呢?这里有一个解决类似问题的调试工具kubectl-debug
继续阅读“使用kubectl-debug来调试pod”

配置和使用kube-prometheus

我们在k8s集群中使用云原生的promethues通常需要用到coreos的prometheus-operater,它可以方便的帮助我们在k8s中部署和配置使用prometheus。但prometheus并不是开箱即用的,如果要做到开箱即用的监控全家桶,官方提供了两个选择,分别是prometheus-operater helm chartkube-prometheus。这两者都可以为我们提供开箱即用的方式部署promethues+alertmanager+promethues-push-gateway(kube-promethueus不包含,需要单独部署)+grafana全家桶,同时包含kubernetes-mixin的一整套报警规则和node-exporter,kube-state-metrics等一系列metrics exporter。区别在于helm chart由社区维护,而kube-promethues由coreos维护。这里我们将以kube-prometheus为例,简要说明配置和使用方式。
继续阅读“配置和使用kube-prometheus”

kubernetes集群中服务的负载均衡和外部发现

传统的负载均衡策略一般是:

客户端 -> dns -> 4层库在均衡(HA) -> 7层负载均衡 -> 具体的后端服务

这种方式处理服务发现和动态配置比较难搞,比如后端服务动态扩缩容什么的。
一开始的做法肯定是OP人工维护7层负载均衡集群配置,以nginx为例,用git仓库之类的做人工服务发现和变更。这样很显然是不科学的。然后就会开始希望用种种自动化的手段去处理服务发现,比如微博的nginx-upsync-module,比如nginx-lua,比如openresty,比如etcd+confd等种种手段实现服务发现和自动化配置,但还是有很多瑕疵,比如etcd+confd每次修改upstream的服务后端就要reload nginx,nginx的策略会新开x个worker,容易造成性能问题甚至机器顶不住。而且vm服务机器的逻辑和upstream挂钩也有问题,总之,麻烦的很。

而kubernetes处理这一套服务发现和负载均衡的方法就挺好用的,比如接下来会实践的这一套nginx-ingress+externalIP+dns的方式就很直观而且方便自动化流程,大致策略如下:

客户端 -> dns -> k8s-nginx-ingress-service(in ExternalIP) -> ingress-obj -> service -> pod

继续阅读“kubernetes集群中服务的负载均衡和外部发现”