跳至内容

测试

单元和集成测试

可以使用 go test 运行单元和集成测试

要运行所有测试

go test -v ./...

添加集成测试

集成测试将使用集群规范构建 Terraform 模板。对于新功能,请考虑将其添加到 complex.example.com 集群中,除非它与该集群中现有的功能冲突。要添加新的集成测试,请在 tests/integration/update_cluster/ 中创建一个新目录,并将集群规范放在 in-v1alpha2.yaml 中。使用唯一的集群名称。

然后编辑 ./cmd/kops/integration_test.go 并添加使用上述集群名称和目录的测试函数。

最后运行 ./hack/update-expected.sh 生成预期的输出。

Kubernetes e2e 测试

Kubetest2 是在 Kubernetes 上启动和运行端到端测试的框架,测试 kOps 集群的最佳方法是使用相同的 Go 模块来执行 e2e 测试。

准备环境

在运行 kubetest2 之前,您需要安装核心以及所有部署器和测试器 Go 模块。

make test-e2e-install

作为参考,构建目标命令可以在 这里 找到。

请参阅 GitHub kubetest2 以进一步了解 Kubernetes e2e 测试框架。

按照以下示例,kubetest2 将测试工件下载到 ./_artifacts

针对现有集群运行

您可以运行类似以下内容来让 kubetest2 重用现有集群。

这假设您已经从源代码构建了 kOps 二进制文件。--kops-binary-path 标志中使用的 kops 二进制文件的精确路径可能会有所不同。

环境变量 KOPS_ROOT 是本地 GitHub kOps 工作目录的完整路径。

kubetest2 kops \
  -v 2 \
  --test \
  --cloud-provider=aws \
  --cluster-name=my.testcluster.com \
  --kops-binary-path=${KOPS_ROOT}/.build/dist/$(go env GOOS)/$(go env GOARCH)/kops \
  --kubernetes-version=v1.20.2 \
  --test=kops \
  -- \
  --test-package-version=v1.20.2 \
  --parallel 25 \
  --skip-regex="\[Slow\]|\[Serial\]|\[Disruptive\]|\[Flaky\]|\[Feature:.+\]|\[HPA\]|Dashboard|RuntimeClass|RuntimeHandler"

也可以通过将 --skip-regex 标志替换为 --focus-regex='\[Conformance\]' 来运行 Kubernetes 一致性测试套件。

请参阅 Kubernetes 中的一致性测试

针对新集群运行

通过添加 --up 标志,kubetest2 将启动一个新集群。可以使用 --create-args 标志将标志传递给 kops create cluster 命令。在大多数情况下,您还需要添加一些额外的标志。有关完整列表,请参阅 kubetest2 kops --help

kubetest2 kops \
  -v 2 \
  --up \
  --cloud-provider=aws \
  --cluster-name=my.testcluster.com \
  --create-args="--networking calico" \
  --kops-binary-path=${KOPS_ROOT}/.build/dist/$(go env GOOS)/$(go env GOARCH)/kops \
  --kubernetes-version=v1.20.2 \
  --test=kops \
  --
  -- \
  --test-package-version=v1.20.2 \
  --parallel 25 \
  --skip-regex="\[Slow\]|\[Serial\]|\[Disruptive\]|\[Flaky\]|\[Feature:.+\]|\[HPA\]|Dashboard|RuntimeClass|RuntimeHandler"

如果您未指定任何其他标志,kOps 部署器 Go 模块将使用以下默认值创建 Kubernetes 集群。

kops create cluster --name my.testcluster.com --admin-access <Client Public IP> --cloud aws --kubernetes-version v1.20.2 --master-count 1 --master-volume-size 48 --node-count 4 --node-volume-size 48 --set cluster.spec.nodePortAccess=0.0.0.0/0 --ssh-public-key /home/ubuntu/.ssh/id_rsa.pub --yes --zones <Random Zone> --master-size c5.large --networking calico

对于 --zones 标志,kOps 部署器将根据 --cloud-provider 标志选择一个随机区域,对于 aws,完整的 AWS 区域列表可以在 这里 找到,对于 gce,完整的 GCE 区域列表可以在 这里 找到。

或者,您可以使用 kops create cluster my.testcluster.com ... --dry-run -oyaml > my.testcluster.com.yaml 根据您自己的要求生成 kOps 集群规范 YAML 清单,然后使用 --template-path 标志运行 kubetest2 e2e 测试以指定 YAML 清单的完整路径。

kubetest2 kops \
  -v 2 \
  --up \
  --cloud-provider=aws \
  --cluster-name=my.testcluster.com \
  --kops-binary-path=${KOPS_ROOT}/.build/dist/$(go env GOOS)/$(go env GOARCH)/kops \
  --kubernetes-version=v1.20.2 \
  --template-path=my.testcluster.com.yaml \
  --test=kops \
  -- \
  --test-package-version=v1.20.2 \
  --parallel 25 \
  --skip-regex="\[Slow\]|\[Serial\]|\[Disruptive\]|\[Flaky\]|\[Feature:.+\]|\[HPA\]|Dashboard|RuntimeClass|RuntimeHandler"

如果您遇到以下错误,则需要将您的 SSH 公钥添加到 kOps 集群规范 YAML 清单中。

SSH public key must be specified when running with AWS (create with `kops create secret --name training.kops.k8s.local sshpublickey admin -i ~/.ssh/id_rsa.pub`)
---

apiVersion: kops.k8s.io/v1alpha2
kind: SSHCredential
metadata:
  name: admin
  labels:
    kops.k8s.io/cluster: my.testcluster.com
spec:
  publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC..."

如果您想针对您的 kOps 开发版本运行测试,则需要上传二进制文件并设置环境变量,如 添加新功能 中所述。

由于我们假设您使用此集群进行测试,因此我们在测试完成后让集群保持运行状态,以便您在出现意外情况时检查节点。如果您不需要这样做,可以添加 --down 标志。否则,只需像其他集群一样删除集群:kops delete cluster my.testcluster.com --yes