前言
Kubernetes 是一个快速发展的容器化平台,而 Ingress 则是 Kubernetes 中一个非常重要的负载均衡组件。Ingress 可以将流量路由到集群内不同的服务中,并提供了许多高级功能,比如 SSL 终止、路径匹配、域名解析等等。由于 Ingress 的重要性,本文将深入讲解 Kubernetes 中 Ingress 负载均衡的相关知识点,同时提供示例代码以便读者更好地理解和学习。
Ingress 的基本使用
1. 安装 Ingress
在运行 Ingress 之前,首先需要安装 Ingress 控制器。Kubernetes 官方提供了对于 Nginx 和 Traefik 两种控制器的支持。这里以 Nginx 为例进行安装。
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.3/deploy/static/provider/cloud/deploy.yaml
注意:此处使用的是 v1.0.3 版本的控制器,具体版本可以根据实际需求进行选择。
安装完成后,你可以通过以下命令检查 Ingress 控制器是否正常运行:
$ kubectl get pods -n ingress-nginx
2. 创建 Ingress 资源
在创建 Ingress 资源之前,需要准备好相应的后端服务,并通过 Service 类型将其暴露为集群内的一个 DNS 名称。例如,我们创建了两个部署,分别代表一个网站和一个后端接口:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- --- ----- --------- ------------ ---- --- --------- --------- ------- ---- --- ----- ----------- - ----- --- ------ ---------- ------ - -------------- -- --- ----------- ------- ----- ---------- --------- ----- ------- ----- --------- ------------ ---- ------- --------- --------- ------- ---- ------- ----- ----------- - ----- ------- ------ --------- ------ - -------------- --
然后再通过 Service 类型将其暴露为 DNS 名称。这里我们使用了 ClusterIP 服务类型,代表该服务只能在集群内部被访问。注意,使用这种服务类型需要为 Service 指定一个 selector,以选择对应的 Pod 进行负载均衡。
-- -------------------- ---- ------- ----------- -- ----- ------- --------- ----- --- ----- --------- ---- --- ------ - ----- ---- ----- -- ----- --------- --- ----------- -- ----- ------- --------- ----- ------- ----- --------- ---- ------- ------ - ----- ---- ----- -- ----- ---------
最后,我们就可以创建 Ingress 资源了。Ingress 的规则列表以 YAML 列表的形式呈现,每个规则都包含了一个或多个 IngressPath 对象,代表该规则下的一组 URI 匹配规则。
-- -------------------- ---- ------- ----------- -------------------- ----- ------- --------- ----- --------------- ----- ------ - ----- ----------- ----- ------ - ----- ---- --------- ------ -------- -------- ----- --- ----- ----- ---- - ----- -------- --------- ------ -------- -------- ----- ------- ----- ----- ----
上面的 Ingress 规则将所有访问 example.com/web 或 /backend 的请求都转发到相应的 Service 中进行处理。
3. 测试 Ingress 配置
创建完 Ingress 资源以后,我们可以通过 curl 命令来测试其是否正常工作:
$ curl -H 'Host: example.com' http://<ingress-ip>/web $ curl -H 'Host: example.com' http://<ingress-ip>/backend
其中,<ingress-ip> 是 Ingress 控制器所在的 IP 地址。在 minikube 中可以通过以下命令来获取:
$ minikube ip
Ingress 的高级使用
除了简单的路径匹配,Ingress 还提供了许多高级功能来方便部署和管理服务。
1. SSL 终止
为了保障网站安全, SSL 终止是部署 Ingress 时必不可少的一个功能。它可以在 Ingress 中添加 TLS 证书,并通过 SSL 协议加密传输。
为了实现 SSL 终止,我们需要首先在 Kubernetes 中创建一个 Secret 对象来存储证书文件。这里我们使用了自签名证书进行测试:
$ openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -out tls.crt $ kubectl create secret tls tls-secret --key tls.key --cert tls.crt
注意:此处的证书只是用于测试,实际使用中应该使用安全可靠、经过验证的证书。
然后在 Ingress 规则中添加 tls 字段,并指定使用的 Secret 对象。注意,此处的主机名必须与证书中包含的主机名相匹配,否则将无法启用 SSL 协议。
-- -------------------- ---- ------- ----------- -------------------- ----- ------- --------- ----- --------------- ----- ---- - ------ - ----------- ----------- ---------- ------ - ----- ----------- ----- ------ - ----- ---- ---
现在,我们可以使用 https 协议来访问 Ingress 了:
$ curl -H 'Host: example.com' https://<ingress-ip>/web
由于 Ingress 控制器会自动将 SSL 终止后的请求转发给后端的服务,因此在内部通信环节中仍然使用的是 http 协议。
2. 重定向
Ingress 中还可以使用重定向功能来自动将用户请求重定向到其他 URL。常见的应用场景包括将 http 协议转换为 https 协议、URL 统一化等等。
重定向功能可以在 Ingress 规则中的 IngressPath 对象中进行配置。在下面的例子中,我们将所有对 /web 下的访问请求都重定向到 /web-new 下:
-- -------------------- ---- ------- ----------- -------------------- ----- ------- --------- ----- --------------- ----- ------ - ----- ----------- ----- ------ - ----- ---- --------- ------ -------- -------- ----- --- ----- ----- ---- ----------- -------- - ----- -------- --------- ------ -------- -------- ----- --- ----- ----- ----
3. 限制访问源 IP
在某些情况下,我们需要限制特定的 IP 地址访问 Ingress 中的服务。这时候,我们可以使用 NetworkPolicy 对象来定义规则,限制指定 IP 地址范围的访问。
例如,在下面的例子中,我们禁止所有 IP 地址在 10.0.0.0/8 网段中的主机访问 Ingress 中的服务:
-- -------------------- ---- ------- ----------- -------------------- ----- ------------- --------- ----- --------------------- ----- ------------ ------------ ---- --- ----- -------- ------------ - ------- -------- - ----- - -------- ----- ----------
总结
通过本文,我们可以了解到 Kubernetes 中 Ingress 组件的基本原理和使用方法,并了解了 Ingress 的一些高级功能,如 SSL 终止、重定向和限制访问源 IP。合理使用 Ingress 可以大大简化集群内部服务的管理和部署,提高应用的可靠性和稳定性。
参考资料
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64702cf3968c7c53b0e4ffac