您可以在 Sidecar 容器中与 Node.js 应用程序一起运行反向代理,并让它代表应用程序处理 HTTPS 请求。可以提供此功能的一个非常流行的软件包是 *Envoy*。Envoy 代理是最初由 Lyft 构建的高性能开源服务代理,此后一直贡献给云原生计算基金会。让我们将它添加到您的 pod 中。
让我简要解释一下应用程序的新架构会是什么样子。如下图所示,pod 将有两个容器 —— Node.js 和新的 Envoy 容器。Node.js 容器将继续直接处理 HTTP 请求,但 HTTPS 请求将由 Envoy 处理。对于每个传入的 HTTPS 请求,Envoy 将创建一个新的 HTTP 请求,然后它将通过本地环回设备(loopback device)(通过 localhost IP 地址)发送到 Node.js 应用程序。
Envoy 还提供了一个基于 Web 的管理界面,这将在下一章的一些练习中证明很方便。
很明显,如果您在 Node.js 应用程序本身内实现 TLS 支持,应用程序将消耗更少的计算资源并具有更低的延迟,因为不需要额外的网络跃点,但添加 Envoy 代理可能是一个更快、更简单的解决方案。它还提供了一个很好的起点,您可以从中添加 Envoy 提供的许多其他功能,这些功能您可能永远不会在应用程序代码本身中实现。请参阅envoyproxy.io 上的 Envoy 代理文档以了解更多信息。
您将创建一个带有两个容器的新 pod。您已经有了 Node.js 容器,但您还需要一个运行 Envoy 的容器。
代理的作者已经在 Docker Hub 上发布了官方的 Envoy 代理容器镜像。您可以直接使用此映像,但您需要以某种方式向容器中的 Envoy 进程提供配置、证书和私钥文件。
构建映像后,您必须为新 pod 创建清单。以下清单显示了 pod 清单文件的内容 pod.kiada-ssl.yaml
。
apiVersion: v1
kind: Pod
metadata:
name: kiada-ssl
spec:
containers:
- name: kiada
image: luksa/kiada:0.2
ports:
- name: http
containerPort: 8080
- name: envoy
image: luksa/kiada-ssl-proxy:0.1
ports:
- name: https
containerPort: 8443
- name: admin
containerPort: 9901
此 pod 的名称是 kiada-ssl
。它有两个容器: kiada
和 envoy
. 唯一的新字段是端口名称,包括在内以便阅读清单的任何人都可以理解每个端口号代表什么。
使用命令从清单创建 pod kubectl apply -f pod.kiada-ssl.yaml
。然后使用kubectl get
and kubectl describe
命令确认 pod 的容器已经成功启动。
当 pod 启动时,您可以开始使用 pod 中的应用程序,检查其日志并从内部探索容器。
和以前一样,您可以使用 kubectl port-forward
来启用与 pod 中的应用程序的通信。因为它公开了三个不同的端口,所以您可以启用对所有三个端口的转发,如下所示:
kubectl port-forward kiada-ssl 8080 8443 9901
# output
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Forwarding from 127.0.0.1:8443 -> 8443
Forwarding from [::1]:8443 -> 8443
Forwarding from 127.0.0.1:9901 -> 9901
Forwarding from [::1]:9901 -> 9901
首先,通过在浏览器中打开 URL http://localhost:8080 或 使用以下命令确认您可以通过 curl
与HTTP应用程序通信:
curl localhost:8080
# output
Kiada version 0.2. Request processed by "kiada-ssl". Client IP: ::ffff:127.0.0.1
如果可行,您还可以尝试通过 https://localhost:8443 访问HTTPS应用程序。您可以按以下方式执行此操作:
curl https://localhost:8443 --insecure
# output
Kiada version 0.2. Request processed by "kiada-ssl". Client IP: ::ffff:127.0.0.1
成功!Envoy 代理完美地处理了任务。您的应用程序现在使用 sidecar 容器支持 HTTPS。
为什么使用 –INSECURE 选项?
--insecure
访问服务时使用该选项有两个原因。Envoy 代理使用的证书是自签名的,是为域名颁发的example.com
。您正在通过localhost
本地kubectl proxy
进程正在侦听的 访问服务。因此,主机名与服务器证书中的名称不匹配。要使名称匹配,您可以告诉 curl 将请求发送到
example.com
,但127.0.0.1
使用--resolve
标志将其解析为。这将确保证书与请求的 URL 匹配,但由于服务器的证书是自签名的,curl 仍然不会接受它为有效的。您可以通过告诉 curl 用于验证带有--cacert
标志的服务器的证书来解决问题。整个命令如下所示:> $ curl https://example.com:8443 --resolve example.com:8443:127.0.0.1 --cacert kiada-ssl-proxy-0.1/example-com.crt > ``` > > 这要打很多字。这就是为什么我更喜欢使用 `--insecure`|`-k` 选项。 #### 显示具有多个容器的 pod 日志 pod 包含两个容器,因此 `kiada-ssl` 如果要显示日志,则必须使用 `--container` or `-c` 选项指定容器的名称。例如,要查看 `kiada` 容器的日志,请运行以下命令:
kubectl logs kiada-ssl -c kiada
Envoy 代理在名为 `envoy` 的容器中运行,因此您可以按如下方式显示其日志:
kubectl logs kiada-ssl -c envoy
或者,您可以使用 `--all-containers` 选项显示两个容器的日志:
kubectl logs kiada-ssl –all-containers
#### 在多容器 pod 的容器中运行命令 如果您想使用 `kubectl exec` 命令在其中一个 pod 容器中运行 shell 或其他命令,您还可以使用选项 `--container` |`-c` 指定容器名称。例如,要在 envoy 容器中运行 shell,请运行以下命令:
kubectl exec -it kiada-ssl -c envoy – bash “`
提示
如果您不提供容器名称,则
kubectl exec
默认为 pod 清单中指定的第一个容器。
好好学习,天天向上