kubernetes三小时攻克kubernetes!:为每个服务创建容器镜像(代码片段)

detector detector     2022-11-22     178

关键词:

容器是什么

Kubernetes 是容器管理平台。可想而知我们需要容器去管理它们。但是容器是什么?Docker 官方文档的最佳答案如下:

容器映像是轻量级的、独立的、可执行软件包,包含所有可运行的东西:代码、运行时、系统工具、系统库、设置。对于基于 Linux 和 Windows 的应用,不论环境如何,容器化的软件都可以照常运行。
这意味着容器可以在任何计算机上运行,甚至是在产品服务器上,都没有任何差别。

技术分享图片

为了更形象地描述,让我们来对比一下 React 应用程序在虚拟机上和容器内运行的情况。

通过虚拟机提供 React 静态文件

使用虚拟机的缺点包括:

  • 资源效率低下,每个虚拟机都需要一个完全成熟的操作系统;
  • 对平台有依赖性。本地机器上运行得很好的功能未必能在产品服务器上正常工作;
  • 与容器相比,更重而且规模伸缩较慢。
    技术分享图片

通过容器提供 React 静态文件

使用容器的优点包括:

  • 资源效率很高,在 Docker 的帮助下使用主机操作系统;
  • 对平台没有依赖性。可以在本地机器上运行的容器可以在任何机器上正常工作;
  • 通过映像层提供轻量级服务。

技术分享图片

以上是使用容器最突出的特色和优势。更多信息,请参阅 Docker 官方文档:https://www.docker.com/what-container

为 React 应用建立容器镜像(Docker 简介)

Docker 容器最基本的组件是 .dockerfile。该 Dockerfile 文件最基本的组成是容器镜像,我们将通过下列一系列说明,介绍如何创建一个符合应用程序需求的容器镜像。

在开始定义 Dockerfile 之前,让我们先回想一下使用 Nginx 服务 React 静态文件的步骤:

  • 创建静态文件(npm run build);
  • 启动 Nginx 服务器;
  • 将前端项目的 build 文件夹的内容复制到 nginx/html 目录中。

在下一节中,你会注意到创建容器与建立本地 React 的过程非常相似。

为前端定义 Dockerfile

前端 Dockerfile 的建立只有两个步骤。这是因为 Nginx 团队为我们提供了基本的 Nginx 映像,我们可以直接利用。这两个步骤如下:

  • 启动基本的 Nginx 映像;
  • 将 sa-frontend/build 目录复制到容器的 nginx/html 中。
    转换成的Dockerfile如下所示:
FROM nginx
COPY build /usr/share/nginx/html

很惊讶吧?这个文件是可读的,我们可以概括为:

从 Nginx 映像开始(不管里面是什么)。将 build 目录复制到映像的 nginx/html 目录中。然后就好了!

你可能在想,我该从哪儿复制 build 文件呢?例如:/usr/share/nginx/html。非常简单:在 Docker Hub 的 Nginx 映像文档中有记载。

建立并推送容器

在推送映像之前,我们需要一个容器注册来托管映像。Docker Hub 是一个免费的云容器服务,我们将使用它来做演示。接下来有 3 个任务需要完成:

  • 安装 Docker CE;
  • 注册 Docker Hub;
  • 在终端中运行如下命令登录:
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

在完成上述任何后,请进入目录 sa-frontend。然后运行如下命令(请用你的 docker hub 用户名替换 $DOCKER 用户名,例如:rinormaloku/sentiment-analysis-frontend)。

docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .

现在我们可以删掉 -f Dockerfile 了,因为我们已经在包含 Dockerfile 的目录中了。

我们可以使用 docker push 命令来推送映像:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

请确认映像已成功地被推送到 docker hub 代码库。

运行容器

现在任何人都可以获取 $DOCKER_USER_ID/sentiment-analysis-frontend 中的映像并运行:

docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

Docker 容器已经处于运行状态了!
在进行下一步之前,让我们先来讲解一下 80:80,很多人对此比较不解:

  • 第一个 80 是主机的端口号(例如:我的计算机);
  • 第二个 80 是容器的端口号,请求都会被转送到这里。
    技术分享图片

这是从<主机端口>匹配到<容器端口>的。也就是说每个发往主机 80 端口的请求都会被匹配到容器的 80 端口,如图 9 所示。
因为在主机上(你的计算机)80 端口上运行的端口可以访问 localhost:80。如果本地不支持 Docker,那么你可以在 :80 上打开应用程序。运行 docker-machine ip 命令可以找到 Docker 机器的 IP。
试试看!你现在应该可以访问 React 应用程序了。

Dockerignore 文件

刚才我们看到建立 SA-Frontend 的映像非常慢,不好意思,应该是超级慢。这是因为我们必须将建立过程中的环境文件发送给 Docker 服务。更具体地来说,建立过程中的环境文件指的是在建立映像的时候,所有会用到的 Dockerfile 目录中的数据。

以我们的例子来说,SA-Frontend 文件包括如下文件夹:

