Jenkins + k8s 实现企业 CI/CD 落地

一、概述

1.1、环境介绍

我们使用的是 AWS 的 EC2 来搭建我们的集群,安装方式使用 kubeadm 来进行安装,如果使用二进制安装,可以参考我相关文档。

  • 系统版本:ubuntu 16.04
  • k8s 版本:1.17.1
  • docker 版本:18.06-ce

1.2、流程图

1.3、集群配置

名称 配置 内网IP 外网IP
k8s-master 2核4GB 172.31.20.184 54.226.118.74
k8s-node1 2核4GB 172.31.27.69 52.90.221.230
k8s-node2 2核4GB 172.31.30.9 3.85.219.119

二、k8s 部署

2.1、安装 docker

安装源大家可以参照官方文档 https://docs.docker.com/install/linux/docker-ce/ubuntu/ ,我这里不再进行演示,如没有特殊说明,操作将在三台集群上面都要执行。

apt-get install docker-ce=18.06.3~ce~3-0~ubuntu
systemctl enable docker

2.2、安装 kubeadm, kubelet and kubectl

安装源文档请参考官方文档 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm ,详细步骤我这里进行省略。

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

2.3、安装 k8s 集群

请参考文档 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ ,在 master 节点运行。

kubeadm init --kubernetes-version=v1.17.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

在 node 节点上运行添加集群的命令。

kubeadm join 172.31.20.184:6443 --token w3fu9a.rs8eknt079n2e8r8     --discovery-token-ca-cert-hash sha256:7392d6f6576b3c9ba5f78d1c54d9a0b1369f77bd498da8104a096b62c6b14c06

以后的 kubectl 都是在 master 节点上进行操作,添加 cni 插件,我们这里选择 flannel。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

到目前为止,我们的集群已经创建完成,参照官方文档执行,过程很简单。

[email protected]:~# kubectl get no
NAME               STATUS   ROLES    AGE   VERSION
ip-172-31-20-184   Ready    master   21m   v1.17.1
ip-172-31-27-69    Ready    <none>   16m   v1.17.1
ip-172-31-30-9     Ready    <none>   16m   v1.17.1

三、组件安装

整个 CI/CD 过程中我们用到了很多工具,比如 gitlab,jenkins,harbor,在生产环境,建议大家把 gitlab 和 harbor 放在独立的机器上面,我这里为了简便,直接放在 k8s 集群中。

3.1、安装 helm3

请参见官方文档 https://helm.sh/docs/intro/install/

wget https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz
tar xf helm-v3.0.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
chmod +x /usr/local/bin/helm

3.2、安装 gitlab

参见官方文档 https://docs.gitlab.com/charts/installation/

helm repo add gitlab https://charts.gitlab.io/

后来发现 gitlab 目前还不支持 helm3,那我就选择了使用 EC2 来进行创建。
https://about.gitlab.com/install/#ubuntu?version=ce

3.3、安装 harbor

参见官方文档 https://github.com/goharbor/harbor-helm/blob/master/README.md

helm repo add harbor https://helm.goharbor.io
helm install my-release harbor/harbor

安装过程中还是出现了一些问题,是因为没有 pv,懒得去设置了,后来还是选择了单机进行安装。
参照下面文档安装 https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

3.4、安装 jenkins

3.4.1、优点

我们以云原生的方式,将jenkins master,jenkins slave全部部署于kubernetes之上,从而打造一个高可用,弹性伸缩的CI/CD管道。

  1. 推送代码到托管镜像仓库
  2. gitlab 基于webhook触发jenkins pipeline项目
  3. Jenkins master分配kubernetes slave作为项目的执行环境,同时k8s启动slave pod
  4. Jenkins slave pod运行pipeline中指定的任务第一步从私有代码仓库拉下代码
  5. Jenkins slave pod执行代码测试,测试完毕后依据代码仓库格式,构造镜像
  6. Jenkins slave pod推送镜像到Harbor上
  7. Jenkins slave pod执行应用服务的更新任务
  8. 应用服务pod所在节点拉取相应的镜像,完成镜像的替换,即应用的更新
  • 服务高可用:当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master 容器,并且将 Volume 分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。
  • 动态伸缩:合理使用资源,每次运行 Job 时,会自动创建一个 Jenkins Slave,Job 完成后,Slave 自动注销并删除容器,资源自动释放,而且 Kubernetes 会根据每个资源的使用情况,动态分配 Slave 到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待在该节点的情况。
  • 扩展性好:当 Kubernetes 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一个 Kubernetes Node 到集群中,从而实现扩展。

3.4.2、创建 nfs

因为 master 需要持久存储,我们这里就简单的选择 nfs ,我们在 master 节点上进行创建服务。
创建过程请参照文档 https://blog.csdn.net/qq_37860012/article/details/86717891

[email protected]:/home/nfs# showmount -e 172.31.20.184
Export list for 172.31.20.184:
/home/nfs/jenkins *

master 节点目前授予权限。

chown ubuntu.ubuntu -R /home/nfs/jenkins

3.4.3、创建 nginx-ingress

参考文档 https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/

3.4.5、安装 jenkins

前面所需要的东西都已经配置好了,那我们开始安装 jenkins,请应用我下面的 yaml 文件

apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get","list","watch"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: jenkins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: jenkins
subjects:
- kind: ServiceAccount
  name: jenkins
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  selector:
    app: jenkins
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    protocol: TCP
  - name: agent
    port: 50000
    protocol: TCP
    targetPort: 50000
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: jenkins.wzlinux.com
    http:
      paths:
      - backend:
          serviceName: jenkins
          servicePort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      securityContext:
        fsGroup: 1000
      serviceAccountName: jenkins
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        - containerPort: 50000
          name: agent
          protocol: TCP
        volumeMounts:
        - name: jenkins-home
          mountPath: /var/jenkins_home
        env:
        - name: JAVA_OPTS
          value: "-Xms1G -Xmx1G -XX:PermSize=512m -XX:MaxPermSize=1024m -Duser.timezone=Asia/Shanghai"
        - name: TRY_UPGRADE_IF_NO_MARKER
          value: "true"
      volumes:
      - name: jenkins-home
        # hostPath:
        #   path: "/home/jenkins"
        nfs:
          server: 172.31.20.184
          path: "/home/nfs/jenkins/"

原文地址:https://blog.51cto.com/wzlinux/2467123

时间: 2024-08-30 12:58:26

Jenkins + k8s 实现企业 CI/CD 落地的相关文章

jenkins的容器化部署以及k8s应用的CI/CD实现

1. 使用Helm安装Mysql: ??上一篇博文谈到了如何使用Helm安装Redis和RabbitMQ,下来我们来聊聊如何用Helm安装mysql. ??本人对于Mysql数据库不是非常熟悉,因为我们公司的分工比较明确,数据库这块的工作主要由DBA负责,运维同学只负责应用的维护. ??按照我们前面博文的描述,首先是在官方文档查看helm安装mysql的书名: https://github.com/helm/charts/tree/master/stable/mysql ??我根据官方文档的描述

通过Jenkins与Docker构建CI/CD基础架构

###前言 提到容器平台,最早接触的便是LXC(Linux Container),是2010年刚刚接触虚拟化平台的时候,当时开源解决方案是xen的天下(后来KVM才后来者居上),且性能各方面都不弱,价值当时还不是移动互联网时代,业务量远远没有那么大,大部分公司都是物理机部署应用,用虚拟化平台的公司也是寥寥无几,可想而知,没有业务,没有场景,那就没有技术的用武之地了,所以,LXC生而伟大而用不逢时,Docker之所以能够青出于蓝而胜于蓝,取得如此大的成功的原因还是归咎于移动互联网带来的流量大爆炸,

jenkins自动化pipline的ci/cd流水线

pipeline { agent any tools { //工具必须预先在jenkins中预配置 maven 'mvn' jdk 'jdk' } stages { stage('Env') { steps { sh 'printenv' } } stage('git') { steps{ checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, e

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&amp;CD

随着项目的不断增多,最开始单体项目手动执行 docker build 命令,手动发布项目就不再适用了.一两个项目可能还吃得消,10 多个项目每天让你构建一次还是够呛.即便你的项目少,每次花费在发布上面的时间累计起来都够你改几个 BUG 了. 所以我们需要自动化这个流程,让项目的发布和测试不再这么繁琐.在这里我使用了 Jenkins 作为基础的 CI/CD Pipeline 工具,关于 Jenkins 的具体介绍这里就不再赘述.在版本管理.构建项目.单元测试.集成测试.环境部署我分别使用到了 Go

容器平台自动化CI/CD流水线实操

CI/CD----(实操说明) CI/CD 持续集成(Continuous Integration, CI):  代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous Deployment, CD): 部署到测试环境.预生产环境.生成环境. 持续部署(Continuous Delivery, CD):  将最终产品发布到生成环境.给用户使用. Jenkins与容器技术CI/CD实战 说明:这张图稍微更形象一点,上线之前先把代码git到版本仓库,然

基于jenkins的k8s ci/cd实例

K8S ci/cd三剑客:jenkinsfile.dockerfile.k8s.yaml k8s的ci/cd实例jenkins+jenkinsfile+dockerfile+k8s.yaml 1.dockerfile 实例 FROM harbor.k8s.site/library/jdk/jre:1.8-aplineENV TZ=Asia/ShanghaiVOLUME /tmpADD build/libs/*.jar /app/app.jarRUN mkdir /logs/ && echo

Jenkins与Docker/Kubernetes的自动化CI/CD流水线实践--免费直播课等你来约

直播老师简介: 李振良·奇虎360-高级运维工程师,主要负责360浏览器业务运维.7年互联网运维工作经验,具备丰富的运维实战经验,曾主导容器云平台建设并将业务容器化部署 老师博客专栏地址:基于Kubernetes企业级容器云平台落地与实践 直播课内容大纲: 1.什么是CI/CD?2.Jenkins Pipeline2.Jenkins与Docker发布JAVA项目3.Jenkins与Kubernetes发布JAVA项目 直播时间: 2018年7月26日(本周四)晚8点30分--9点30分 QQ群直

kubernetes之CI/CD工具jenkins第二篇,helm的使用

1. kubernetes之CI/CD第二篇-jenkins结合helm部署应用: 1. 概述: ?? 在前期的博文中我已经初步介绍过kubernetes环境下的CI/CD的使用.主要是jenkins slave pod自动创建和销毁,当有jenkins job任务执行的时候,就会自动创建一个jenkins slave pod.在本篇博文中,我们将介绍jenkins生成slave pod的另外一种方法,就是在pipeline脚本里面定义slave pod的镜像等,同时将Dockerfile.Je

jinkens+gitlab针对k8s集群实现CI/CD

一.环境准备 k8s集群环境(我这里是三台的K8s集群): 单独一台docker服务器,主要用于向私有仓库上传镜像,Jenkins和gitlab也部署在这台服务器: 上述环境共计服务器4台,均指向同一个私有仓库,以便共享docker镜像: 服务器IP依次为192.168.20.2.20.3.20.4.20.5(前三个IP为K8s集群中的节点) Jenkins采用war包的方式部署,需要用到tomcat环境,自行参考博文,进行部署:其他环境部署可以参考以下博文:Tomcat安装及优化配置:Dock