【devops】十、Kubernetes编排工具(下)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 【devops】十、Kubernetes编排工具(下)

10.5 Jenkins集成Kubernetes

10.5.1 gitlab上准备部署的yml文件

在gitlab上创建一个pipeline.yml文件,供Jenkins拉取并通知目标服务器执行

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline
    spec:
      containers:
      - name: pipeline
        image: 192.168.2.211:80/repo/pipeline:v3.0.0   # 在harbor仓库中复制一个镜像取得
        command: ["/bin/bash", "-ce", "tail -f /dev/null"]   # 保持容器持续运行,而不是一致重启
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  labels:
    app: pipeline
  name: pipeline
spec:
  selector:
    app: pipeline
  ports:
  - port: 8081
    targetPort: 8080
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: pipeline
spec:
  ingressClassName: ingress
  rules:
  - host: ingress.pipeline.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: pipeline
            port:
              number: 8081


10.5.2 Harbor私服配置

在尝试用kubernetes的yml文件启动pipeline服务时,会出现Kubernetes无法拉取镜像的问题,这里需要在kubernetes所在的Linux中配置Harbor服务信息,并且保证Kubernetes可以拉取Harbor上的镜像

  • 设置Master和Worker的私服地址信息

42b54e6b6fea4e64a6771dcd1f1f981a.png

  • 在Kuboard上设置私服密文信息

1be3191b2a0b472d8e13edbae3731a33.png

按照复制指令的位置测试认证,效果如下 :

408c25613a344aed8f0c9a4da88c54e8.png

10.5.3 测试使用效果

执行kubectl命令,基于yml启动服务,并且基于部署后服务的提示信息以及Ingress的设置,直接访问

966e2916830d49559cdec7fee871675e.png

0ccb4282bc984cf5815fd68a14ecdf63.png

修改Windows的hosts表后访问,注意"/test’’

10.5.3 Jenkins远程调用
  • 将pipeline.yml配置到Gitlab中

34552072a48642d3a72b940b60bc687b.png

  • 配置Jenkins的目标服务器,可以将yml文件传输到K8s的Master上

11d33de059824b09816b5749d2d03f8f.png

  • 修改Jenkinsfile,重新设置流水线任务脚本,并测试效果

523d541c69a548548d4ae79d94728745.png

10f9fd748cc844ba9048443e45a13cba.png

a880266f171d471088ab05003118f771.png

查看k8smaster上是否接收到文件:

f5bf2800f25e430e87ff31d93cea32e2.png

  • 设置Jenkins无密码登录k8s-master

将Jenkins中公钥信息复制到k8s-master的~/.ssh/authorized_keys中,保证远程连接无密码

d151730f97a54251af1cafed1c47c685.png

  • 设置执行kubectl的脚本到Jenkinsfile,要写pipeline.yml的绝对路径

73881945eedb4827ae0deefe9884ac9c.png

红框里的路径一定要写绝对路径,否则会默认去找root所在目录下的pipeiline.yml文件。

  • 执行查看效果

d04c3393de874ae99129a367b0907d58.png

可以查看到yml文件是由变化的, 这样k8s就会重新加载

  • 查看效果

0e4af7a7bb4e4e818a6178ff6c8ad6d7.png

Ps:这种方式更适应与CD操作,将项目将基于某个版本部署到指定的目标服务器

