StashAway 的基于 Kubernetes 的技术栈一览
本文介绍了 StashAway 这家公司如何使用 k8s 及其工具链搭生产环境。
- Service Discovery。由于节点创建和销毁很容易,每个容器配置的是动态 IP 地址,所以每个容器都需要被注册,这样其它容器才能访问到它。Kubernetes 提供的两种 SD 方法:环境变量 和 DNS-based。需要注意的是,一些 DNS 客户端会把 DNS cache TTL 调的很大,甚至默认永不过期。
- Service Addressing。由于 DNS-based SD 只能让服务在 Kubernetes 集群内部访问,我们若有外部访问的需求,则可以使用 ExternalDNS annotations,当有新的 k8s 服务创建,它会自动注册一个子域名。
- Routing。节点来来去去,会导致 Routing 的健康检查变困难。Kubernetes Ingress 旨在解决这类问题,它提供了 Load Balancing,SSL Termination,以及 name-based routing。它可以用多种技术作为其底层的 Load Balancing 方案,例如 Nginx Ingress,Voyager(HAProxy), Contour(EnvoyProxy)。他们公司选用 ELB+Nginx Ingress 做 HTTP based routing,用 Voyager 做 TCP based routing。最后一个有内建的 gPRC 和 circuit breaking 的支持。
- Monitoring。使用 Prometheus 监控 Kubernetes apps 和 cluster。它内建支持发现 k8s 对象。使用 Alertmanager 发送告警。使用 Heapster 可以将监控集成进 InfluxDB 或者 Riemann 中。
- Logging。每个 k8s 节点都会运行 agent 用来推送容器的日志。EFK stack (Elastic, Fluent-bit, Kibana) 是流行的方案。
- Deploying。使用 Helm 管理 k8s 依赖,并部署应用。Ansible Vault 存储密钥。他们使用 ansible-helm 触发 helm。
- SSL Certificates。使用 kube-cert-manager / kube-lego 自动 provisioning Let's Encrypt 证书。