轻量级容器优化型 Linux 发行版 Photon OS
Linux Container OS ?
有了一台运行着 ESXi 的 Homelab ,今天就玩一下 Linux container OS ,即 Linux 容器 OS 、容器优化型 OS,这是一类专门针对运行容器定制化开发的 Linux 发行版,裁剪掉一些不必要的软件和内核模块,使系统更加轻量一些。虽然来说民用级的 Intel i5-6600T 性能也不算太差,但和 E3 小王子,E5 老大哥比还是差个十万八千里。因此为了节省一些 CPU 资源,减少虚拟化带来的开销,就选择了容器化运行一些应用,同时再为这些容器找一个轻量级的宿主机 OS ,这就是为什么想要使用 Linux container OS 的原因。
GKE 的 Container-Optimized OS
Kubernetes 的亲爸爸 Google 家的 Google Kubernetes Engine 即 GKE 集群中的每个节点都是使用 Container-Optimized OS 来运行工作负载,不过仅仅是针对 GCE 来进行优化的,可能在 OpenStack 或者 vSphere 上运行不起来。
Container-Optimized OS 是适用于 Compute Engine 虚拟机的操作系统映像,专为运行 Docker 容器而优化。借助 Container-Optimized OS,您可以快速、高效、安全地在 Google Cloud Platform 上启动 Docker 容器。Container-Optimized OS 由 Google 维护,基于 Chromium OS 开放源代码项目。
特点就是不同于其他的 Linux 发行版,这个是基于 Chromium OS 定制化开发的,对内核版本选用的也比较激进,一般是 4.19.112+ 或者 5.x 版本,这样你就不用再担心像 CentOS 7.x 系列那样各种内核 bug 了。
- apiVersion: v1
- items:
- - apiVersion: v1
- kind: Node
- metadata:
- nodeInfo:
- architecture: amd64
- bootID: 0c517083-aaf6-75fc4b2204ba
- containerRuntimeVersion: docker://19.3.1
- kernelVersion: 4.19.112+
- kubeProxyVersion: v1.16.13-gke.1
- kubeletVersion: v1.16.13-gke.1
- machineID: 33a96ff3203d88c0a542
- operatingSystem: linux
- osImage: Container-Optimized OS from Google
- systemUUID: 33a96ff33d88c0a542
Chromium OS 就是 Google 基于 Linux 内核开发的操作系统,所以 Google 也有这个实力针对自家的 GCP 云平台进行定制化开发个 OS 出来,专门给 kubernetes 集群运行使用,定制化开发的好处就是可以带来更多的新特性,二不受制于上游的 Linux 发行版的限制。比如不久前 Google 宣布将使用 Cilium 作为 GKE 的下一代数据面,New GKE Dataplane V2 increases security and visibility for containers ,而 Cilium 这项技术是依赖于对 eBPF 技术,而 eBPF 又依赖于内核特性的支持。
AWS 的 Bottlerocket OS
这个是 AWS 最近开源专门针对 EC2 进行优化的 Linux Container OS,和 GKE 一样,只是针对于自家的 AWS 公有云,由于是最近刚刚推出的,还没来得及关注,所以就不介绍了。同 GKE 的 Container-Optimized OS 一样,一般公有云定制化开发的 Container OS 仅仅只针对自家的云平台。
Optimized performance through AWS integrations
AWS provided builds of Bottlerocket are optimized to run on Amazon EC2 and include support for the latest Amazon EC2 instance capabilities. They also have built-in integrations with AWS services for container orchestration, registries, and observability.
CoreOS Container Linux
来自 CoreOS 团队的 CoreOS Container Linux ,它应该是最古老的 Linux Container OS ,早在 2013 年 10 月就已经 release 第一个版本,那时候的 docker 还没有在 0.x.x 版本。
- Git is now included by default as a number of people use it for shipping around assets, code, etc like a distributed rsync
- Docker is upgraded to 0.6.3
- xz is included to support new compression types
- Custom OEMs can be provided via the cpio on PXE images
它没有像 yum 或 apt 这样的包管理器来安装软件,在 CoreOS 中你不需要安装软件,因为所有的应用程序都要使用 docker 来打包。
- 最小化的操作系统: 占用内存很少,比典型的服务器版本 Linux 少占 40%的内存。
- 易于升级: CoreOS 采用双系统分区(主动分区/被动分区)设计而不是采用传统的通过升级包来升级系统,这使得每次升级更加快速,可靠和易于回滚。这一点有点像 Android 的 A/B 分区?
- 集成 Docker: CoreOS 默认集成 Docker 并作了很好的支持和优化,省去用户安装,配置,优化 Docker 的时间,极大地方便了用户。
- 易于集群化: CoreOS 本身提供了大型 Docker 容器集群的整体解决方案,通过内置的 fleet 工具在多台系统中部署容器并进行集群化管理。同时通过提供 Discovery Service,便于动态部署和管理集群,解决方案比较成熟。
- 自动化的大规模部署: CoreOS 自身提供的解决方案能够自动地大规模批量部署并操作系统,极大地减少用户工作量。
- 使用 systemd 做为系统服务管理工具,性能比较好,systemd 有现代化的日志功能,同时采用 socket 式与 D-Bus 总线式激活服务.
不过 CoreOS 早在今年四月份就已经 EOF 了,Fedora CoreOS 成为 CoreOS 的继任者:
As we’ve previously announced, Fedora CoreOS is the official successor to CoreOS Container Linux. Fedora CoreOS is a new Fedora Edition built specifically for running containerized workloads securely and at scale. It combines the provisioning tools and automatic update model of Container Linux with the packaging technology, OCI support, and SELinux security of Atomic Host. For more on the Fedora CoreOS philosophy, goals, and design, see the announcement of the preview release and the Fedora CoreOS documentation.
红帽的 RHCOS
来自红帽子家的 Red Hat Enterprise Linux CoreOS (RHCOS),是基于不过这个 OS 仅仅适用于它自家的 OpenShift,而且容器运行时仅支持 CRI-O。
At the moment, CRI-O is only available as a container engine within OpenShift Container Platform clusters.
因为 CoreOS 团队现如今已经被 Red Hat® 收购了,正如在 OpenShift 文档 中提到的: Red Hat Enterprise Linux CoreOS (RHCOS) 代表了下一代单用途容器操作系统技术。RHCOS 由创建了 Red Hat Enterprise Linux Atomic Host 和 CoreOS Container Linux 的同一开发团队打造,它将 Red Hat Enterprise Linux (RHEL) 的质量标准与 Container Linux 的自动化远程升级功能结合在一起。
RancherOS
RancherOS 是 Rancher 团队所维护的开源项目,也是对标 CoreOS 一样,专门用来运行容器,并且可以运行在生产环境(至少官方做了这么样的承诺,咱也没在生产用过,不好说。在 RancherOS 中所有的进程(包括系统所有的服务,比如 udev 和 syslog)都是用 docker 来管理,这一点要比 CoreOS 更加激进一些,而 CoreOS 还是使用传统 Linux 发行版中的 systemd 来管理系统中的服务。RancherOS 通过移除传统 Linux 发行版中不必要的服务和库来最小化系统,使他专注单一的功能,即运行 docker 容器。不过之前体验了一番,占用资源比较多?,好像并没有太大的优势( Everything in RancherOS is a Docker container) 感觉这个要比 CoreOS 更加容器化,甚至使用 docker 取代了 systemd 来管理系统的各种服务。系统启动后运行两个 docker 服务进程,一个是系统 docker ,在此之上在运行系统服务容器,和用户层面的 docker 。不过看一下下面的这张图你就会明白。总的来讲 RancherOS 是使用 docker 来管理整个系统的服务的,包括用户层面的 docker 。
VMware 的 Photon OS
今天的主角,VMware 开源的 Photon OS,这个 OS 你可能没听说过,但 VMware 开源的 Harbor 想必很熟悉,而 Harbor 的基础镜像使用的就是他家的 Photon OS?。
- root [ /harbor ]# cat /etc/os-release
- NAME="VMware Photon OS"
- VERSION="2.0"
- ID=photon
- VERSION_ID=2.0
- PRETTY_NAME="VMware Photon OS/Linux"
- ANSI_COLOR="1;34"
- HOME_URL="https://vmware.github.io/photon/"
- BUG_REPORT_URL="https://github.com/vmware/photon/issues"
- targetList = {
- "image":["iso", "ami", "gce", "azure", "rpi3", "ova", "ova_uefi", "all", "src-iso",
- "photon-docker-image", "k8s-docker-images", "all-images", "minimal-iso", "rt-iso"],
- "rpmBuild": ["packages", "packages-minimal", "packages-initrd", "packages-docker",
- "updated-packages", "tool-chain-stage1", "tool-chain-stage2", "check",
- "ostree-repo", "generate-yaml-files", "create-repo", "distributed-build"],
- "buildEnvironment": ["packages-cached", "sources", "sources-cached", "publish-rpms",
- "publish-x-rpms", "publish-rpms-cached", "publish-x-rpms-cached", "photon-stage"]
对比
Providers | Name | STAR | FORK |
---|---|---|---|
Container-Optimized OS | – | – | |
Amazon | Bottlerocket OS | 4.8K | 185 |
CoreOS | CoreOS Container Linux | – | – |
Red Hat | RHCOS | – | – |
Rancher | Rancher OS | 6k | 625 |
Flatcar | Flatcar Linux | 117 | 3 |
VMware | Photon OS | 2.1k | 591 |
Providers | Name | Runtime | Support Platform |
---|---|---|---|
Container-Optimized OS | docker | GCP | |
Amazon | Bottlerocket OS | docker | AWS |
CoreOS | CoreOS Container Linux | docker | AWS/GCP/OpenStack/VMware Alibaba Cloud/Azure/DigitalOcean |
Red Hat | RHCOS | CRI-O | AWS/vSphere/Bare Metal |
Rancher | Rancher OS | docker | AWS/GCP/OpenStack/VMware Alibaba Cloud/Azure/DigitalOcean |
Flatcar | Flatcar Linux | docker | AWS/GCP/OpenStack/VMware Alibaba Cloud/Azure/DigitalOcean |
VMware | Photon OS | docker | AWS/GCE/Azure/OpenStack vSphere/bare metal/Raspberry Pi 3 |
目前来讲 Photon OS 作为 Harbor 的基础镜像,在容器方面比较突出一些,但作为容器的宿主机 OS ,还有很长的路要走。由于我是使用的 VMware 家的 ESXi 虚拟化,那么选择他家的 Photon OS 是最好的喽,而且 Photon OS 是针对 ESXi 做过优化的,内核都是针对 ESXi 虚拟化进行了定制化的开发,所以理论上选择 Photon OS 应该是最合适的。
安装
Download Format
Format | Description |
---|---|
ISO Image | Contains everything needed to install either the minimal or full installation of Photon OS. The bootable ISO has a manual installer or can be used with PXE/kickstart environments for automated installations. |
OVA | Pre-installed minimal environment, customized for VMware hypervisor environments. These customizations include a highly sanitized and optimized kernel to give improved boot and runtime performance for containers and Linux applications. Since an OVA is a complete virtual machine definition, we’ve made available a Photon OS OVA that has virtual hardware version 11; this will allow for compatibility with several versions of VMware platforms or allow for the latest and greatest virtual hardware enhancements. |
Amazon AMI | Pre-packaged and tested version of Photon OS made ready to deploy in your Amazon EC2 cloud environment. Previously, we’d published documentation on how to create an Amazon compatible instance, but, now we’ve done the work for you. |
Google GCE Image | Pre-packaged and tested Google GCE image that is ready to deploy in your Google Compute Engine Environment, with all modifications and package requirements for running Photon OS in GCE. |
Azure VHD | Pre-packaged and tested Azure HD image that is ready to deploy in your Microsoft Azure Cloud, with all modifications and package requirements for running Photon OS in Azure. |
Raspberry Pi3 Image | Pre-packaged and tested Raspberry Pi3 Image (Version 3.0 onwards) on ARM64 architecture. |
Photon OS 提供了多种安装方式,其中 ISO 是通用性的,就和安装其他 Linux 发行版的过程差不多,OVA 是虚拟机模板,可以导入到 VMware 虚拟化平台上使用,省区安装的步骤,比较方便。OVA 虚拟机模板的版本为 11 ,根据 Virtual machine hardware versions 中的定义,需要 ESXi 6.0 Fusion 7.x Workstation 11.x Player 7.x 版本以上的虚拟化支持。
Virtual Hardware Version | Products |
---|---|
18 | ESXi 7.0.1 |
17 | ESXi 7.0.0 |
16 | Fusion 11.x Workstation Pro 15.x Workstation Player 15.x |
15 | VMware Cloud on AWS ESXi 6.7 U2 |
14 | ESXi 6.7 Fusion 10.x Workstation Pro 14.x Workstation Player 14.x |
13 | ESXi 6.5 |
12 | Fusion 8.x Workstation Pro 12.x Workstation Player 12.x |
11 | ESXi 6.0 Fusion 7.x Workstation 11.x Player 7.x |
10 | ESXi 5.5 Fusion 6.x Workstation 10.x Player 6.x |
另外还支持 Raspberry Pi 3
,不过需要拿源码自行编译镜像,然后刷到树莓派上,你吃灰的树莓派又有用途啦?。
下载方式 ?
Photon OS 3.0 Revision 2 Update3 Binaries
Aug 14, 2020 An update to 3.0 revision 2 Update3 binaries are now available.
Download | Size | md5 checksum |
---|---|---|
Full ISO x86_64 | 5.2G | 2dd9f18c5162a7367f2463f4a9bb4890 |
Minimal ISO x86_64 | 299M | 0119f0f275f246fd382d419ff41898a4 |
ISO x86_64 Real-Time flavour | 489M | d2bfce95b54a29174b5beaef9962dbc1 |
OVA-hw11 | 188M | ba52abd88c5b22cd4498cf0e88457f28 |
OVA-hw13_uefi | 214M | 95614f3b08c1a93306ababcc826572df |
在此使用 OVA-hw11 格式的 OVA 虚拟机模板,后面那个带 uefi 的需要设置虚拟机为 EFI 模式启动,比较麻烦。
- 创建虚拟机的时候使用 OVA 文件导入
- 默认的用户名为 root ,密码为 changeme ,登录之后再输入一遍 changeme ,然后修改为新的密码。
系统信息
- 内核版本为 4.19.132-5.ph3-esx ,4.19 是个 LTS 版本的内核,结尾的 esx 则代表着为 ESXi 虚拟化定制的内核。
- Linux photon-machine 4.19.132-5.ph3-esx #1-photon SMP Wed Aug 12 21:02:13 UTC 2020 x86_64 GNU/Linux
- rpm 包数量仅仅为 146 个,一般的 CentOS 发行版自带的 rpm 包数量为 300 个左右。
- root@photon-machine [ ~ ]# rpm -qa | wc
- 146 146 4307
- 系统进程信息,还是采用 systemd 来管理进程
- root@photon-machine [ ~ ]# systemctl status
- ● photon-machine
- State: running
- Jobs: 0 queued
- Failed: 0 units
- Since: Tue 2020-09-22 08:07:29 UTC; 10min ago
- CGroup: /
- ├─user.slice
- │ ├─session-c2.scope
- │ │ ├─413 sshd: root@pts/0
- │ │ ├─420 -bash
- │ │ ├─443 systemctl status
- │ │ └─444 systemctl status
- │ └─user@0.service
- │ └─init.scope
- │ ├─393 /lib/systemd/systemd --user
- │ └─394 (sd-pam)
- ├─init.scope
- │ └─1 /lib/systemd/systemd
- └─system.slice
- ├─systemd-networkd.service
- │ └─245 /lib/systemd/systemd-networkd
- ├─systemd-udevd.service
- │ └─124 /lib/systemd/systemd-udevd
- ├─vgauthd.service
- │ └─159 /usr/bin/VGAuthService -s
- ├─systemd-journald.service
- │ └─97 /lib/systemd/systemd-journald
- ├─sshd.service
- │ └─352 /usr/sbin/sshd -D
- ├─vmtoolsd.service
- │ └─161 /usr/bin/vmtoolsd
- ├─systemd-resolved.service
- │ └─247 /lib/systemd/systemd-resolved
- ├─dbus.service
- │ └─157 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only ├─systemd-timesyncd.service │ └─151 /lib/systemd/systemd-timesyncd └─systemd-logind.service └─158 /lib/systemd/systemd-logind
- 磁盘根目录只使用了不到 600M
- root@photon-machine [ ~ ]# df -h Filesystem
- Size Used Avail Use% Mounted on /dev/root
- 16G 577M 15G 4% /
- 内存也只使用了 43M,启动 dockerd 之后内存占用 108M,换成 containerd 将会小一些。
- root@photon-machine [ ~ ]# free -h
- total used free shared buff/cache available Mem:
- 2.0Gi 43Mi 1.8Gi 0.0Ki 103Mi 1.8Gi
- # 启动 dockerd 守护进程之后内存占用 108Mi
- root@photon-machine [ ~ ]# free -h
- total used free shared buff/cache available Mem:
- 2.0Gi 108Mi 1.6Gi 0.0Ki 298Mi 1.8Gi
- 内核模块的数量也比较少 30 个左右,大部分都是一些网络相关的内核模块。常规的 Linux 发行版的内核模块往往在 60 个以上。
- 系统自带的 docker 版本为 19.03.10 ,存储驱动使用的是 overlay2
系统管理
网络管理
- 查看网卡状态,可使用自带的 networkctl 令行工具,像 ifconfig、ip、ss 等命令都已经默认安装。
- 系统安装时默认使用的 DHCP 获取 IP ,可以使用 systemd 来设置静态 IP
- # 首先修改 DHCP 的 systemd 文件,关闭 DHCP
- sed -i 's/yes/no/' /etc/systemd/network/99-dhcp-en.network
- # 创建静态 IP 的 systemd 文件
- cat > /etc/systemd/network/10-static-en.network << "EOF"
- [Match]
- Name=eth0
- [Network]
- Address=198.168.0.235/24
- Gateway=198.168.0.1
- DNS=192.168.0.100
- EOF
- # 修改以下文件权限为 644 ,不然启动的时候会报错提示权限问题
- chmod 644 /etc/systemd/network/10-static-en.network
- # 重启一下网络 systemctl restart systemd-networkd
- 挂载 NFS 文件系统需要安装 nfs-utils
- tdnf install nfs-utils -y
- mount 192.168.0.100:/nfs /mnt/nfs
包管理
Photon OS 使用的是 yum/tdnf 作为包管理器,使用方法和 RedHat 系的发行版基本相同,repo 主要有以下几个:
- ls /etc/yum.repos.d/
- lightwave.repo
- photon-extras.repo
- photon-iso.repo
- photon-updates.repo
- photon.repo
源码编译
运行容器
Pi-hole
Pi-hole 是一款开源且免费的 DNS 沉洞服务器(DNS sinkhole),能够在不安装任何客户端侧软件的前提下为设备提供网络内容屏蔽服务,非常轻量易用。搭配上家中吃灰已久的树莓派,我们就能够轻松打造属于自己的广告屏蔽助手。
在官网的介绍中,Pi-hole 主要具有以下优点:
- 易于安装和配置(号称 10 分钟安装配置一条龙)。
- 全平台,广告屏蔽服务可作用于任何设备,包括PC、手机、平板电脑。
- 轻量,对硬件要求极低。
- 功能稳定且强大,能轻松 hold 住百万级别的请求。
- 提供了美观的 Web 数据监控仪表盘。
- 开源且免费。
- 首先需要关闭 systemd 自带的 DNS 服务,不然 Pi-hole 坚挺的 53 端口会被占用
- systemctl stop systemd-resolved
- systemctl disable systemd-resolved
- 安装 docker-compose,修改 docker-compose.yaml 文件
- # More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
- services:
- pihole:
- container_name: pihole
- image: pihole/pihole:latest
- # For DHCP it is recommended to remove these ports and instead add: network_mode: "host"
- ports:
- - "53:53/tcp"
- - "53:53/udp"
- - "67:67/udp" # Only required if you are using Pi-hole as your DHCP server
- - "80:80/tcp"
- environment:
- TZ: 'America/Chicago'
- # WEBPASSWORD: 'set a secure password here or it will be random'
- # Volumes store your data between container upgrades
- volumes:
- - './etc-pihole:/etc/pihole'
- - './etc-dnsmasq.d:/etc/dnsmasq.d'
- # https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
- cap_add:
- - NET_ADMIN # Required if you are using Pi-hole as your DHCP server, else not needed
- restart: unless-stopped
- docker-compose up 走起!
如果想要让内网的机器都走 Pi-hole 来进行 DNS ,可以将路由器的 DHCP 的 DNS 的 IP 设置为 Pi-hole 的 IP。