基于Kubernetes的DevOps平台实践
持续集成工具:
Jenkins
gitlabci
Tekton
DevOps、CI、CD介绍Continuous Integration (CI) / Continuous Delivery (CD)
软件交付流程
一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护,基于这些阶段,我们的软件交付模型大致经历了几个阶段: 瀑布式流程
前期需求确立之后,软件开发人员花费数周和数月编写代码,把所有需求一次性开发完,然后将代码交给QA(质量保障)团队进行测试,然后将最终的发布版交给运维团队去部署。瀑布模型,简单来说,就是等一个阶段所有工作完成之后,再进入下一个阶段。这种模式的问题也很明显,产品迭代周期长,灵活性差。一个周期动辄几周几个月,适应不了当下产品需要快速迭代的场景。 敏捷开发
任务由大拆小,开发、测试协同工作,注重开发敏捷,不重视交付敏捷 DevOps
开发、测试、运维协同工作, 持续开发+持续交付。
DevOps工具链
靠这些工具和技术,才实现了自动化流程,进而解决了协作成本,使得devops具备了可落地性。因此我们可以大致给devops一个定义:
Devops = 提倡开发、测试、运维协同工作来实现持续开发、持续交付的一种软件交付模式 + 基于工具和技术支撑的自动化流程的落地实践。
因此devops不是某一个具体的技术,而是一种思想+自动化能力,来使得构建、测试、发布软件能够更加地便捷、频繁和可靠的落地实践。本次课程核心内容就是要教会大家如何利用工具和技术来实现完整的DevOps平台的建设。我们主要使用的工具有:
gitlab,代码仓库,企业内部使用最多的代码版本管理工具。
Jenkins, 一个可扩展的持续集成引擎,用于自动化各种任务,包括构建、测试和部署软件。
robotFramework, 基于Python的自动化测试框架
sonarqube,代码质量管理平台
maven,java包构建管理工具
Kubernetes
Docker
Jenkins初体验 Kubernetes环境中部署jenkins其他部署方式
注意点:
第一次启动很慢
因为后面Jenkins会与kubernetes集群进行集成,会需要调用kubernetes集群的api,因此安装的时候创建了ServiceAccount并赋予了cluster-admin的权限
默认部署到jenkins=true的节点
初始化容器来设置权限
ingress来外部访问
数据存储通过hostpath挂载到宿主机中
jenkins/jenkins-all.yaml
apiVersion: v1 kind: Namespace metadata: name: jenkins --- apiVersion: v1 kind: ServiceAccount metadata: name: jenkins namespace: jenkins --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: jenkins-crb roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: jenkins namespace: jenkins --- apiVersion: apps/v1 kind: Deployment metadata: name: jenkins-master namespace: jenkins spec: replicas: 1 selector: matchLabels: devops: jenkins-master template: metadata: labels: devops: jenkins-master spec: nodeSelector: jenkins: "true" serviceAccount: jenkins #Pod 需要使用的服务账号 initContainers: - name: fix-permissions image: busybox command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"] securityContext: privileged: true volumeMounts: - name: jenkinshome mountPath: /var/jenkins_home containers: - name: jenkins image: jenkinsci/blueocean:1.23.2 imagePullPolicy: IfNotPresent ports: - name: http #Jenkins Master Web 服务端口 containerPort: 8080 - name: slavelistener #Jenkins Master 供未来 Slave 连接的端口 containerPort: 50000 volumeMounts: - name: jenkinshome mountPath: /var/jenkins_home env: - name: JAVA_OPTS value: "-Xms4096m -Xmx5120m -Duser.timezone=Asia/Shanghai -Dhudson.model.DirectoryBrowserSupport.CSP=" volumes: - name: jenkinshome hostPath: path: /var/jenkins_home/ --- apiVersion: v1 kind: Service metadata: name: jenkins namespace: jenkins spec: ports: - name: http port: 8080 targetPort: 8080 - name: slavelistener port: 50000 targetPort: 50000 type: ClusterIP selector: devops: jenkins-master --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: jenkins-web namespace: jenkins spec: rules: - host: jenkins.luffy.com http: paths: - backend: serviceName: jenkins servicePort: 8080 path: /