openstack与docker

cover

openstack概述

OpenStack Cloud landscape map

是一套自动化配置,调度,管理服务器/虚拟机资源的系统,通过各种组件形成的 Infrastructure as a Service(IaaS)

OpenStack = 自己搭建 AWS(或阿里云、腾讯云)的软件。

1
2
3
4
5
6
7
8
9
10
           OpenStack

┌──────────────────┐
│ Dashboard │
│ API │
└──────────────────┘

↓↓↓↓↓↓↓↓↓↓↓

服务器A 服务器B 服务器C

本身不负责虚拟化技术相关,not Vmware

1
2
3
4
5
            OpenStack

┌─────────────┼──────────────┐
│ │ │
KVM/QEMU Ceph Linux Network

layer 1 - compute

Nova

云主机管理中心。负责创建删除VM,开关机,调度,分配计算资源

Zun

启动和管理基于不同容器技术的容器

layer 2 - storage

NAS、OSS和EBS的区别-文件存储NAS(NAS)-阿里云帮助中心

Swift

对象存储

Cinder

块存储

Manila

共享文件系统

layer 3 - networking

Neutron

负责虚拟交换机,VLAN,DHCP,Router

Octavia

负载均衡。

Designate

DNS

layer 4 - shared services

Keystone

身份认证,OAuth服务组件

Glance

发现、注册和检索虚拟机镜像

1
2
3
xxx/kolla/glance-api:bc-2024.1-ubuntu  #使用kolla部署情况下的相关镜像

filesystem_store_datadir = /var/lib/glance/images/ #镜像文件位置

Placement

资源调度。跟踪云资源库存和使用情况,以帮助其他服务有效管理和分配其资源。

Barbican

密钥管理

layer 5 - web

Horizon

浏览器控制台

others

  • 项目与角色
1
2
3
4
5
6
7
OpenStack Cloud

├── 项目(Project/Tenant)

└── 角色(Role)
├── member
└── admin
  • 数据盘的选择

如果只是测试、临时开发环境:直接选择合适的 ...disk Flavor,例如 1c1g30gdisk2c2g50gdisk,不创建 Volume,操作简单。

如果是需要长期保留数据、数据库、重要业务环境:优先选择 Disk=0 的 Flavor(如 1c1g1c2g),然后勾选 Create New Volume,创建足够大的系统卷。这种方式更符合现代 OpenStack 的存储设计,也便于后续快照、备份、迁移和扩容。

1
2
3
4
5
6
7
8
9
10
11
12
13
Kolla-Ansible

├── 部署 keystone 容器
├── 部署 nova 容器
├── 部署 glance 容器
├── 部署 horizon 容器
└── 部署 kolla_toolbox 容器

├── python-openstackclient (OSC)
├── ansible
├── mysql client
├── openstacksdk
└── 各种运维工具
  • 在使用 openstack 的CLI工具前,因为 nova 节点的通信方式基于 http 请求,因此要配置相关环境变量
1
2
3
4
5
6
7
export OS_PROJECT_ID=06923e90488045daa74a41919c6e6501 \
export OS_PROJECT_NAME="admin" \
export OS_USER_DOMAIN_NAME="Default" \
export OS_USERNAME="admin" \
export OS_PASSWORD="password" \
export OS_AUTH_URL=http://162.162.1.100:5000 \
export OS_REGION_NAME="RegionOne"
  • 初始化实例时,可以通过自定义实例数据,借助 cloud-init 初始化密码、扩容根分区、设置主机名、注入公钥、执行自定义脚本等等
  • metadata:一系列字典格式的元数据,用作模板渲染、模块运行等等。
  • userdata:启动实例时用户能够指定的数据(单实例数据)
  • vendordata:云基座传入的数据(全局数据)

常见 userdata 设置

1
2
3
4
5
6
7
8
9
10
11
#cloud-config
users:
- default
- name: root
ssh_pwauth: True
disable_root: 0
ssh_pwauth: 1
chpasswd:
list: |
root:passwd
expire: False

Docker

基础概念

Docker 是一种基于 Linux 内核能力实现的操作系统级虚拟化(OS-level Virtualization)技术,它将应用及其运行环境封装成一个标准化的容器(Container),实现”一次构建,到处运行”。

没有虚拟硬件,没有虚拟BIOS,没有Guest OS,没有Kernel,而是多个进程共享宿主机Linux内核。

只有程序 + 依赖

docker实现原理

  • 进程隔离

一个容器进程本质上是一个运行在沙盒中的隔离进程,由Linux系统本身负责隔离(基于 NamespaceCgroup 机制实现),Docker只是提供了一系列工具,帮助我们设置好隔离环境后,启动这个进程。

  • 文件系统隔离

利用Linux的 mount 机制,给每个隔离进程挂载了一个虚拟的文件系统,再从 Dockerfile 构建

  • 网络协议栈隔离

因为默认情况下隔离网络,所以要将进程端口号映射到宿主机后,才能通过宿主机访问隔离进程

不同的容器间需要通信时,直接指定IP并不是一个好的方式,要使用 docker compose 将服务运行在同一网络命名空间

docker文件系统(重点

  • 整个目录树,就是一个文件系统
1
2
3
4
5
6
7
8
9
10
/
├── bin/
├── etc/
├── home/
├── lib/
├── proc/
├── sys/
├── usr/
├── var/
...
  • docker 通过一组 layer 的引用构建 image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Image1

Layer1 (Ubuntu)

--------------

Image2

Layer1 (Ubuntu)
Layer2 (Python)

--------------

Image3

Layer1 (Ubuntu)
Layer2 (Python)
Layer3 (flask)
  • layer 不是一个压缩包或完整文件系统,而是一个文件系统增量(Filesystem Diff),记录相对于上一层:增加,删除,修改了什么

  • layer 全是只读属性,只有 Writable Layer 可对最上面一层layer可写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Container

──────────────

Writable Layer

──────────────

Layer3

──────────────

Layer2

──────────────

Layer1
  • Docker 在 Linux 上通常使用 OverlayFS 作为存储驱动,通过不断 mount,merge layers

File access by layer

  • 修改文件时: Copy-on-Write(写时复制)机制, copy layer 并在上层创建 writable layer

  • 删除文件时:在上层创建 whiteout file (一般做法:.wh.<filename>),以指示该文件不应再显示在合并层中

  • dockerfile

1
2
3
4
5
6
7
8
9
FROM ubuntu:24.04                   // 指定基础镜像

RUN apt update // 构建镜像时执行命令 (生成新的 layer)

RUN apt install -y python3

COPY app.py /app/ // 复制本地文件

CMD ["python3", "/app/app.py"] // 容器启动时执行命令
  • docker commit

容器创建时

1
2
3
4
5
6
7
      Container

Writable Layer ← 可写
-------------------------
Layer3 ← 只读
Layer2
Layer1

执行 commit 后,docker 会进行 Filesystem Diff,新增 layer 并更新 history,并创建一个新 image

  • 假设有一个b镜像(基础镜像a),c镜像(基础镜像也是a),使用go,把c,a的差异文件提取出来,并支持docker load直接导入差异文件 zn-chen/dockerdiff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DiffExport
|
|
+---- inspect image1
|
+---- inspect image2
|
+---- 找共同layer
|
+---- ImageExport(image2)
| |
| v
| image2目录
|
+---- 修改目录中的layer
|
+---- ImageTar()
|
v
输出tar