Jenkins 是一个开源软件项目,基于 Java 开发,是一种 CI/CD 的持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,可用于自动化各种任务,如构建,测试和部署软件。
在这个动手实验中,我们演示如何集成 K8s 和 Jenkins。
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 然后使用自己的域名访问即可,输入查看的密码。
我这里不安装建议的任何插件,选择安装完成,配置好账户密码。
安装插件
选择配置节点
配置 kubernetes
测试
创建一个流水线podTemplate {
node(POD_LABEL) {
stage('Run shell') {
sh 'echo hello world'
}
}
}
可以看到成功运行,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 文件上传
到这一步还不行,因为 jenkins 的容器里面没有 awscli 命令,我们需要加上 awscli 命令,进入到容器安装apk add python3
pip3 install awscli 配置完成之后,如果你的 jenkins 在 EC2 上面安装的,并且 EC2 配置的角色有操作 EKS 的权限,到这一步就可以了,如果不是的话,那我们需要配置 awscli 的 credential。aws configure 配置好具有操作 EKS 资源的 IAM 用户的 Access Key 即可。
测试
创建一个流水线podTemplate {
node(POD_LABEL) {
stage('Run shell') {
sh 'echo hello world'
}
}
}
提交镜像到 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,所以具有上传的权限。
参考文档:
https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html
欢迎大家扫码关注,获取更多信息
|