评论

收藏

[JavaScript] EKS 训练营-CI Jenkins(12)

开发技术 开发技术 发布于:2021-07-03 21:45 | 阅读数:550 | 评论:0

  Jenkins 是一个开源软件项目,基于 Java 开发,是一种 CI/CD 的持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,可用于自动化各种任务,如构建,测试和部署软件。
  在这个动手实验中,我们演示如何集成 K8s 和 Jenkins。

DSC0000.png
Jenkins in EKS

部署

  这里我们把 jenkins 部署在 EKS 中,使用 pvc 请求 EBS 来持久存储数据,使用 ingress,记得做好域名解析。
kubectl apply -f https://github.com/wangzan18/jenkins-agent-k8s-cicd/raw/master/master/jenkins-eks.yaml
  查看 jenkins 的密码
kubectl logs jenkins-7686448ff6-6plp2
  然后使用自己的域名访问即可,输入查看的密码。
  我这里不安装建议的任何插件,选择安装完成,配置好账户密码。

安装插件

  
DSC0001.png

  选择配置节点

DSC0002.png
  配置 kubernetes

DSC0003.png
测试

  创建一个流水线
podTemplate {
  node(POD_LABEL) {
    stage('Run shell') {
      sh 'echo hello world'
    }
  }
}
  
DSC0004.png

  可以看到成功运行,agent 在 EKS 中启动 Pod 来处理任务。

Jenkins out EKS

  如果我们的 Jenkins 在集群外,或者我们有现有的 Jenkins 集群,不想再进行创建了,这种情况下,jenkins 访问 EKS 就稍微麻烦了一些

部署
docker run \
  --name jenkins-test \
  -u root \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -e TZ=Asia/Shanghai \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --restart=on-failure:10 \
  jenkinsci/blueocean
配置插件

  我们首先创建 kubeconfig 认证文件,IAM 用户需要有 EKS 的操作权限。
aws eks update-kubeconfig \
  --region eu-west-1 \
  --name my-cluster \
  --kubeconfig jenkins.kubeconfig
  为 jenkins 创建凭据,把创建的 kubeconfig 文件上传

DSC0005.png
  到这一步还不行,因为 jenkins 的容器里面没有 awscli 命令,我们需要加上 awscli 命令,进入到容器安装
apk add python3
pip3 install awscli
  配置完成之后,如果你的 jenkins 在 EC2 上面安装的,并且 EC2 配置的角色有操作 EKS 的权限,到这一步就可以了,如果不是的话,那我们需要配置 awscli 的 credential。
aws configure
  配置好具有操作 EKS 资源的 IAM 用户的 Access Key 即可。

DSC0006.png
测试

  创建一个流水线
podTemplate {
  node(POD_LABEL) {
    stage('Run shell') {
      sh 'echo hello world'
    }
  }
}
DSC0007.png
提交镜像到 ECR

创建 serviceAccount

  因为上传到 ECR 需要有权限,我们先为 Pod 创建一个具有权限的 serviceAccount,这里为了演示方便,直接赋予了管理员的权限
eksctl create iamserviceaccount \
   --cluster my-cluster \
   --name jenkins-agent \
   --region eu-west-1 \
   --attach-policy-arn arn:aws:iam::aws:policy/AdministratorAccess \
   --approve
配置 Jenkinsfile

  我们可以参考 jenkins 插件 kubernetes 的教程。
podTemplate(
  containers: [
    containerTemplate(name: 'php', image: 'webdevops/php-nginx:7.4', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'docker', image: 'docker:latest', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'awscli', image: 'amazon/aws-cli:latest', ttyEnabled: true, command: 'cat')
  ], 
  volumes: [
    hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker')
  ],
  serviceAccount: 'jenkins-agent'
) 
{
  node(POD_LABEL) {
    stage('Clone') {
      git branch: 'master', credentialsId: 'd38f927d-9152-4083-9e48-c312a07d230e', url: 'http://git3.wzlinux.net/BMC/api.wzlinux.com.git'
      container('php') {
        sh 'composer install'
      }
    }
    stage('Build') {
      container('docker') {
        sh 'docker build -t wzlinux:v${BUILD_NUMBER} .'
        sh 'docker tag carlcare:v${BUILD_NUMBER} 921283538843.dkr.ecr.eu-west-1.amazonaws.com/wzlinux:v${BUILD_NUMBER}'
      }
    }
    stage('Push') {
      container('awscli') {      
        sh 'aws sts get-caller-identity'
        sh 'aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 921283538843.dkr.ecr.eu-west-1.amazonaws.com'
        sh 'docker push 921283538843.dkr.ecr.eu-west-1.amazonaws.com/wzlinux:v${BUILD_NUMBER}'          
      }  
    }    
  }
}
  这个代码是一个 PHP 的程序,我们用到了三个镜像,第一个是 php 的镜像,用于安置 composer 的组件,第二个镜像使用的是 docker,利用 docker in docker 的模式来进行镜像打包,第三个镜像是 awscli,用来 ECR 的认证,因为我们的 Pod 使用了 jenkins-agent 这个 serviceAccount,所以具有上传的权限。

DSC0008.png
  参考文档:
  https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html

欢迎大家扫码关注,获取更多信息

DSC0009.jpg

关注下面的标签,发现更多相似文章