目录
三、Docker Compose与Kubernetes中的Pod
一、容器
Kubernetes基于容器做了很多的逻辑抽象概念,所以我们先简单回顾下容器的发展:
1.传统部署:
早期,各个组织是在物理服务器上运行应用程序。由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题(例如,在同一台物理服务器上运行多个应用程序, 可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降)。可以想到的解决方案是把每个应用程序都运行在不同的物理服务器上,但当某个应用程序资源利用率不高时,又造成资源浪费。
2.虚拟化部署:
虚拟化技术的出现允许我们在单个物理服务器上运行多台虚拟机。虚拟化能使应用程序在不同VM之间被彼此隔离,提供一定程度的安全性,并且能够更好地利用物理服务器的资源,具有更高的可扩缩性,以及降低硬件成本等好处(如vSphere ESXi现在把5台机房中的物理服务器统一部署成虚拟化集群,管理员登陆管理页面,可以创建出20台虚拟服务器,而虚拟服务器在各个物理服务器上只不过是一个个文件,他们共享集群中的计算资源)。每个VM可以看成是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
3.容器部署:
容器类似于VM,但是更宽松的隔离特性,使容器之间可以共享操作系统。所以,容器比VM更轻量级,每个容器都具有自己的文件系统、CPU、内存、进程空间等,由于与基础架构分离,容器可以跨云和操作系统进行移植。容器的优点如开发运维分离,持续集成部署,跨平台一致性和可移植,资源隔离等等。说起容器,我们第一个想到的就是Docker。
二、容器运行时
Kubernetes为我们提供了一个可弹性运行分布式系统的框架。Kubernetes会满足基于容器化的自动扩展、故障转移、部署模式等等。这里我们了解下相关的容器运行组件DockerShim与Containerd:
1.DockerShim:
DockerShim,是Kubernetes容器运行时接口(CRI)实现的一部分。它充当Kubernetes和Docker运行时之间的桥梁。在Kubernetes的早期版本中,Docker是默认的容器运行时。DockerShim将Kubernetes CRI调用转换为Docker特定的调用,使Kubernetes能够使用Docker管理和运行容器。然而,从Kubernetes 1.20版本开始,DockerShim作为默认的CRI实现已被弃用,并且鼓励用户迁移到Containerd。
2.Containerd:
Containerd是行业标准的核心容器运行时。它采用轻量级设计,专注于容器执行、镜像分发和存储。Docker最初使用Containerd作为其核心容器运行时,后来演变为一个单独的项目。Containerd 提供拉取容器镜像、管理容器生命周期以及通过定义良好的API与Containerd交互的功能。Containerd是一个用于将Docker与Kubernetes集成为容器运行时的特定组件。Containerd 是一种更模块化和通用的容器运行时,不专门与Docker绑定。
ctr是containerd自带的CLI命令行工具,ctr命令运行的默认命名空间是在:default。这里简单介绍下常用命令:
1.查看命名空间:ctr ns ls
2.拉取镜像(如果pull私有仓库,你的私有仓库必须有配置https):ctr -n k8s.io image pull
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.53.导出镜像:ctr -n k8s.io image export pause.tar
172.17.0.10:5000/pause:3.54.导入镜像:ctr -n k8s.io image import pause.tar
三、Docker Compose与Kubernetes中的Pod
由于大多数人对Docker的使用比较熟悉,所以我们来看一个传统的Docker部署方式,使用Docker Compose部署多个服务的示例:
version: '3'
services:
init-myapp:
image: alpine:latest
command: ["/bin/sh", "-c", "echo Initializing...; sleep 3"]
container_name: init-myapp
webapp:
image: my-webapp:demo
ports:
- "5000:5000"
depends_on:
init-myapp:
condition: service_started
environment:
DATABASE_HOST: db
db:
image: postgres:demo
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
这个docker-compose.yml文件中,定义了两个主要的服务:webapp和db,它们将共享同一个网络,webapp服务会连接到db服务的PostgreSQL数据库;init-myapp服务是一个init容器,它只运行一次,执行一个简单的命令来模拟初始化操作,webapp服务将等待init-myapp服务启动并运行之后才启动。这个docker-compose.yml文件中定义的资源使用docker-compose up -d命令启动并运行。
我们现在可以想象这个docker-compose.yml文件类似于Pod的定义文件,只不过参数和格式不同。区别是:docker-compose.yml文件启动的容器受Docker Compose工具的实时监控,在单台服务器上实现自动重启。Pod定义文件受Kubernetes的实时监控,在服务器集群上实现更多的自动化功能。接下来我们会了解Pod的概念和使用方法!