3. 环境准备:安装 Cosign CLI、配置 OIDC 身份提供商、搭建本地 K8s 集群

本章是整门课程的实践起点。在完成 Sigstore 理论体系学习后,你需要一个可操作的本地环境来验证镜像签名、身份认证与 K8s 准入控制的全链路。我们将依次完成三个核心组件的安装与配置:Cosign CLI(签名工具)、OIDC 身份提供商(身份源)、本地 K8s 集群(运行环境)。

环境兼容性提示:本课程所有操作在 macOS 12+ / Ubuntu 22.04 / Windows WSL2 上均验证通过。Cosign v2.x 要求 Go 1.19+,建议使用最新稳定版。

3.1 安装 Cosign CLI

Cosign 是 Sigstore 项目提供的命令行工具,用于对容器镜像进行签名、验证和存储。它直接与 Fulcio(证书颁发机构)和 Rekor(透明日志)交互,是实现镜像身份认证的核心客户端。

3.1.1 安装方式对比

安装方式 适用平台 命令示例 备注
Homebrew macOS / Linux brew install cosign 推荐 macOS 用户
Go Install 跨平台 go install github.com/sigstore/cosign/v2/cmd/cosign@latest 需预装 Go 1.19+
二进制下载 Linux / Windows wget https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 手动放置到 PATH
Docker 镜像 所有平台 docker run --rm gcr.io/projectsigstore/cosign version 适合 CI/CD 临时使用

3.1.2 验证安装

安装完成后,执行以下命令确认版本与可用性:

cosign version

# 输出示例(版本号可能不同):
#  ______   ______        _______. __    _______ .__   __.
# /      | /  __  \      /       ||  |  /  _____||  \ |  |
# |  ,----'|  |  |  |    |   (----`|  | |  |  __  |   \|  |
# |  |     |  |  |  |     \   \    |  | |  | |_ | |  . `  |
# |  `----.|  `--'  | .----)   |   |  | |  |__| | |  |\   |
#  \______| \______/  |_______/    |__|  \______| |__| \__|
# cosign: 2.2.3
# git commit: 9b1f8c7a8b9c1d2e3f4a5b6c7d8e9f0a1b2c3d4
关键检查点:确保输出中包含 cosign 字样和版本号。如果出现 command not found,请检查 PATH 是否包含安装目录,或使用路径执行。

3.2 配置 OIDC 身份提供商

Sigstore 使用 OIDC 协议将用户的短期身份(如 GitHub 账号、Google 邮箱)绑定到镜像签名上。你需要至少配置一个 OIDC 提供商作为身份源。本课程以 GitHub 和 Google 为例。

3.2.1 GitHub OIDC 配置

GitHub Actions 原生支持 OIDC 生成,适合 CI/CD 流水线。若在本地开发环境使用,需通过 oauth2 设备流完成认证。

  1. 创建 GitHub OAuth App(可选,仅本地设备流需要):
    • 访问 GitHub Settings → Developer settings → OAuth Apps → New OAuth App
    • 填写 Application name:Sigstore-Local-Dev
    • Homepage URL:http://localhost:8080
    • Authorization callback URL:http://localhost:8080/callback
  2. 获取 Client ID 和 Client Secret,后续用于 Cosign 的 OIDC 交互。
  3. 测试认证流程:
    cosign login ghcr.io -u <你的GitHub用户名> --password-stdin <输入Personal Access >

3.2.2 Google OIDC 配置

Google 作为 OIDC 提供商,适合个人开发者或使用 Google Workspace 的组织。

步骤 操作说明 关键参数
1 打开 Google Cloud Console → APIs & Services → Credentials 项目需启用 IAM API
2 创建 OAuth 2.0 Client ID,应用类型选“Desktop app” 名称:Sigstore Desktop Client
3 记录 Client ID 和 Client Secret 用于 cosign initialize 的 OIDC 参数
4 设置环境变量(可选) export COSIGN_GOOGLE_CLIENT_ID=xxx

