EKS 训练营-CI Jenkins(12)

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

在这个动手实验中,我们演示如何集成 K8s 和 Jenkins。

image-20210604101001463

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

然后使用自己的域名访问即可,输入查看的密码。

我这里不安装建议的任何插件,选择安装完成,配置好账户密码。

安装插件

image-20210604143215162

选择配置节点

image-20210604143434979

配置 kubernetes

image-20210604143618315

测试

创建一个流水线

podTemplate {
    node(POD_LABEL) {
        stage('Run shell') {
            sh 'echo hello world'
        }
    }
}

image-20210604143837038

可以看到成功运行,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 文件上传

image-20210604150008531

到这一步还不行,因为 jenkins 的容器里面没有 awscli 命令,我们需要加上 awscli 命令,进入到容器安装

apk add python3
pip3 install awscli

配置完成之后,如果你的 jenkins 在 EC2 上面安装的,并且 EC2 配置的角色有操作 EKS 的权限,到这一步就可以了,如果不是的话,那我们需要配置 awscli 的 credential。

aws configure

配置好具有操作 EKS 资源的 IAM 用户的 Access Key 即可。

image-20210604152848904

测试

创建一个流水线

podTemplate {
    node(POD_LABEL) {
        stage('Run shell') {
            sh 'echo hello world'
        }
    }
}

image-20210604153645521

提交镜像到 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,所以具有上传的权限。

image-20210607121458697

参考文档:

https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值