K8s手记基础

怎么定义云原生的概念?

CNCF 官方定义:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。 这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更

怎么理解不可变基础设施?

不可变基础设施,这个名词最早由 Chad Fowler提出来的。这里的基础设施,我们可以理解为服务器、虚拟机或者是容器。 不可变基础设施相对的,我们称之为可变基础设施

在以往传统的开发运维体系中,软件开发完成后,需要工程师或管理员通过SSH 连接到他们的服务器上,然后进行一些脚本安装、deb/rpm 包的安装工作,并逐个机器地调整对应的配置参数及文件。后续还会根据需要对该环境进行不断更改,比如 kernel 升级、配置更新、打补丁等。
随着这种类似变更的操作越来越多,没有人能弄清楚这个环境具体经历了哪些操作,而后续的变更也经常会遇到各种意想不到的诡异事情,比如软件包的循环依赖、参数的配置不一致、版本漂移等问题。

这种可变基础设施会导致以下问题:

  • 持续的变更修改给服务运行态引入过多的中间态,增加了不可预知的风险
  • 故障发生时,难以及时快速构建出新的服务副本
  • 不易标准化,交付运维过程异常痛苦,虽然可以通过 Ansible、Puppet 等部署工具进行交付,但是也很难保证对底层各种异构的环境支持得很好,还有随时会出现的版本漂移问题

所以,不可变基础设施则是部署完成以后,便成为一种只读状态,不可对其进行任何更改。如果需要更新或修改,就使用新的环境或服务器去替代旧的。

Kubernetes 中的不可变基础设施就是 Pod。

Pod 是什么

Pod 由一个或多个容器组成。Pod 中的容器不可分割,会作为一个整体运行在一个 Node 节点上,也就是说 Pod 是你在 Kubernetes 中可以创建和部署的最原子化的单位。

同一个 Pod 中的容器共享网络、存储资源。

  • 每个 Pod 都会拥有一个独立的网络空间,其内部的所有容器都共享网络资源,即 IP 地址、端口。内部的容器直接通过 localhost 就可以通信。
  • Pod 可以挂载多个共享的存储卷(Volume),这时内部的各个容器就可以访问共享的 Volume 进行数据的读写。

一个Pod该定义什么样的容器呢?

通常来说,如果在一个 Pod 内有多个容器,那么这几个容器最好是密切相关的,且可以共享一些资源的,比如网络、存储等。 适合在一个 Pod 内运行多个容器的场景:

  • 容器之间会发生文件交换等,比如一个写文件,一个读文件;
  • 容器之间需要本地通信,比如通过 localhost 或者本地的 Socket。这种方式有时候可以简化业务的逻辑,因为此时业务就不用关心另外一个服务的地址,直接本地访问就可以了;
  • 容器之间需要发生频繁的 RPC 调用,出于性能的考量,将它们放在一个 Pod 内;
  • 希望为应用添加其他功能,比如日志收集、监控数据采集、配置中心、路由及熔断等功能。

为什么 Kubernetes 不直接管理容器,而用 Pod 来管理呢?

直接管理一个容器看起来更简单,但为了能够更好地管理容器,Kubernetes 在容器基础上做了更高层次的抽象,即 Pod。

因为使用一个新的逻辑对象 Pod 来管理容器,可以在不重载容器信息的基础上,添加更多的属性,而且也方便跟容器运行时进行解耦,兼容度高。比如:

  • 存活探针(Liveness Probe)可以从应用程序的角度去探测一个进程是否还存活着,在容器出现问题之前,就可以快速检测到问题;
  • 容器启动后和终止前可以进行的操作,比如,在容器停止前,可能需要做一些清理工作,或者不能马上结束进程;
  • 定义了容器终止后要采取的策略,比如始终重启、正常退出才重启等;

猜你喜欢

转载自juejin.im/post/7128594274555265054