完成整个架构
现在我们学习了完成架构的所有必须的资源,因此这一节会非常快。图 22 中灰色的部分是需要做的事情。让我们从底部开始:部署 sa-logic 的部署。
图 22:当前应用程序状态
部署 SA-Logic
在终端中进入资源清单文件所在的目录,然后运行如下命令:
kubectl apply -f sa-logic-deployment.yaml --record deployment "sa-logic" created
SA-Logic 的部署会创建三个 Pod(Pod 上运行着我们的 Python 应用)。该命令还会给 Pod 贴上 app: sa-logic 的标签。有了这个标签,我们就能从 SA-Logic 服务中利用选择器来选择这些 Pod。请花点时间打开 sa-logic-deployment.yaml,查看其内容。
这里的概念都是一样的,因此我们可以直接讲解下一个资源:SA-Logic 服务。
SA Logic 服务
首先来解释下为什么需要该服务。我们的 Java 应用(在 SA-WebApp 部署的 Pod 中运行)依赖于 Python 应用提供的情感分析。但现在,与我们在本地运行一切服务时的状况不同,我们并没有一个单一的 Python 应用监听着某个端口,我们只有两个 Pod,如果需要,我们可以有更多的 Pod。
这就是为什么需要“服务”为一组提供相同功能的 Pod 提供访问入口。这就是说,我们可以利用 SA-Logic 服务作为所有 SA-Logic Pod 的访问入口。
运行如下命令:
kubectl apply -f service-sa-logic.yaml service "sa-logic" created
更新后的应用程序状态:现在我们有两个 Pod 在运行(包含 Python 应用程序),并且 SA-Logic 服务提供了访问入口,该访问入口将在 SA-WebApp 的 Pod 中使用。
图23:更新后的应用程序状态
现在需要部署 SA-WebApp Pod,我们需要用到部署资源。
SA-WebApp 部署
我们已经学过了部署,尽管这个部署会用到更多的特性。打开 sa-web-app-deployment.yaml 文件,会发现以下的新内容:
- image: rinormaloku/sentiment-analysis-web-app imagePullPolicy: Always name: sa-web-app env: - name: SA_LOGIC_API_URL value: "http://sa-logic" ports: - containerPort: 8080
我们感兴趣的第一件事就是 env 属性。我们猜测它定义了环境变量 SA_LOGIC_API_URl,值为在 Pod 内的值为 http://sa-logic。但为什么要初始化成 http://sa-logic,sa-logic 究竟是什么?
我们先来介绍下 kube-dns。
KUBE-DNS
Kubernetes 有个特殊的 Pod 叫做 kube-dns。默认情况下,所有 Pod 都用它作为 DNS 服务器。kube-dns 的一个重要属性就是它为每个建立的访问都创建一条 DNS 记录。
这就是说当我们创建 sa-logic 服务时,它会获得一个 IP 地址。它的名字会加入到 kube-dns 中(和它的 IP 地址一起)。这样所有 Pod 都能够把 sa-logic 翻译成 SA-Logic 服务的 IP 地址。
好,现在可以继续了:
SA WebApp 部署(续)
运行以下命令:
kubectl apply -f sa-web-app-deployment.yaml --record deployment "sa-web-app" created
完了。剩下的工作就是通过 LoadBalancer 服务将 SA-WebApp Pod 暴露到外部。LoadBalancer 服务提供了 SA-WebApp Pod 的访问入口,这样 React 应用程序就能发送 HTTP 请求了。
SA-WebApp 服务
打开 service-sa-web-app-lb.yaml 文件,可以看到内容还是挺熟悉的。
所以我们可以运行如下命令:
kubectl apply -f service-sa-web-app-lb.yaml service "sa-web-app-lb" created
这样架构就完成了。但还有一点不完美的地方。在部署 SA-Frontend Pod 之后,容器映像指向了 http://localhost:8080/sentiment 处的 SA-WebApp。但现在我们需要将其更新为 SA-WebApp LoadBalancer 的 IP 地址(其作用是 SA-WebApp Pod 的访问入口)。
修补该不完美是个快速复习一切的绝佳机会(如果能不参照以下的指南独立完成更好)。下面我们开始:
- 执行下列命令获取 SA-WebApp LoadBalancer 的 IP:
minikube service list |-------------|----------------------|-----------------------------| | NAMESPACE | NAME | URL | |-------------|----------------------|-----------------------------| | default | kubernetes | No node port | | default | sa-frontend-lb | http://192.168.99.100:30708 | | default | sa-logic | No node port | | default | sa-web-app-lb | http://192.168.99.100:31691 | | kube-system | kube-dns | No node port | | kube-system | kubernetes-dashboard | http://192.168.99.100:30000 | |-------------|----------------------|-----------------------------|
-
在 sa-frontend/src/App.js 中使用 SA-WebApp LoadBalancer 的 IP,如下:
analyzeSentence() { fetch('http://192.168.99.100:31691/sentiment', { /* shortened for brevity */}) .then(response => response.json()) .then(data => this.setState(data)); }
构建静态文件 npm build (需要先切换到 sa-front-end 目录);
构建容器映像:
docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend:minikube .
- 将映像推送到 Docker hub:
docker push $DOCKER_USER_ID/sentiment-analysis-frontend:minikube
- 编辑 sa-frontend-deployment.yaml 并使用新的映像;
- 执行 kubectl apply -f sa-frontend-deployment.yaml 命令。
刷新浏览器(如果你关闭了浏览器,则执行 minikube service sa-frontend-lb)。敲个句子试试看!
全文总结
Kubernetes 对团队、项目都很有好处,它能简化部署,提供伸缩性、灵活性,可以让我们使用任何底层基础设施。以后我们叫它 Supernetes 吧!
本文中覆盖的内容:
- 构建/打包/运行 ReactJS、Java 和 Python 应用程序;
- Docker容器,如何利用 Dockerfile 定义并构建容器;
- 容器注册目录,我们采用 Docker Hub 作为容器的代码库;
- 介绍了 Kubernetes 的最重要的内容;
- Pod;
- 服务;
- 部署;
- 新概念,如零停机时间部署;
- 创建可伸缩的应用;
- 流程上,我们将整个微服务应用程序转成了 Kubernetes 集群。
本文为你提供了坚实的基础供你在实际的项目中使用,并且帮你更容易地学习更多新概念。
来自:CSDN(微信号:CSDNnews),作者:Rinor Maloku,译者:弯月,责编:郭芮
【三小时学会Kubernetes!(五) 】完成整个架构的更多相关文章
-
三小时学会Kubernetes:容器编排详细指南
三小时学会Kubernetes:容器编排详细指南 如果谁都可以在三个小时内学会Kubernetes,银行为何要为这么简单的东西付一大笔钱? 如果你心存疑虑,我建议你不妨跟着我试一试!在完成本文的学习后 ...
-
[转载]三小时学会Kubernetes:容器编排详细指南
原翻译by梁晓勇 原英文:Learn Kubernetes in Under 3 Hours: A Detailed Guide to Orchestrating Containers 我很奇怪,为什 ...
-
【三小时学会Kubernetes!(零) 】系统结构及相关示例微服务介绍
写在前面 牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻,我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说 — — 以 ...
-
【三小时学会Kubernetes!(四) 】Deployment实践
Deployment 部署 Kubernetes 部署可以帮助每一个应用程序的生命都保持相同的一点:那就是变化.此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出 ...
-
【三小时学会Kubernetes!(三) 】Service实践
服务Service Kubernetes 服务资源可以作为一组提供相同服务的 Pod 的入口.这个资源肩负发现服务和平衡 Pod 之间负荷的重任,如图 16 所示. 图16:Kubernetes 服务 ...
-
【三小时学会Kubernetes!(二) 】Kubernetes 简介及Pod实践
Kubernetes 简介 我向你保证我没有夸大其词,读完本文你会问“为什么我们不称它为 Supernetes?” Kubernetes 是什么? 从容器启动微服务后,我们有一个问题,让我们通过如下问 ...
-
【三小时学会Kubernetes!(一) 】容器简介及为每个服务创建镜像
容器是什么 Kubernetes 是容器管理平台.可想而知我们需要容器去管理它们.但是容器是什么?Docker 官方文档的最佳答案如下: 容器映像是轻量级的.独立的.可执行软件包,包含所有可运行的东西 ...
-
三小时攻克 Kubernetes!
我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说——牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻. 以下为译文: 为 ...
-
【转载】一个小时学会MySQL数据库
一个小时学会MySQL数据库 目录 一.数据库概要 1.1.发展历史 1.1.1.人工处理阶段 1.1.2.文件系统 1.1.3.数据库管理系统 1.2.常见数据库技术品牌.服务与架构 1.3.数 ...
随机推荐
-
android sqlite操作(1)
以下只是我个人的浅见,大神请忽略~ android提供了一个轻量级的数据库sqlite,虽然说是轻量级,但是相对移动设备sqlite绝对够用了. 先说一下sqlite的管理工具吧 sqlite3,使用 ...
-
GCD 多线程 ---的记录 iOS
先写一个GCD static UserInfoVoModel *userInfoShare = nil; +(instancetype)shareUserInfoVoModel { static di ...
-
luogu P1578 奶牛浴场
很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...
-
C#-异常处理(十四)
概念 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常 但并不是所有的错误都是异常 而处理这种错误,称为异常处理 异常处理实际是不断去发掘异常.修改异常,使程序更稳定 异常处 ...
-
前端Table数据导出Excel使用HSSFWorkbook(Java)
一.实现原理: 1. 前端查询列表数据并渲染至table(<table>...</table>)表格 2. 表格html代码传输至后台 3. 后台把html转成Excel输出流 ...
-
windows下通过ping和tracert工具来测试网站访问速度
一.环境 OS: windows 二.步骤 2.1.ping mirrors.163.com Pinging mirrors.163.com [23.111.1.151] with 32 bytes ...
-
memcached配置 (初级)以及测试
一.memcached安装 memcached依赖 $ sudo apt-get install libevent-dev 安装memcached服务 $ sudo apt-get install ...
-
Java基础知识:Java实现Map集合二级联动4
comboBox.setModel(new DefaultComboBoxModel(getProvince())); // 添加省份信息 final JLabel label = new JLabe ...
-
互联网轻量级框架SSM-查缺补漏第四天
简言:昨天第四章没看完,今天接着记吧. 4.5 typeHandler 类型转换器 顾名思义呀,就是将数据库中数据类型与Java数据类型做相互转换的处理器.在typeHandler中,分为jdbcTy ...
-
extjs,ComboReturn
package cn.edu.hbcf.common.vo; import java.io.Serializable; public class ComboReturn implements Seri ...