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 交互示意

Cosign 与容器运行时交互流程 Cosign CLI Docker Engine containerd 镜像仓库 (Registry) cosign.key / .pub 说明:Cosign 通过 Docker config.json 或 containerd 的 hosts.toml 获取仓库认证信息。 签名操作不直接修改容器运行时状态,但验证时需要运行时能正确拉取镜像 manifest。

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,启动后请执行以下检查:

  1. 节点状态:kubectl get nodes —— 所有节点应为 Ready。
  2. 核心组件:kubectl get pods -n kube-system —— coredns、kube-proxy 等应处于 Running 状态。
  3. 容器运行时:kubectl get nodes -o wide —— 查看 CONTAINER-RUNTIME 列,确认是 containerd:// 或 docker://。
  4. 镜像拉取测试:kubectl run test --image=nginx:alpine --restart=Never —— 确认 Pod 能正常启动。

4.4 环境就绪总览

实验环境拓扑总览 开发 / 控制节点 Cosign CLI v2.x Docker Engine cosign.key / .pub Kubernetes 集群(Minikube / Kind) Control Plane kube-apiserver / etcd Worker Node 1 containerd / kubelet Worker Node 2 containerd / kubelet 镜像仓库 (Registry) 本地 :5000 或远程 所有组件安装完成后,请执行 4.3.4 节的验证清单,确保集群与 Cosign 可正常通信。

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。每完成一步都执行验证命令,避免问题堆积。