4. 环境准备:安装 Cosign CLI、配置容器运行时与搭建 Kubernetes 集群
本章是课程实验环境的基石。你将依次完成三个核心组件的安装与配置:Cosign CLI(签名工具)、容器运行时(Docker / containerd 对 Cosign 的密钥与镜像访问支持)、以及一个本地 Kubernetes 集群(Minikube 或 Kind)。只有这三层就绪,后续的镜像签名、策略验证和故障排查才能真实落地。
版本对齐建议:本课程所有实验基于 Cosign v2.x、Kubernetes 1.28+、containerd 1.7+。请确保你的操作系统为 Linux(推荐 Ubuntu 22.04 / 24.04)或 macOS(ARM64 / x86_64)。Windows 用户建议通过 WSL2 运行。
4.1 安装 Cosign CLI
Cosign 是 Sigstore 项目下的镜像签名与验证工具。它支持密钥对模式(本地生成或云 KMS)以及无密钥模式(Keyless,通过 OIDC 身份绑定)。本课程以密钥对模式为主,Keyless 模式在进阶章节演示。
4.1.1 安装方式对比
| 方式 | 命令 / 步骤 | 适用场景 |
|---|---|---|
| 官方二进制(推荐) | curl -O -L https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 && chmod +x cosign-linux-amd64 && sudo mv cosign-linux-amd64 /usr/local/bin/cosign |
CI/CD、生产环境、离线环境 |
| Homebrew(macOS / Linux) | brew install cosign |
本地开发、快速体验 |
| Go Install | go install github.com/sigstore/cosign/v2/cmd/cosign@latest |
需要源码级调试或自定义编译 |
4.1.2 验证安装
cosign version
输出应包含 GitVersion、GitCommit 和 Platform 信息。若出现 command not found,请检查 /usr/local/bin 是否在 $PATH 中。
4.1.3 生成密钥对(实验用)
cosign generate-key-pair
该命令会在当前目录生成两个文件:
- cosign.key —— 私钥,必须妥善保管,不可提交到代码仓库。
- cosign.pub —— 公钥,用于后续验证签名,可公开分发。
安全提醒:cosign.key 默认未加密。生产环境请使用
cosign generate-key-pair --kms 对接云 KMS(如 AWS KMS、GCP KMS、Azure Key Vault)或硬件安全模块。
4.2 配置容器运行时:Docker 与 containerd
Cosign 签名和验证操作需要访问容器镜像仓库。容器运行时(Docker 或 containerd)的配置直接影响 Cosign 能否正确拉取、推送和缓存镜像。以下分别说明两种运行时的关键配置点。
4.2.1 Docker 配置要点
- 认证配置:Cosign 默认使用 Docker 的
~/.docker/config.json进行仓库认证。确保已执行docker login <registry>。 - 镜像拉取策略:Cosign 验证签名时需要从仓库拉取镜像的 manifest 和签名对象。Docker 守护进程的
max-concurrent-downloads参数建议保持默认(3),避免并发过高导致仓库限流。 - 实验推荐:使用本地 Registry(
docker run -d -p 5000:5000 --name registry registry:2)进行签名练习,避免网络延迟和仓库权限干扰。
4.2.2 containerd 配置要点
Kubernetes 1.24+ 默认使用 containerd 作为容器运行时。Cosign 在 containerd 环境下通常通过 crictl 或直接调用 containerd 的 gRPC 接口操作镜像,但签名/验证本身不依赖 containerd 配置。需要关注的是:
- 镜像仓库证书:若使用自签名仓库,需将 CA 证书添加到
/etc/containerd/certs.d/<registry>/目录下,并配置hosts.toml。 - Snapshotter 兼容性:Cosign 验证签名时需读取镜像层数据。overlayfs 是默认且兼容性最好的 snapshotter。
4.2.3 容器运行时与 Cosign 交互示意
4.3 安装 Kubernetes 集群:Minikube 与 Kind
本地集群是测试 Cosign 策略与 Admission Controller 的最佳环境。Minikube 和 Kind 各有侧重,选择取决于你的实验目标。
4.3.1 方案对比
| 特性 | Minikube | Kind (Kubernetes in Docker) |
|---|---|---|
| 底层技术 | 虚拟机(默认)或 Docker | Docker 容器作为节点 |
| 启动速度 | 较慢(需创建 VM) | 快(秒级启动) |
| 多节点支持 | 支持(需指定 driver) | 原生支持(通过配置文件) |
| CNI 插件 | 内置 Calico / Flannel 等 | 需手动安装 |
| 持久化存储 | 支持 CSI 驱动 | 有限支持(hostPath 为主) |
| 本课程推荐 | 入门、单节点、快速验证 | 多节点、策略测试、CI 集成 |
4.3.2 安装 Minikube(推荐用于本章实验)
# 安装 Minikube 二进制
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动集群(使用 Docker driver,默认)
minikube start --driver=docker --kubernetes-version=v1.28.3
# 验证集群状态
kubectl get nodes
minikube status
关键参数说明:
--driver=docker:在已有 Docker 环境中运行,避免嵌套虚拟化问题。--kubernetes-version:指定版本以确保与 Cosign 和 OPA/Gatekeeper 的兼容性。--cni=calico(可选):如需测试网络策略,建议启用 CNI。
4.3.3 安装 Kind(备选方案)
# 安装 Kind 二进制
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 创建多节点集群配置文件 kind-config.yaml
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
# 启动集群
kind create cluster --config kind-config.yaml --name cosign-lab
# 验证
kubectl cluster-info --context kind-cosign-lab
4.3.4 集群就绪后的验证清单
无论使用 Minikube 还是 Kind,启动后请执行以下检查:
- 节点状态:
kubectl get nodes—— 所有节点应为Ready。 - 核心组件:
kubectl get pods -n kube-system—— coredns、kube-proxy 等应处于 Running 状态。 - 容器运行时:
kubectl get nodes -o wide—— 查看CONTAINER-RUNTIME列,确认是containerd://或docker://。 - 镜像拉取测试:
kubectl run test --image=nginx:alpine --restart=Never—— 确认 Pod 能正常启动。
4.4 环境就绪总览
4.5 常见安装故障与快速排查
| 现象 | 可能原因 | 解决措施 |
|---|---|---|
cosign: command not found |
二进制未放入 PATH 或权限不足 |
检查 /usr/local/bin 是否存在,执行 sudo mv 并 chmod +x |
minikube start 卡在 Downloading |
网络限速或镜像源不可达 | 使用 --image-mirror-country=cn 或设置代理 HTTP_PROXY |
kind create cluster 超时 |
Docker 资源不足或镜像拉取慢 | 增加 Docker 资源(CPU/内存),或手动 docker pull kindest/node |
kubectl get nodes 显示 NotReady |
CNI 未安装或容器运行时异常 | 安装 Calico/Flannel,或检查 crictl ps 确认 containerd 运行 |
Cosign 签名时报 no auth |
未登录镜像仓库或 Docker config 缺失 | 执行 docker login,或手动创建 ~/.docker/config.json |
最佳实践:建议在干净的虚拟机或容器环境中按顺序安装:Docker → Cosign → Minikube/Kind。每完成一步都执行验证命令,避免问题堆积。