基于云原生的新应用程序在 Kubernetes 集群运行没有问题,但是当你有旧应用程序时会发生什么情况:
- 记录到文件而不是标准输出?
- 不支持Prometheus?
- 不支持HTTPS?
首先,让我们了解一些基础知识。
在Kubernetes中,一个Pod是一组容器。
容器使用两个Linux原语进行隔离:控制组
和命名空间
。
- 控制组用于限制资源(最大256MB内存)。
- 命名空间用于隔离(只能看到此文件夹)。
控制组和Linux命名空间是容器的基本原语。
除了网络之外,Pod中的所有容器都是隔离的。
网络是共享的,一个IP地址分配给Pod中的所有容器(Pod的IP地址)。
同一个Pod中的容器共享相同的网络命名空间。
为什么需要在Pod中运行多个容器?
如果你不能(或不想)更改应用程序中的代码,你可能需要通过其他方式来调整其功能。
让我们看一个例子。
最近的Elasticsearch版本支持TLS,但长时间以来这是一个付费的额外功能。
你如何使用TLS保护流量?
你可以将代理作为一个容器添加到你的Pod中。
(加密的)流量首先到达代理,然后到达(未加密的)Elasticsearch。
流量在到达ElasticSearch之前由NGINX容器代理。 另一个例子是在没有Ingress的情况下将你的应用程序暴露给公共互联网。
Cloudflare隧道
运行一个代理与应用程序一起,并代理所有的流量。
tunneld代理将流量隧道传输到Cloudflare网络。
当你想要使用Prometheus,但你的应用程序具有自定义的指标公开格式时,会发生什么情况?
如果你使用一个适配器,就不需要更改代码。
例如:Elasticsearch不暴露Prometheus
指标。
适配器来解救!
容器将Elasticsearch
指标适配为与Prometheus
兼容。
当你在Pod中有一个额外的容器来处理输入时,这被称为Ambassador
模式。
如果它处理主容器的输出,那么它就是一个适配器。
适配器与Ambassador模式
在Kubernetes中,应用程序的默认日志输出是打印到标准输出(stdout)。
那么如果你的应用程序将日志记录到文件中,该怎么收集日志呢?
你可以使用一个容器来检索日志文件的内容并将其打印到标准输出(stdout)。
Sidecar容器检索文件内容并将其打印到标准输出(stdout)。
其他Sidecar包括注入密钥、在ConfigMaps发生更改时重新加载应用程序、缓存等容器。
任何增强你的应用程序的容器通常被称为Sidecar容器。
示例包括:
- 注入密钥
- 在ConfigMaps发生更改时重新加载
- 缓存
Elasticsearch建议在应用程序启动之前将虚拟内存设置为较高的值(即mmap计数)。
你如何在Kubernetes中做到这一点? 它是在“普通”容器启动之前运行完毕的容器。
你可以使用Kubernetes中的Init容器
因此,如果你要将现有应用迁移到Kubernetes中,你有四种模式可供选择:
- Ambassador(大使模式)
- Adapter(适配器模式)
- Sidecar(边车模式)
- Init(初始化模式)