sa-frontend:
|   .dockerignore
|   Dockerfile
|   package.json
|   README.md
+---build
+---node_modules
+---public
---src

但是我们只需要 build 文件夹。上传其他的文件会浪费时间。我们可以通过删除其他目录来节约时间。这就需要用到 .dockerignore。你可能觉得这与 .gitignore 很相似,例如你可以所有想要忽略的目录都添加到 .dockerignore,如下所示:

node_modules
src
public

这个 .dockerignore 文件应该与 Dockerfile 在同一文件夹中。现在建立映像文件只需要几秒钟了。

让我们继续看看 Java 应用程序。

为 Java 应用程序建立容器映像

你知道吗?你已经差不多学习了所有关于创建容器映像的知识!这就是为什么这一小节这么短的原因。

在 sa-webapp 中打开 Dockerfile,你会看到只有两个新的关键字:

ENV SA_LOGIC_API_URL http://localhost:5000
…
EXPOSE 8080

关键字 ENV 在 Docker 容器内声明了环境变量。这可以让我们在启动容器的时候为情感分析 API 提供 URL。

另外,关键字 EXPOSE 提供了一个端口,供我们以后访问。但是等等,我们在 SA-Frontend 的时候没有做这一步,说得很对!这个端口仅用于文档,换句话说就是这个端口是用来向阅读 Dockerfile 的人提供信息的。

你应该已经掌握了创建和推送容器映像。如果遇到任何困难,可以阅读 sa-webapp中的README.md 文件。

为 Python 应用程序创建容器映像

sa-logic 的 Dockerfile 中没有新的关键字。现在你已经是 Docker 达人了。

关于如何建立和推送容器映像,请阅读 sa-logic 目录中的 README.md 文件。

测试容器化的应用程序

你能相信没有测试过的东西吗?我也不信。所以我们来测试一下这些容器吧。

1.运行 sa-logic 容器,并配置监听端口 5050:

docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic

2.运行 sa-webapp 容器,并配置监听端口 8080(因为我们改变了 Python 应用监听的端口,所以我们需要重写环境变量 SA_LOGIC_API_URL):

$ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

3.运行 sa-frontend 容器:

docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

然后就可以了。在浏览器中打开 localhost:80。

请注意:如果你改变 sa-webapp 的端口,或使用 Docker 机器的 IP,那么你需要更新 sa-frontend 中的 App.js,让 analyzeSentence 从新的 IP 或端口获取 URL。然后你需要建立并使用更新后的映像。
技术分享图片

智力问答题——为什么使用 Kubernetes?

本节中,我们学习了 Dockerfile,如何使用它创建映像,以及推送映像到 Docker注册目录的命令。另外,我们探讨了如何通过忽略没用的文件,减少需要发送的建立过程中的环境文件。最后我们从容器上运行了应用程序。

接下来,我们介绍为什么要使用 Kubernetes?我们将在下面深入介绍 Kubernetes,这里我想给你留个智力问答题。

如果我们的情感分析网络应用完成得很好,突然间访问量暴涨到每分钟数百万的请求,那么我们的 sa-webapp 和 sa-logic 将面临巨大的负荷压力。请问,我们如何才能扩大容器的规模?

来自:CSDN(微信号:CSDNnews),作者:Rinor Maloku,译者:弯月,责编:郭芮

kubernetes第零篇:认识kubernetes

文章目录一、前言二、kubernetes和云原生三、从DockerSwarm到Kubernetes四、kubernetes组件和架构简介4.1kubernetes组件4.1.1Container4.1.2Pod4.1.3ReplicaSet4.1.4Deployment4.1.5Label与Selector4.1.6Service4.1.7Node4.1.8多Node节点组成的集群4.2kuber 查看详情

Kubernetes 与 Docker Swarm

】Kubernetes与DockerSwarm【英文标题】:KubernetesvsDockerSwarm【发布时间】:2018-02-1219:58:41【问题描述】:我正在评估Kubernetes(使用Docker容器,而不是Kubernetes)和DockerSwarm,并且可以使用您的输入。如果我在小于100台服务器的服务器场... 查看详情

初步了解kubernetes

初步了解Kubernetes一、Kubernetes简介二、Kubernetes特性1、弹性伸缩2、自我修复3、服务发现和负载均衡4、自动发布(默认滚动发布模式)和回滚5、集中化配置管理和秘钥管理6、存储编排,支持外挂存储并对外挂存储资源... 查看详情

初步了解kubernetes

初步了解Kubernetes一、Kubernetes简介二、Kubernetes特性1、弹性伸缩2、自我修复3、服务发现和负载均衡4、自动发布(默认滚动发布模式)和回滚5、集中化配置管理和秘钥管理6、存储编排,支持外挂存储并对外挂存储资源... 查看详情

Kubernetes 日志转储一段时间

】Kubernetes日志转储一段时间【英文标题】:Kuberneteslogsdumpforsometimerange【发布时间】:2022-01-2115:40:48【问题描述】:是否可以获取特定时间范围的Kubernetes日志?我现在能做的就是使用kubectllogs&gt;dump.logcmd转储单个pod的最后一小... 查看详情

