使用kubernetes和jenkins管理多pod集成测试

时间:2018-05-23 18:52:49

标签: docker jenkins kubernetes

我正在尝试使用jenkins和jenkins kubernetes plugin为我的kubernetes集群设置测试框架。

我可以让jenkins配置pod并运行基本的单元测试,但不太清楚的是我如何运行涉及多个pod之间协调的测试。

基本上我想做这样的事情:

podTemplate(label: 'pod 1', containers: [ containerTemplate(...)]) {
    node('pod1') {
        container('container1') {
            // start service 1
        }
    }
}
podTemplate(label: 'pod 2', containers[ containerTemplate(...)]) {
    node('pod2') {
        container('container2') {
            // start service 2
        }
}
stage ('Run test') {
    node {
        sh 'run something that causes service 1 to query service 2'
    }
}

我有两个主要问题:

  1. Pod生命周期: 只要清除podtemplate后的块,就会终止pod。是否有一种可接受的方法可以让豆荚保持活着状态直到达到指定的条件?

  2. 来自docker image的
  3. ContainerTemplate: 我使用docker镜像在每个kubernetes pod中配置容器,但是应该在这些图像中的文件似乎在'container'块内不可见/可访问,即使安装的环境和依赖项对于回购。如何实际获取docker镜像中定义的服务以在jenkins配置的pod中运行?

1 个答案:

答案 0 :(得分:0)

问这个问题已经有一段时间了,与此同时,我学到了一些东西,这些东西可以使我完成我一直在问的事情,尽管可能不如我所希望的那样整洁。

针对多服务测试的解决方案最终只是使用具有google cloud library的pod模板,然后为该工作人员分配服务帐户凭据和密钥,以便它可以kubectl命令在群集上。

用于工作程序的Dockerfile,将“ X”替换为所需的版本:

FROM google/cloud-sdk:alpine

// Install some utility functions.
RUN apk add --no-cache \
  git \
  curl \
  bash \
  openssl

// Used to install a custom version of kubectl
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/vX.XX.X/bin/linux/amd64/kubectl &&\
  chmod +x ./kubectl &&\
  mv ./kubectl /usr/local/bin/kubectl

// Helm to manage deployments.
RUN curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh &&\
  chmod 700 get_helm.sh && ./get_helm.sh --version vX.XX.X

然后在常规管道中:

pipeline {
  agent {
    kubernetes {
      label 'kubectl_helm'
      defaultContainer 'jnlp'
      serviceAccount 'helm'
      yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: gcloud
  image: your-docker-repo-here
  command:
  - cat
  tty: true
"""
    }
  }
  environment {
      GOOGLE_APPLICATION_CREDENTIALS = credentials('google-creds')
  }
  stages {
    stage('Do something') {
      steps {
        container('gcloud') {
          sh 'kubectl apply -f somefile.yaml'
          sh 'helm install something somerepo/somechart'
        }
      }
    }
 }

现在,我可以同时访问helm和kubectl命令,可以随意启动和关闭pod或服务。它仍然不能解决能够使用它们的内部“上下文”访问文件的问题,但是至少它为我提供了一种运行集成测试的方法。

注意:为了使其正常工作,您将需要一个用于您的服务帐户名称的名称的服务帐户,以及存储在jenkins凭证存储中的凭证。为了使用helm命令,您需要确保在您的kubernetes集群上安装了Tiller。另外,请不要从GOOGLE_APPLICATION_CREDENTIALS更改env键的名称,因为gsutils工具将在该环境变量中查找