在靠近用户的地方部署容器
本工程教育(EngEd)计划由科支持。
在全球范围内即时部署容器。Section是经济实惠、简单而强大的。
免费开始。
Kubernetes有多甜?
6月16日, 2021
- 主题。
- 容器
当你听到Kubernetes时,你的第一印象是什么?我打赌你已经在想,(哦不,又来了一个科技流行语。听起来已经是一个很难的概念了)。好吧,你并不完全正确。然而,让我们深入了解一下吧
简介
我们将使用Fleetman应用程序来解释Kubernetes的概念。
注意:你可以在这里克隆用于描述本教程的GitHub仓库。
让我们开始吧。
Fleetman应用程序的概述
Fleetman应用程序是一个跟踪卡车在伦敦市内移动的位置的应用程序。这些卡车都配备了全球定位系统(GPS),并定期向中央服务器报告它们的位置。这是一个简单的微服务架构,几乎没有什么复杂性。
这篇文章不是关于Fleetman应用的。相反,我们将使用Fleetman来更好地理解我们的内容。
微服务遵守SOLID原则,也就是。
Single Responsibility Principle,一个模块必须做一件事,以及微服务架构的每个部分应该只做一件事。The Position Simulation只模拟卡车在任何时间点的位置,这是它唯一的工作。一旦计算出位置并为人所知,数据就会被传输到 。在任何微服务的架构中,队列的本质是为了避免数据的丢失。队列接收数据,让它等待来自位置跟踪器的请求。Message Queue
这里实现的队列是**ActiveM。**它也被作为一个docker容器使用。位置跟踪器从队列中获取信息并进行许多计算,比如计算某辆卡车的速度。API网关是一个集群网关,充当认证的守门员。它为集群提供一个访问点,并匹配所有传入底层微服务的请求。

Kubernetes是什么
按照标准的定义。Kubernetes是一个开源系统,用于协调、部署自动化、自动扩展和管理容器中的应用程序。
Kubernetes不是什么
Kubernetes不是Docker的替代品。它是更多的东西。
Kubernetes与Docker**的对比
| s/n | Docker | Kubernetes |
|---|---|---|
| 1. | Docker用于构建镜像并在容器中管理它们。 | Kubernetes有效地管理由Docker构建的容器,使其成为一个协调工具。 |
| 2. | Docker在单个节点上运行。 | Kubernetes跨集群运行。 |
| 3. | Docker是由三个y连接的毕业生建立的。 | 谷歌工程师开发了Kubernetes,但它现在被作为一个开源项目来管理。 |
然而,借助于我部署在我的repo上的Fleetman应用程序作为教学材料,最好能看到它是如何工作的。
Kubernetes中值得注意的概念
部署
部署是一个配置脚本,为应用程序提供声明性的更新。它让工程师可以自由地描述一个应用程序的生命周期,例如为应用程序使用哪种镜像,应该有多少个pod,以及这些pod应该如何更新。
它还提供了配置权限,以确定每个pod要产生的复制集的数量。它还有助于集群的维护,以避免最微小的停机时间。它可以被比作房屋的蓝图。它定义了每个pod功能的行为或外观。我们所声明的配置是在部署中,而名称是在位置模拟器中。
我们使用的容器是在line 17 ,而位置模拟器从Richard Chesterwood的仓库中发布了one 。我们可以看到,'replicas'被指定为我们的复制集,而模板则声明了我们的pod。对于一个标准的,YAML ,即使它可以被分离,为了确保有序性和关注点的分离,我们把每个部署的服务写在同一个文件中,用三个破折号(-)来分隔它们。有些人喜欢把他们的安排为所有的服务放在一个单独的文件中。这也是可以接受的。
apiVersion: apps/v1
kind: Deployment
metadata:
name: position-simulator
spec:
selector:
matchLabels:
app: position-simulator
replicas: 1
template: # template defining our pod
metadata:
labels:
app: position-simulator
spec:
containers:
- name: position-simulator
image: richardchesterwood/k8s-fleetman-position-simulator:release1
env:
- name: SPRING_PROFILES_ACTIVE
value: production-microservice
Pod
Kubernetes只通过pod的概念与容器进行交互。一个pod是一个容器的抽象概念。每个容器都完全保存在一个pod中。因此,我们可以说,pod是Kubernetes系统与容器交互的唯一方式。
在我们的Yaml 文件中,pod被表示为一个模板,用于部署。如果你跟进位置模拟器的部署,你会发现脚本的一个片段正在声明我们的pod。
template: # template defining our pod
metadata:
labels:
app: position-simulator
spec:
containers:
- name: position-simulator
image: richardchesterwood/k8s-fleetman-position-simulator:release1
env:
- name: SPRING_PROFILES_ACTIVE
value: production-microservice
复制集
复制集是一个pod的抽象,几乎和pod是容器的抽象一样。为什么复制集如此重要?高可用性是它的优势之一,这也是它被用于配置的原因。它确保应用程序运行良好,零或最小的停机时间。
如果一个pod似乎关闭了,我们将保证在我们的复制集的帮助下有许多其他副本。在我们的集群中,复制集存储在我们的一个节点中,只有Scheduler 。在一个节点上,每个pod可以有尽可能多的复制集。在我们上面展示的部署中,它被指定为复制集。
复制集与部署有什么不同?
部署和复制集之间有一些区别,最重要的是。
- 复制集可以确保每次都有一定数量的复制在为一个pod运行。然而,如前所述,部署有助于管理复制集,并在其他基本功能的基础上提供对pod的声明性更新。
- 当我们的应用程序为一个副本集进行更新时,应用程序将关闭,因为另一个副本被启动了。这是它的一个缺点,因为在创建期间会有停机时间,不像部署可以确保旧的复制集继续运行,直到新的复制集被启动。一旦新的pod运行,旧的pod就会完全关闭,确保没有任何停机时间。
节点
节点类似于我们的笔记本电脑。我们的笔记本电脑可以被视为真正的Kubernetes集群中的一个节点。它就像集群中的一台个人电脑,吊舱就住在那里。一个节点有可能有几个pod,但一个集群中最少的节点数是两个。
一个节点不能构成一个集群。在一个节点中,至少有一个pod和一个pod抽象出来的容器。有时,可能会出现一个pod中有多个容器的情况,但这并不是正确的做法。一个节点中也可以有几个pod,每个pod都有其服务。