kubernetes快速指导手册管理kubernetes对象

...命令语法2.2基本命令2.3运行和调试的命令一、对象介绍在kubernetes中,所有的内容都抽象为对象,用户需要通过操作对象来管理kubernetes。有些时候对象也可以称为资源。二、对象基本介绍1查看所有对象kubectlapi-resources2常... 查看详情

kubernetes--k8s安装及配置全流程

参考技术A省略。。。。执行成功显示如下:根据提示执行该token只有两个小时有效,如果两个小时内未使用,以后想加入集群,可以使用以下命令重新获取tokenmode中加入ipvs,保存后退出。 查看详情

kubernetes-service介绍-服务发现(代码片段)

前言本篇是Kubernetes第九篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战。Kubernetes系列文章:Kubernetes介绍Kubernetes环境搭建Kubernetes-kubectl介绍Kubernetes-Pod介绍(-)Kubernetes-Pod介绍(二)-生命周期Kubernetes-Pod介... 查看详情

kubernetes——基本概念与理论(代码片段)

这里写目录标题一、Kubernetes是什么?二、Kubernetes特性三、Kubernetes集群架构与组件1、Master组件2、Node组件四、Kubernetes核心概念五、官方提供的三种部署方式一、Kubernetes是什么?Kubernetes,简称K8s,是一个开源的... 查看详情

云原生之kubernetes实战kubernetes集群的检测工具——popeye

【云原生之kubernetes实战】kubernetes集群的检测工具——popeye一、popeye介绍1.popeye简介2.Popeye特点二、检查本地k8s集群状态三、安装popeye工具1.下载Popeye2.解压压缩包3.复制文件4.检查版本四、查看popeye帮助五、扫描本地kubernetes集群六... 查看详情

kubernetes快速指导手册管理kubernetes对象(代码片段)

...命令语法2.2基本命令2.3运行和调试的命令一、对象介绍在kubernetes中,所有的内容都抽象为对象,用户需要通过操作对象来管理kubernetes。有些时候对象也可以称为资源。二、对象基本介绍1查看所有对象kubectlapi-resources2常... 查看详情

使用工作队列的 Kubernetes 作业调度

】使用工作队列的Kubernetes作业调度【英文标题】:Kubernetesjobschedulingusingworkqueue【发布时间】:2018-12-2921:16:00【问题描述】:我们正在使用Kubernetes/go-lang编写一个包裹递送跟踪器应用程序。一切都很好,直到我们遇到了我们有某... 查看详情

云原生之kubernetes实战在kubernetes集群下部署rainbond平台

【云原生之kubernetes实战】在kubernetes集群下部署Rainbond平台一、Rainbond介绍1.Rainbond简介2.Rainbond特点二、检查本地kubernetes集群状态1.检查工作节点状态2.检查系统pod状态三、安装nfs共享存储1.安装nfs2.配置共享目录3.使配置生效4.设置... 查看详情

kubernetes架构核心点详细总结!

顶级的Kubernetes日志监控工具Kubernetes集群需要重点关注的6个指标如何优雅的限制Kubernetes节点上运行的Pod数量容器与Pod到底有什么区别和联系?如何调试Kubernetes集群中的网络延迟问题新手必须知道的Kubernetes架构如何提高FlinkK8... 查看详情

kubernetes第七篇:使用kubernetes部署prometheus+grafana监控系统(kubernetes工作实践类)

文章目录​​一、前言​​​​二、K8s监控系统架构​​​​2.1Prometheus简介​​​​2.2Prometheus架构​​​​2.3Prometheus知识普及​​​​三、K8s监控系统搭建​​​​3.1三类数据采集metrics​​​​3.2Prometheus+Grafana​​​​3.3实... 查看详情

Kubernetes 通过基于时间的触发器扩展 pod

】Kubernetes通过基于时间的触发器扩展pod【英文标题】:KubernetesScalinguppodsbytimebasedtrigger【发布时间】:2019-02-1503:26:14【问题描述】:我有一个在Kubernetes上运行的服务器来处理每小时的处理作业。考虑使用服务来公开pod,并使用... 查看详情

如何学习kubernetes,学习kubernetes需要代码基础吗?

学习kubernetes要从了解,动手,思考三个方面入手,kubernetes基础设施即代码,因此学习kubernetes需要代码基础一:学习kuberneteskubernetes,又称K8s,是用8代替8个字符“ubernete”而成的缩写。是用于管理云平台中多个主机上的容器... 查看详情

云原生之kubernetes实战使用yum方式部署kubernetes集群

【云原生之kubernetes实战】使用yum方式部署kubernetes集群一、环境规划1.节点IP规划2.本次k8s部署介绍二、环境检查1.检查docker状态2.检查节点系统版本3.检查防火墙状态三、安装前环境配置工作1.关闭swap2.开启内核对流量转发3.关闭sel... 查看详情