48 K8S 之 Ingress 控制器部署
以 Deployment 控制器管理 Ingress 控制器的 Pod 资源,通过 NodePort 或 LoadBalancer 类型的 Service 对象或者通过拥有外部 IP 地址(externalIP)的 Service 对象为其接入集群外部的请求流量。这意味着,在生产环境中定义一个 Ingress 控制器时,必须在其前端定义一个负载均衡器,负载均衡器可以是 LoadBalancer 类型的 Service,或用户自行管理的边缘路由器。
借助 DaemonSet 控制器,Ingress 控制器的各 Pod 分别以单一实例的方式运行在 Kubernetes 集群中所有或部分工作节点之上,并配置这类 Pod 对象以 hostPort 或 hostNetwork 的方式在当前节点接入外部流量。
生产应用场景中,我们通常会以 DaemonSet 结合 NodeAffinity、PodAntiAffinity 使用,甚至是利用 Taints/Tolerations 调度机制将 Ingress 控制器以单实例的方式运行在专用的节点之上,并让 Ingress 控制器共享相关节点的名称空间,或者在 Service 上使用 externalIP 等来解决引入外部流量的问题。
Ingress Nginx 应用程序还存在许多其他配置需要,例如日志格式、CORS、URL 重写、代理缓冲和 SSL 透传等。这类的配置通常有 ConfigMap、Annotations 和自定义模板 3 种实现方式。
Ingress Nginx 的 ConfigMap 和 Annotations 配置接口都支持使用大量的参数来定制所需要的功能,不同的是,ConfigMap 通过在 Ingress Nginx 引用 ConfigMap 资源规范中 data 字段特定的键及可用取值进行定义,且多用于 Nginx 全局特性的定制,因而是集群级别的配置;而 Annotations 则于 Ingress 资源上使用资源注解配置,多用于虚拟主机级别,因而通常是服务级别的配置。
将服务发布到集群外部的常用方式是将 Service 资源的类型修改为 NodePort 或 LoadBalancer,但 NodePort 将会把端口映射为某个不知名端口,甚至是随机端口,而 LoadBalancer 则依赖于公有云环境中的 LBaaS 服务,二者均存在着诸多限制。在 Kubernetes 上,Ingress 才是发布 HTTP 应用的更好的方式。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/1b808ed81cdb786f498c3c063】。文章转载请联系作者。
评论