秘密
为了隐藏我们数据库中的信息,我们需要一个secret配置。秘密的功能是容纳或存储机密数据,这些数据在生产中不得暴露。
apiVersion: version1
kind: Secret
metadata:
name: secret
type: Opaque
data:
mongo-root-username: d2l6YXJkY2FsaWRhZA==
mongo-root-password: T2xhdHVuZGU4IQ==
然而,我们的数据库用户名和密码也是保密的。因此,我们唯一要暴露的是将它们转换为64进制后产生的密钥。要转换你的用户名和密码,在你的终端上写下这个简单的语句。
echo -n “the content to convert” | base64
服务
服务是Kubernetes的一个端点或API点。一个服务总是有一个永久的IP地址,这就是为什么它必须连接到pod上,而pod的IP地址在停机时时常变化。
这意味着我们的服务的IP永远不会改变,而一个pod的IP在更新时则会改变。由于这样一个重要的原因,有一个服务附加在所有的pod上。几个pod可以附加到一个服务上,这进一步说明了我们的复制集是多么重要。
让我们抽出Fleetman应用程序中的服务作为例子。
apiVersion: version1
kind: service
metadata:
name: Api-Gateway
spec:
# Explains which pod will be represented by this service
# The service serves as a network endpoint for one of other
# services or users trying to access through the browser.
selector:
app: api-gateway-app
ports:
- name: http
port: 8000
nodePort: 30010
type: NodePort
apiVersion: version1
kind: service
metadata:
name: Mongo-Express
spec:
selector:
app: mongo-express-app
type: NodePort
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30080
kind: service
apiVersion: version1
metadata:
name: Mongo-db
spec:
selector:
app: mongo-db-app
ports:
- name: mongoport
port: 27017
type: ClusterIP
apiVersion: version1
kind: service
metadata:
name: Position-Tracker
spec:
# Explains which pod will to be represented by this Service
# The service serves as a network endpoint for one of other
# services or users trying to access through the browser.
selector:
app: position-tracker-app
ports:
- name: http
port: 8088
type: ClusterIP
apiVersion: version1
kind: service
metadata:
name: webapp
spec:
# Explains which pod will to be represented by this Service
# The service serves as a network endpoint for one of other
# services or users trying to access through the browser.
selector:
app: web-app
ports:
- name: http
port: 80
nodePort: 30070
type: NodePort
配置图
Configmap负责存储我们应用程序的所有外部配置。外部配置包括所有第三方配置,如数据库URL和端口。
apiVersion: version1
kind: ConfigMap
metadata:
name: mongo-configmap-
data:
database_url: mongo-db-app
入站
入站解决了浏览器中的IP地址与负责响应请求的节点中的正确服务之间的联系。正如我们先前所了解到的,服务附属于pod,仅仅是由后来与pod通信的端口组成的接入点。
将pod作为副本集在各节点上进行调度的过程被称为 "主进程"。它是在 "调度器 "的帮助下完成的。

希望你能发现这个教程很有用!
编码愉快!
同行评审的贡献者。Briana Nzivu
类似文章
[

容器
使用Flask、Docker和Github Actions的持续集成和部署管道
阅读更多

容器、API
使用Google Cloud Build和Triggers的DevOps管道自动化
阅读更多

容器
容器的使用方法和注意事项
阅读更多