Fedora CoreOS 入門
現(xiàn)在被稱為 DevOps 時(shí)代,操作系統(tǒng)的關(guān)注度似乎比工具要低一些。然而,這并不意味著操作系統(tǒng)沒(méi)有創(chuàng)新。(編輯注:基于 Linux 內(nèi)核的眾多發(fā)行版所提供的多樣化產(chǎn)品就是一個(gè)很好的例子)。Fedora CoreOS 就對(duì)這個(gè) DevOps 時(shí)代的操作系統(tǒng)應(yīng)該是什么樣有著獨(dú)特的理念。
Fedora CoreOS 的理念
Fedora CoreOS(FCOS)是由 CoreOS Container Linux 和 Fedora Atomic Host 合并而來(lái)。它是一個(gè)專注于運(yùn)行容器化應(yīng)用程序的精簡(jiǎn)的獨(dú)體操作系統(tǒng)。安全性是首要重點(diǎn),F(xiàn)COS 提供了自動(dòng)更新,并帶有 SELinux 強(qiáng)化。
為了使自動(dòng)更新能夠很好地工作,它們需要非常健壯,目標(biāo)是運(yùn)行 FCOS 的服務(wù)器在更新后不會(huì)崩潰。這是通過(guò)使用不同的發(fā)布流(stable、testing 和 next)來(lái)實(shí)現(xiàn)的。每個(gè)流每 2 周發(fā)布一次,更新內(nèi)容會(huì)從一個(gè)流推廣到另一個(gè)流(next -> testing -> stable)。這樣落地在 stable 流中的更新就有機(jī)會(huì)經(jīng)過(guò)長(zhǎng)時(shí)間的測(cè)試。
入門
對(duì)于這個(gè)例子,讓我們使用 stable 流和一個(gè) QEMU 基礎(chǔ)鏡像,我們可以作為一個(gè)虛擬機(jī)運(yùn)行。你可以使用 coreos-installer 來(lái)下載該鏡像。
在你的(Workstation)終端上,更新鏡像的鏈接后,運(yùn)行以下命令(編輯注:在 Silverblue 上,基于容器的 coreos 工具是最簡(jiǎn)單的方法,可以嘗試一下。說(shuō)明可以在 https://docs.fedoraproject.org/en-US/fedora-coreos/tutorial-setup/ 中找到,特別是 “Setup with Podman or Docker” 一節(jié)。):
$ sudo dnf install coreos-installer
$ coreos-installer download --image-url https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/32.20200907.3.0/x86_64/fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2.xz
$ xz -d fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2.xz
$ ls
fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2
創(chuàng)建一個(gè)配置
要定制一個(gè) FCOS 系統(tǒng),你需要提供一個(gè)配置文件,Ignition 將使用這個(gè)文件來(lái)配置系統(tǒng)。你可以用這個(gè)文件來(lái)配置諸如創(chuàng)建用戶、添加受信任的 SSH 密鑰、啟用 systemd 服務(wù)等等。
以下配置創(chuàng)建了一個(gè) core
用戶,并在 authorized_keys
文件中添加了一個(gè) SSH 密鑰。它還創(chuàng)建了一個(gè) systemd 服務(wù),使用 podman 來(lái)運(yùn)行一個(gè)簡(jiǎn)單的 “hello world” 容器:
version: "1.0.0"
variant: fcos
passwd:
users:
- name: core
ssh_authorized_keys:
- ssh-ed25519 my_public_ssh_key_hash fcos_key
systemd:
units:
-
contents: |
[Unit]
Description=Run a hello world web service
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/bin/podman run --pull=always --name=hello --net=host -p 8080:8080 quay.io/cverna/hello
ExecStop=/bin/podman rm -f hello
[Install]
WantedBy=multi-user.target
enabled: true
name: hello.service
在配置中加入你的 SSH 密鑰后,將其保存為 config.yaml
。接下來(lái)使用 Fedora CoreOS Config Transpiler(fcct
)工具將這個(gè) YAML 配置轉(zhuǎn)換成有效的 Ignition 配置(JSON 格式)。
直接從 Fedora 的資源庫(kù)中安裝 fcct
,或者從 GitHub 中獲取二進(jìn)制文件:
$ sudo dnf install fcct
$ fcct -output config.ign config.yaml
安裝并運(yùn)行 Fedora CoreOS
要運(yùn)行鏡像,你可以使用 libvirt 堆棧。要在 Fedora 系統(tǒng)上使用 dnf
軟件包管理器安裝它:
$ sudo dnf install @virtualization
現(xiàn)在讓我們創(chuàng)建并運(yùn)行一個(gè) Fedora CoreOS 虛擬機(jī):
$ chcon --verbose unconfined_u:object_r:svirt_home_t:s0 config.ign
$ virt-install --name=fcos \
--vcpus=2 \
--ram=2048 \
--import \
--network=bridge=virbr0 \
--graphics=none \
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/config.ign" \
--disk=size=20,backing_store=${PWD}/fedora-coreos-32.20200907.3.0-qemu.x86_64.qcow2
安裝成功后,會(huì)顯示一些信息并提供登錄提示符:
Fedora CoreOS 32.20200907.3.0
Kernel 5.8.10-200.fc32.x86_64 on an x86_64 (ttyS0)
SSH host key: SHA256:BJYN7AQZrwKZ7ZF8fWSI9YRhI++KMyeJeDVOE6rQ27U (ED25519)
SSH host key: SHA256:W3wfZp7EGkLuM3z4cy1ZJSMFLntYyW1kqAqKkxyuZrE (ECDSA)
SSH host key: SHA256:gb7/4Qo5aYhEjgoDZbrm8t1D0msgGYsQ0xhW5BAuZz0 (RSA)
ens2: 192.168.122.237 fe80::5054:ff:fef7:1a73
Ignition: user provided config was applied
Ignition: wrote ssh authorized keys file for user: core
Ignition 配置文件沒(méi)有為 core
用戶提供任何密碼,因此無(wú)法通過(guò)控制臺(tái)直接登錄。(不過(guò),也可以通過(guò) Ignition 配置為用戶配置密碼。)
使用 Ctrl + ]
組合鍵退出虛擬機(jī)的控制臺(tái)。然后檢查 hello.service
是否在運(yùn)行:
$ curl http://192.168.122.237:8080
Hello from Fedora CoreOS!
使用預(yù)先配置的 SSH 密鑰,你還可以訪問(wèn)虛擬機(jī)并檢查其上運(yùn)行的服務(wù):
$ ssh core@192.168.122.237
$ systemctl status hello
● hello.service - Run a hello world web service
Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-10-28 10:10:26 UTC; 42s ago
zincati、rpm-ostree 和自動(dòng)更新
zincati 服務(wù)使用自動(dòng)更新驅(qū)動(dòng) rpm-ostreed。
檢查虛擬機(jī)上當(dāng)前運(yùn)行的 Fedora CoreOS 版本,并檢查 zincati 是否找到了更新:
$ ssh core@192.168.122.237
$ rpm-ostree status
State: idle
Deployments:
● ostree://fedora:fedora/x86_64/coreos/stable
Version: 32.20200907.3.0 (2020-09-23T08:16:31Z)
Commit: b53de8b03134c5e6b683b5ea471888e9e1b193781794f01b9ed5865b57f35d57
GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0
$ systemctl status zincati
● zincati.service - Zincati Update Agent
Loaded: loaded (/usr/lib/systemd/system/zincati.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-10-28 13:36:23 UTC; 7s ago
…
Oct 28 13:36:24 cosa-devsh zincati[1013]: [INFO ] initialization complete, auto-updates logic enabled
Oct 28 13:36:25 cosa-devsh zincati[1013]: [INFO ] target release '32.20201004.3.0' selected, proceeding to stage it
... zincati reboot ...
重啟后,我們?cè)龠h(yuǎn)程登錄一次,檢查新版的 Fedora CoreOS:
$ ssh core@192.168.122.237
$ rpm-ostree status
State: idle
Deployments:
● ostree://fedora:fedora/x86_64/coreos/stable
Version: 32.20201004.3.0 (2020-10-19T17:12:33Z)
Commit: 64bb377ae7e6949c26cfe819f3f0bd517596d461e437f2f6e9f1f3c24376fd30
GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0
ostree://fedora:fedora/x86_64/coreos/stable
Version: 32.20200907.3.0 (2020-09-23T08:16:31Z)
Commit: b53de8b03134c5e6b683b5ea471888e9e1b193781794f01b9ed5865b57f35d57
GPGSignature: Valid signature by 97A1AE57C3A2372CCA3A4ABA6C13026D12C944D0
rpm-ostree status
現(xiàn)在顯示了兩個(gè)版本的 Fedora CoreOS,一個(gè)是 QEMU 鏡像中的版本,一個(gè)是更新后的最新版本。有了這兩個(gè)版本,就可以使用 rpm-ostree rollback
命令回滾到之前的版本。
最后,你可以確保 hello 服務(wù)仍在運(yùn)行并提供內(nèi)容:
$ curl http://192.168.122.237:8080
Hello from Fedora CoreOS!
更多信息參見(jiàn):Fedora CoreOS 更新。
刪除虛擬機(jī)
要進(jìn)行事后清理,使用以下命令刪除虛擬機(jī)和相關(guān)存儲(chǔ):
$ virsh destroy fcos
$ virsh undefine --remove-all-storage fcos
結(jié)論
Fedora CoreOS 為在容器中運(yùn)行應(yīng)用程序提供了一個(gè)堅(jiān)實(shí)而安全的操作系統(tǒng)。它在推薦主機(jī)使用聲明式配置文件進(jìn)行配置的 DevOps 環(huán)境中表現(xiàn)出色。自動(dòng)更新和回滾到以前版本的操作系統(tǒng)的能力,可以在服務(wù)的運(yùn)行過(guò)程中帶來(lái)安心的感覺(jué)。
通過(guò)關(guān)注項(xiàng)目文檔中的教程,了解更多關(guān)于 Fedora CoreOS 的信息。