docs(upgrade): 列出安装器对下载物的校验与离线导入 registry 镜像的做法

This commit is contained in:
Lemon-miaow committed 2026-09-24 23:39:39 +08:00
1 parent 3ad817eeff
commit 07eb682358
1 file changed
+28 -1
+28 -1
View File
@@ -724,6 +724,16 @@ control namespace (or `--registry-namespace`):
its gate runs) cannot be pulled from the registry they make up, so the installer its gate runs) cannot be pulled from the registry they make up, so the installer
labels both `io.cri-containerd.pinned=pinned` in containerd and kubelet's image labels both `io.cri-containerd.pinned=pinned` in containerd and kubelet's image
GC never collects them. Check with `k3s ctr images ls | grep pinned`. GC never collects them. Check with `k3s ctr images ls | grep pinned`.
- **The registry image is pinned by digest**
(`docker.io/library/registry:2.8.3@sha256:a3d8aaa6…`), and the installer
caches it with `k3s crictl pull`. On an air-gapped node, carry it over with
containerd's own export, which keeps the digest ref. On a connected machine
with k3s or containerd (`R` is the full `docker.io/library/registry@sha256:…`
ref from `internal/platform/identities.go`):
`ctr images pull --all-platforms $R && ctr images export --all-platforms
registry.tar $R`; on the node: `k3s ctr images import --all-platforms
registry.tar`, then re-run the installer to pin it. A `docker save` round trip
rewrites the manifest, and kubelet will not match it to the digest.
- **Selector quirk worth knowing:** the registry Service selector is only - **Selector quirk worth knowing:** the registry Service selector is only
`name + component=registry` — it deliberately lacks the `name + component=registry` — it deliberately lacks the
`part-of=felis-control-plane` label, so the registry is *invisible* to the `part-of=felis-control-plane` label, so the registry is *invisible* to the
@@ -1290,7 +1300,9 @@ annotated Service endpoints picks them up as is.
There is no in-place updater: an upgrade is re-running the installer There is no in-place updater: an upgrade is re-running the installer
(`curl -fsSL <installer URL> | sudo bash`), which rebuilds/re-imports the image (`curl -fsSL <installer URL> | sudo bash`), which rebuilds/re-imports the image
and re-applies the bundle. (`sudo felis setup` is not this path; on a completed and re-applies the bundle. `felis update --panel` prints that command with the
script read at the newest release's tag, so the installer and the binary it
downloads come from the same release. (`sudo felis setup` is not this path; on a completed
install it only opens the config console.) The channel is not persisted across install it only opens the config console.) The channel is not persisted across
the re-run, so pass `FELIS_VERSION_BOOTSTRAP=dev` on a host that tracks main. the re-run, so pass `FELIS_VERSION_BOOTSTRAP=dev` on a host that tracks main.
Two properties of the control plane matter when you do: Two properties of the control plane matter when you do:
@@ -1303,6 +1315,21 @@ Two properties of the control plane matter when you do:
wait fails after 180s and prints `kubectl describe` diagnostics: you see wait fails after 180s and prints `kubectl describe` diagnostics: you see
`ErrImagePull`/`ImagePullBackOff` there instead of a silent hang. `ErrImagePull`/`ImagePullBackOff` there instead of a silent hang.
**What the installer checks before it runs anything it downloaded:**
| Download | Check |
|---|---|
| `felis-linux-<arch>` (release channel) | its sha256 must match the release's `SHA256SUMS`; a release without one, or a mismatch, is compiled from the same tag instead |
| k3s (fresh install only) | the install script is read at `FELIS_K3S_VERSION`'s tag (default `v1.36.4+k3s1`), and it checks the binary against that release's sha256 list |
| cloudflared (when absent) | release `FELIS_CLOUDFLARED_VERSION` (default `2026.9.1`) against a pinned sha256; another version needs `FELIS_CLOUDFLARED_SHA256` |
| Go toolchain (nano, source builds) | pinned sha256 per architecture; another version needs `FELIS_GO_SHA256` |
| the registry image | pinned by digest (`registry:2.8.3@sha256:a3d8…`) |
On a public repository each release also carries a signed build-provenance
attestation. Check a downloaded binary with
`gh attestation verify felis-linux-amd64 --repo FelisMC/Felis`; it names the
workflow run and commit that built it.
Roll back with: Roll back with:
``` ```