// 所有脚本命令包含在pipeline{}中
pipeline {  
  // 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }
    // 存放所有任务的合集
    stages {
      // 单个任务
        stage('任务1:拉取git仓库代码') {
          // 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
    // 单个任务
        stage('任务2:通过maven构建项目') {
          // 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过sonarqube做代码质量检测') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:${tag} .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }
         stage('远程执行k8s-master的kubectl命令') {
            steps {
                sh 'ssh root@192.168.2.212 kubectl apply -f /usr/local/k8s/pipeline.yml'
            }
        }
    }
    post {
        success {
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        failure{
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}


10.6 基于GitLab的WebHooks

这里要实现自动化的一个CI操作,也就是开发人员Push代码到Git仓库后,Jenkins会自动的构建项目,将最新的提交点代码构建并进行打包部署,这里区别去上述的CD操作,CD操作需要基于某个版本进行部署,而这里每次都是将最新的提交点集成到主干上并测试。


10.6.1 WebHooks通知
  1. 开启Jenkins的自动构建
    构建触发器:
    下载插件GitLab

388f35ada44a439aa0e16734b0c66cff.png

配置构建触发器

51e5fafd85264b69bab7ddc468d1367e.png

2、设置Gitlab的Webhooks

设置network可以访问本地

4b541fd3e4ff4cec86419a3c6b5adc4c.png

输入URL,测试报错403

d30498bf561a40b09ea589c65a4282f2.png

3、关闭Jenkins的Gitlab认证

关闭Jenkins的Gitlab认证,需要插件[GitLab Authentication]

71943b9f796b44e58630b81b19505f7b.png

4、再次测试Gitlab

203d2417e0fe4a379e6644a9e8087673.png

10.6.2 修改配置

修改Jenkinsfile实现基于最新提交点实现持续集成效果,将之前引用${tag}的全部替换成latest

// 所有脚本命令包含在pipeline{}中
pipeline {  
  // 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }
    // 存放所有任务的合集
    stages {
      // 单个任务
        stage('任务1:拉取git仓库代码') {
          // 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
    // 单个任务
        stage('任务2:通过maven构建项目') {
          // 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过sonarqube做代码质量检测') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:latest .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:latest ${harborAddress}/${harborRepo}/${JOB_NAME}:latest
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest'''
            }
        }
         stage('任务6:将pipeline.yml文件通过publish over ssh传到k8smaster上') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('远程执行k8s-master的kubectl命令') {
            steps {
                sh 'ssh root@192.168.2.212 kubectl apply -f /usr/local/k8s/pipeline.yml'
            }
        }
    }
    post {
        success {
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        failure{
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}


修改pipeline.yml,更改镜像版本

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline
    spec:
      containers:
      - name: pipeline
        image: 192.168.2.211:80/repo/pipeline:latest   # 在harbor仓库中复制一个镜像取得
        command: ["/bin/bash", "-ce", "tail -f /dev/null"]   # 保持容器持续运行,而不是一致重启
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
# 省略其他内容…………


10.6.3 自动滚动更新

因为pipeline.yml文件没有改变时,kubectl每次不会重新加载apply,这样会导致Pod中的容器不会动态更新,这里需要使用kubectl的rollout restart命令滚动更新。代码一变化就会自动构建。


设置Jenkinsfle

97a9ed39d0bf47bd8da99423abf35fb5.png

8f59374c831b4a34b0e287ba0f2f2d26.png

// 所有脚本命令包含在pipeline{}中
pipeline {  
  // 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }
    // 存放所有任务的合集
    stages {
      // 单个任务
        stage('任务1:拉取git仓库代码') {
          // 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
    // 单个任务
        stage('任务2:通过maven构建项目') {
          // 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过sonarqube做代码质量检测') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:latest .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:latest ${harborAddress}/${harborRepo}/${JOB_NAME}:latest
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest'''
            }
        }
         stage('任务6:将pipeline.yml文件通过publish over ssh传到k8smaster上') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('远程执行k8s-master的kubectl命令') {
            steps {
                sh '''ssh root@192.168.2.212 kubectl apply -f /usr/local/k8s/pipeline.yml
ssh root@192.168.2.212 kubectl rollout restart deployment pipeline -n test'''
            }
        }
    }
    post {
        success {
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        failure{
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
13天前
|
Kubernetes 安全 容器
关于K8s,不错的开源工具
【10月更文挑战第12天】
|
16天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
61 2
|
2月前
|
Ubuntu Linux pouch
Docker容器管理工具
文章介绍了Docker容器管理工具,以及早期使用的LXC容器管理工具,包括它们的安装、使用和相关技术特点。
74 10
Docker容器管理工具
|
2月前
|
Linux pouch 容器
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
关于如何在CentOS 7.6操作系统上安装和使用阿里巴巴开源的Pouch容器管理工具的实战教程。
112 2
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
|
3月前
|
存储 Kubernetes Cloud Native
容器管理工具Containerd
容器管理工具Containerd
|
3月前
|
Prometheus Kubernetes 监控
揭秘Kubernetes的秘密武器库:十大工具让你的容器编排如虎添翼!探索这些神秘而强大的工具,它们将如何彻底改变你的Kubernetes体验?
【8月更文挑战第19天】在容器世界里,Kubernetes是部署与管理容器化应用的首选平台。为了增强其功能,本文精选了十大必备工具:Helm简化复杂应用部署;Prometheus监控系统与应用指标;Grafana提供数据可视化;Fluentd统一日志管理;Envoy实现服务间通信与控制;Calico确保网络连接安全;CoreDNS提升DNS服务性能;Velero保障数据安全与迁移;Argo Workflows执行复杂工作流;Istio强化服务网格功能。这些工具覆盖部署、监控、日志等多个方面,助力提升Kubernetes的效率与稳定性。
71 3
|
3月前
|
Prometheus 监控 安全
|
3月前
|
Kubernetes 监控 Shell
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
|
3月前
|
敏捷开发 缓存 前端开发
阿里云云效产品使用合集之前端打包时npm安装卡住一般是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。