3.2.3 验证 OIDC 连通性

使用 Cosign 的 initialize 命令测试与 OIDC 提供商的通信:

# 使用 GitHub 身份(设备流)
cosign initialize --oidc-issuer https://.actions.githubusercontent.com

# 使用 Google 身份
cosign initialize --oidc-issuer https://accounts.google.com

# 成功标志:控制台输出 "Successfully initialized Sigstore client"
常见问题:如果初始化失败,检查网络是否能访问 fulcio.sigstore.dev 和 rekor.sigstore.dev。中国大陆用户可能需要配置代理或使用 Sigstore 的公共镜像。

3.3 搭建本地测试 K8s 集群

为了测试准入控制策略,你需要一个本地 K8s 集群。我们推荐 Kind(Kubernetes in Docker)或 Minikube,两者均支持快速创建单节点或多节点集群。

3.3.1 工具选择对比

特性 Kind Minikube
底层依赖 Docker Docker / Hyper-V / VirtualBox
集群启动速度 ~30 秒 ~60 秒
多节点支持 原生支持(通过配置文件) 需额外驱动
持久化存储 需手动配置 内置 hostPath 支持
适用场景 CI/CD、快速测试 本地开发、学习

3.3.2 使用 Kind 创建集群

  1. 安装 Kind:
    # macOS
    brew install kind
    
    # Linux (amd64)
    curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
    chmod +x ./kind
    sudo mv ./kind /usr/local/bin/kind
  2. 创建集群配置文件(可选,用于多节点或自定义配置):
    cat <<EOF > kind-config.yaml
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    nodes:
    - role: control-plane
    - role: worker
    - role: worker
    EOF
  3. 启动集群:
    kind create cluster --name sigstore-demo --config kind-config.yaml
    
    # 输出示例:
    # Creating cluster "sigstore-demo" ...
    # ✓ Ensuring node image (kindest/node:v1.28.0) 🖼
    # ✓ Preparing nodes 📦 📦 📦
    # ✓ Writing configuration 📜
    # ✓ Starting control-plane 🕹️
    # ✓ Installing CNI 🔌
    # ✓ Installing StorageClass 💾
    # Set kubectl context to "kind-sigstore-demo"
  4. 验证集群状态:
    kubectl cluster-info --context kind-sigstore-demo
    kubectl get nodes

3.3.3 使用 Minikube 创建集群

# 安装 Minikube
brew install minikube

# 启动集群(指定驱动为 docker)
minikube start --driver=docker --cpus=2 --memory=4096

# 验证
minikube status
kubectl get nodes
推荐选择:本课程后续章节将使用 Kind 作为默认集群,因为它与 Docker 集成更紧密,且支持通过配置文件快速重建环境。如果你更习惯 Minikube,操作步骤基本一致,只需注意 kubectl context 的切换。

3.4 环境验证清单

完成上述安装后,执行以下命令确认所有组件就绪:

# 1. 验证 Cosign
cosign version

# 2. 验证 OIDC 初始化
cosign initialize --oidc-issuer https://.actions.githubusercontent.com

# 3. 验证 K8s 集群
kubectl get nodes
kubectl get pods -A

# 4. 验证容器运行时(Docker)
docker info | grep "Server Version"

如果所有命令均返回正常输出,说明你的环境已准备就绪,可以进入下一章:使用 Cosign 对镜像进行签名与验证。

环境快照建议:在继续后续实验前,建议使用 kind export logs 或 minikube snapshot save 保存当前集群状态。这样在后续操作出现问题时,可以快速回滚到干净环境。
环境准备:三大组件架构图 本地开发机 Cosign CLI 签名 / 验证 / 存储 OIDC 身份提供商 GitHub / Google K8s 集群 Kind / Minikube Sigstore 公共基础设施 Fulcio 证书颁发机构 Rekor 透明日志 OIDC 短期身份凭证 请求签名证书 提交签名记录 获取身份令牌 所有组件通过 HTTPS 通信