Kubernetes 是正确的选择吗?
-
Kubernetes is really useful 用于负载平衡工作负载,在无法加快测试流程的情况下提供高可用性,并通过不同策略提高生产推出期间的安全性,并通过隔离提高安全性。
但是,并非所有类型的工作负载都可以利用 Kubernetes 引入的所有功能。
- 例如,如果您的应用程序以这样一种方式构建,它需要稳定数量的 RAM 和 CPU,代码也非常稳定,您只需要一个副本,那么 Kubernetes 和容器可能不是最佳选择(即使您可以完美地使用它们),您更应该在大型单片服务器/虚拟机上实现所有内容。
但是,如果您需要将它部署在不同的云提供商上,并且它应该每天只运行几个小时,那么它也许也可以利用这些功能。 如果您愿意添加一个层,请确保您需要它引入的功能,否则将只是开销。
请注意,Kubernetes 无法单独拆分您的工作负载。因此,我不知道您所说的“如果 pod-a 处于高负载状态,它将被卸载到 pod-b”是什么意思,很可能是的,但你必须指示它这样做所以。
Kubernetes 会小心运行您的 POD,确保已在有足够内存和 CPU 可用的节点上调度 according to your specification,您也可以设置 autoscaling procedures 以支持高工作负载时段或 scale even the cluster 本身.您的应用程序应该以支持分而治之模式的方式创建,否则您可能会拥有三个节点,一个 Pod 在一个节点上运行,两个空闲以及您本可以避免的开销。
- 如果您的 C++ 应用程序 POD 对字符串进行散列处理,并且单个请求可能会消耗节点的所有资源 Kubernetes 不会“吐出”初始工作负载,也不会为您创建更多的 PODS 在集群中调度它们! 当然你可以实现类似的东西,但它不是免费的,你可能需要修改你的 C++ 代码。
当然,您可以利用 Kubernetes,在其上运行您的应用程序非常简单,但您可能需要修改架构中的某些内容才能充分利用这些功能。
部署 C++ 应用程序
在 Kubernetes 中部署应用程序的过程非常标准。在本地开发它,使用您需要的所有库和组件创建 Docker 映像,在本地对其进行测试,将其推送到注册表,然后在 Kubernetes 中创建部署。
假设您拥有在本地文件夹中运行应用程序和可执行文件所需的所有资源。创建 Docker 文件。
Example,修改实现你的应用程序,我已经报告了它作为示例来显示语法:
# Download base image, Ubuntu 16.04 (Xenial Xerus)
FROM ubuntu:16.04
# Update software repository
RUN apt-get update
# Install nginx, php-fpm and supervisord from the Ubuntu repository
RUN apt-get install -y nginx php7.0-fpm supervisor
# Define the environment variable
ENV nginx_vhost /etc/nginx/sites-available/default
[...]
# Enable php-fpm on the nginx virtualhost configuration
COPY default ${nginx_vhost}
[...]
RUN chown -R www-data:www-data /var/www/html
# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
# Configure services and port
COPY start.sh /start.sh
CMD ["./start.sh"]
EXPOSE 80 443
构建运行:
export PROJECT_ID="$(gcloud config get-value project -q)"
docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .
gcloud docker -- push gcr.io/${PROJECT_ID}/hello-app:v1
kubectl run hello --image=gcr.io/${PROJECT_ID}/hello-app:v1 --port [port number if needed]
More information is here.