Kubernetes有多甜?

78 阅读9分钟

在靠近用户的地方部署容器

本工程教育(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网关是一个集群网关,充当认证的守门员。它为集群提供一个访问点,并匹配所有传入底层微服务的请求。

Fleetman microservice

Kubernetes是什么

按照标准的定义。Kubernetes是一个开源系统,用于协调、部署自动化、自动扩展和管理容器中的应用程序。

Kubernetes不是什么

Kubernetes不是Docker的替代品。它是更多的东西。

Kubernetes与Docker**的对比

s/nDockerKubernetes
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都有其服务。

node

秘密

为了隐藏我们数据库中的信息,我们需要一个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作为副本集在各节点上进行调度的过程被称为 "主进程"。它是在 "调度器 "的帮助下完成的。

ingress

希望你能发现这个教程很有用!

编码愉快!


同行评审的贡献者。Briana Nzivu

类似文章

[

Continuous Integration and Deployment Pipelines with Flask Docker and Github Actions

容器

使用Flask、Docker和Github Actions的持续集成和部署管道

阅读更多

](www.section.io/engineering…

DevOps Pipeline Automation with Cloud Build and Triggers Hero Image

容器、API

使用Google Cloud Build和Triggers的DevOps管道自动化

阅读更多

](www.section.io/engineering…

Dockerizing an ASP.NET Core Web API app and SQL Server Hero Image

容器

容器的使用方法和注意事项

阅读更多

](www.section.io/engineering…)