envtest 安装踩坑笔记

controller-runtime/pkg/envtest 使我们在写单测的时候可以不依赖 K8s 组件(API Server、Kubelet 等)去模拟 K8s 资源。

本文对于自己在 Mac 环境下安装 envtest 过程遇到的坑做一些记录。

Kubebuilder 安装

https://book.kubebuilder.io/quick-start.html

  • 注意不同的 go 版本对应不同的 kubebuilder 版本

    • go version v1.15+ (kubebuilder v3.0 < v3.1).
    • go version v1.16+ (kubebuilder v3.1 < v3.3).
    • go version v1.17+ (kubebuilder v3.3+).
  • 如果要完整运行 kubebuilder 实例需要提前安装好 kustomizecontroller-gen,但如果知识需要使用 envtest 不需要

  • 安装步骤如下

    1
    2
    curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
    chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
  • 预置 shell 命令

    1
    kubebuilder completion <bash|zsh|fish>

envtest 安装

  • 安装 envtest 二进制

    1
    2
    export K8S_VERSION=1.21.2
    curl -sSLo envtest-bins.tar.gz "https://go.kubebuilder.io/test-tools/${K8S_VERSION}/$(go env GOOS)/$(go env GOARCH)"
  • 解压二进制

    • 这些二进制就是模拟的 etcd、apiserver 等组件
    • 本地跑 UT 时不一定有权限访问这些二进制,如果不在意安全的话建议改成 777
    1
    2
    mkdir /usr/local/kubebuilder
    tar -C /usr/local/kubebuilder --strip-components=1 -zvxf envtest-bins.tar.gz
  • 执行单测时,为防止二进制路径错误,可以指定二进制跑测试

    1
    make test SKIP_FETCH_TOOLS=1 KUBEBUILDER_ASSETS=/usr/local/kubebuilder/bin