DevOps实现CI/CD实战(六)- Jenkins集成k8s
十、 Jenkins集成k8s
Jenkins在集成K8s之前,需要搭建k8s集群,具体搭建步骤,完整笔记
https://github.com/ITenderL/ITenderL.github.io/tree/main/docs/DevOps,
包括完整的DevOps的笔记。
1. 准备部署的yml文件
pipeline.yml
apiVersion: apps/v1
kind: Deployment
metadata:namespace: testname: pipelinelabels:app: pipeline
spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metadata:labels:app: pipelinespec:containers:- name: pipelineimage: harbor.com/sswang/pipeline:v4.0.0imagePullPolicy: Alwaysports:- containerPort: 8080---
apiVersion: v1
kind: Service
metadata:namespace: testname: pipelinelabels:app: pipeline
spec:selector:app: pipelineports:- port: 8082targetPort: 8080type: NodePort---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:namespace: testname: pipeline
spec:ingressClassName: nginxrules:- host: pipeline.test.comhttp:paths:- path: /pathType: Prefixbackend:service:name: pipelineport:number: 8082
2. 配置Docker私服
在尝试用kubernetes的yml文件启动pipeline服务时,会出现Kubernetes无法拉取镜像的问题,这里需要在kubernetes所在的Linux中配置Harbor服务信息,并且保证Kubernetes可以拉取Harbor上的镜像。
填写你的harbor地址信息,填写完成后下面会生成一行命令,复制命令到你的kube服务器运行,看是否可以登录成功,登陆成功就ok了
如果不成功,要检查一下你的daemon.json的配置
{"exec-opts": ["native.cgroupdriver=systemd"],# docker私服地址,把你的harbor地址加到这里"insecure-registries": ["kubernetes-register.sswang.com", "harbor.com"],"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerhub.icu","https://registry.aliyuncs.com","https://docker.nju.edu.cn"]
}
配置完成后,再次启动你的pipeline.yml
# 删除
kubectl delete -f pipeline.yml
# 启动
kubectl apply -f pipeline.yml
部署成功后,查看状态
[root@master ~]# kubectl get all -n test
NAME READY STATUS RESTARTS AGE
pod/pipeline-647d4585fb-qh292 1/1 Running 0 48mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/pipeline NodePort 10.96.126.239 <none> 8082:32562/TCP 48mNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/pipeline 1/1 1 1 48mNAME DESIRED CURRENT READY AGE
replicaset.apps/pipeline-647d4585fb 1 1 1 48m
然后访问192.168.201.111:32562
3. Jenkins配置k8s
- 在系统配置下面添加publish over ssh 配置,配置完成后,应用保存
-
- 修改pipeline任务配置
修改项目中Jenkinsfile中publish over ssh步骤的配置命令,到pipeline语法中生成
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)])
然后修改项目中的Jenkinsfile的配置,用下面的配置,替换原来publish over ssh的配置
stage('将部署的yml文件传送到k8s-master节点') {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)])}}
修改代码返回5.0.0,然后打标签v5.0.0,,然后构建看是否可以将pipeline文件传送到k8s服务器
[root@master k8s]# ls /usr/local/k8s/
pipeline.yml
# 文件已经传到目标服务器了,然后执行文件
- 运行pipeline.yml
如何运行pipeline.yml,使用shell命令的方式会需要输入密码
[root@master ~]# ssh root@192.168.201.120 kubectl ap -f /usr/local/k8s/pipeline.yml
root@192.168.201.120's password:
因此只能使用ssh的无密码登录方式,让Jenkins容器内部以无密码的方式连接到k8s的master节点,绝体步骤如下
- 进入Jenkins容器内部
[root@clear jenkins_docker]# docker exec -it jenkins bash
jenkins@e96108b4b77b:/$ cd ~
# 找到隐藏的文件.ssh
jenkins@e96108b4b77b:~$ ls -a
.sshjenkins@e96108b4b77b:~$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC86IaWBtwJkhlAEH4WYoMUAg8acBZGiM13BZPTsHeqM541lKp02qcgvk8RBd9Zg2ykmeCH6qkPNLTVPzqfR75bnOFD7ZZ3q/A0Yl6h06NzoxFAIAepuXdy+hF+IK3ORScl1pOsFq8TQAWtQWN2UTPYJ7xORW8w/2hgwXKffwzTj1uuA2PZDpoQanSyx1N0qV+/t2omFRFscV1BkhiZvNKa7Pifesd3m24y/uFykZTE8/YCn8Bjbvlj1AH77vdgkkrCXjFJZeqWVLYcpLEGVqUt9tklDI9XkEf6gE/ut+QWtB5HHN+pfW95MFkFY/78i4KXNDUT7+Ogix0AqvUKyhriMOUx8KaAfLCUAWNtrmC+mLQwPFyyJN1EEiCNYWb6OJ5G9geH1YvrzoRfcpLk/k6pmsbkrpJdxh2ZSQqwdvTnxWNDMjnJLRw4OE6rRMp57qWecFnqJuaJN1z43Cdk2wo9J/Ve6f02vXAN0iTFK6t6xAF9E5+lBbKps9FRoLz/3njqWcrMlFQ3jKO2IvL/JJKe+fNbc6VHGT0BPc2TQ4nay24I7KAqfLhLqkrpuhOHbPoj7dO3yr5zzu0I9Z78gPsRpM2BOmaEE+Q2WXKyGUZmsr3IWdy9V/l4IwxYRlNUxjvUxbetkbvRRP8rT48JhsJYeZfHAekgpsVnHKJMsTYnAQ== your_email@example.com# 如果没有则自己生成,生成方式如下
在设置SSH服务时,生成SSH密钥(公钥和私钥)是一个常见的任务。这些密钥用于安全地进行身份验证,无需输入密码。以下是如何生成SSH密钥的步骤:
- 生成SSH密钥对
首先,您需要在客户端机器上生成一个SSH密钥对。使用ssh-keygen命令来生成密钥对。ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
-t rsa:指定密钥类型为RSA。
-b 4096:指定密钥长度为4096位。
-C “your_email@example.com”:添加注释(通常是您的电子邮件地址),这有助于识别密钥。
执行上述命令后,系统会提示您输入文件名以保存密钥(默认情况下保存在~/.ssh/id_rsa中),以及是否设置密码短语。设置密码短语可以增加额外的安全层,但也可以留空以便免密码连接。
- 查看生成的密钥文件
生成密钥对后,您的SSH目录(通常是~/.ssh)中将包含以下两个文件:id_rsa:私钥文件。
id_rsa.pub:公钥文件。
- 将公钥复制到远程服务器
要使用SSH密钥登录到远程服务器,需要将生成的公钥添加到远程服务器上的~/.ssh/authorized_keys文件中。可以使用ssh-copy-id命令来完成此操作:ssh-copy-id user@remote_host
user:远程服务器上的用户名。
remote_host:远程服务器的IP地址或域名。
此命令会提示您输入远程服务器用户的密码,并将公钥自动复制到远程服务器的~/.ssh/authorized_keys文件中。
- 手动复制公钥 (可选)
如果无法使用ssh-copy-id,也可以手动复制公钥。首先查看公钥内容:cat ~/.ssh/id_rsa.pub
然后,将输出的内容复制并粘贴到远程服务器上的~/.ssh/authorized_keys文件中。确保文件权限正确:
在远程服务器上执行
mkdir -p ~/.ssh chmod 700 ~/.ssh echo "your_public_key" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
- 测试SSH连接
完成上述步骤后,您应该能够使用SSH密钥进行无密码登录:ssh user@remote_host
如果一切正常,您将直接登录到远程服务器,而不需要输入密码。
- 配置SSH客户端(可选)
为了更方便地管理多个SSH连接,可以在本地机器的~/.ssh/config文件中配置SSH客户端:Host remote_host_alias HostName remote_host User user IdentityFile ~/.ssh/id_rsa
这样,您可以通过别名进行连接:
ssh remote_host_alias
通过以上步骤,您可以生成SSH密钥并配置SSH服务,以便实现更加安全和便捷的无密码登录
- 来到k8s的master节点用户目录下.ssh文件夹,把jenkins的公钥放到.ssh文件夹下的authorized_keys文件中
[root@master ~]# cd ~
[root@master ~]# ls -a
. anaconda-ks.cfg .bash_logout .bashrc .config deploy-nginx.yml ingress kuboard-v3.yaml pipeline.yml .ssh .viminfo
.. .bash_history .bash_profile .cache .cshrc .docker .kube nginx-tomcat.yml .pki .tcshrc
[root@master ~]# cd .ssh
[root@master .ssh]# ls
known_hosts
[root@master .ssh]# touch authorized_keys
[root@master .ssh]# vim authorized_keys
# 复制密钥到文件中保存即可jenkins@e96108b4b77b:~$ ssh root@192.168.201.120 sfs
bash: sfs: command not found
jenkins@e96108b4b77b:~$
下面就可以在Jenkins中执行k8s的命令了,来到jenkins中添加配置,生成pipeline命令
修改项目中Jenkinsfile文件,在执行步骤中添加一个步骤,然后去Jenkins构建
stage('远程执行k8s-master节点的kubectl命令') {steps {sh 'ssh root@192.168.201.120 kubectl apply -f /usr/local/k8s/pipeline.yml'}}
最后成功部署了
相关文章:

DevOps实现CI/CD实战(六)- Jenkins集成k8s
十、 Jenkins集成k8s Jenkins在集成K8s之前,需要搭建k8s集群,具体搭建步骤,完整笔记 https://github.com/ITenderL/ITenderL.github.io/tree/main/docs/DevOps, 包括完整的DevOps的笔记。 1. 准备部署的yml文件 pipeline.yml …...

张雪峰:物联网行业迎高光时刻!如何选择?我们诚聘销售工程师!
作为一间10多年的物联网公司,各位求职人士可以看看我们其中一个招聘要求,和自己需求结合分析分析,希望对你们有所帮助。 【公司实力底蕴】 盈电智控物联网科技(广东)有限公司,2024年7月成立,是…...

利用多文件编程实现顺序表的创建,判满,插入,输出
文章目录 🍊自我介绍🍊利用多文件编程实现顺序表的创建,判满,插入,输出seqlist.cseqlist.hmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连ÿ…...

百度快照劫持之JS劫持诊断与恢复一例
劫持现象: 百度搜索结果中,被劫持网站出现在搜索结果中, 点击进入网站,网站显示正常,数秒后网站自动跳转到彩票网站f51688.com/ff6/。但是第二次点击搜索结果,正常进入网站缺不会跳转到彩票网站。 初步认…...

深入探讨Go语言中的切片与数组操作
在编程世界中,数组一直是非常流行的数据结构,主要有两个原因:其一是简单易懂,其二是非常灵活,可以存储多种不同类型的数据。在Go语言中,数组的用法有其独特的特点,但与此同时,Go语言…...

【WPS Excel】复制表格时,提示“图片太大,超过部份将被截去“ 问题
WPS表格 2019版本 升级到 WPS最新版 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 使用最新版就能够解决这个问题,如果仍旧无法解决可以勾选如下配置 重启Excel解决。 请勾选:文件 - 选项 - 编辑 - 不提示且不压缩文件中的图像...

驱动(RK3588S)第九课时:多节点驱动与函数接口
目录 一、多节点概念1、所用到的结构体说明2、函数接口主要是read和write函数2.1、把应用层的数据拷贝给底层2.2、把应用层的数据拷贝给底层 3、应用层的read和write函数4、底层的read和write函数二、ioctl控制命令接口1、概念2、函数介绍应用层和驱动层 三、代码与现象1.编写L…...

Linux系统下配置MySQL
1. 寻找MySQL的配置文件 MySQL的配置文件通常位于以下位置: 在大多数Linux系统上,主配置文件通常位于/etc/mysql/my.cnf或/etc/my.cnf。在macOS上,如果你使用Homebrew安装MySQL,配置文件通常位于/usr/local/etc/my.cnf。在Window…...

信捷 XD PLC POU编程之FB
在使用信捷的POU方式编程,可以建立两种POU:FB和FC。 FB和FC这两种POU又各自可以建立梯形图语言POU和C语言POU。 函数块(FB)是把反复使用的部分程序块转换成一种通用部件,他可以在程序中反复被调用,不仅 提高了程序的开…...

终于有人把云计算、大数据和人工智能讲明白了!
引言 在当今数字化时代,云计算、大数据和人工智能成为了全球科技界的热门话题。这些技术的迅猛发展以及应用范围的不断扩大,正深刻地改变着我们的生活和工作方式。云计算为我们提供了有效的计算和存储能力,大数据则以海量的信息资源为基础&a…...

【编程底层思考】详解Java内存模型(JMM)原理及其作用
Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)的一个核心概念,它定义了Java程序中各种变量(线程共享变量)的访问规则,以及在并发环境下,为了确保数据的可见性、…...

Docker的基本概念和优势
Docker是一个开源的容器化平台,它可以将应用程序及其所有依赖项和运行环境打包到一个称为容器的独立单元中。容器化使得应用程序在不同的环境中可以以相同的方式运行,并且更加轻量级和可移植。 Docker的基本概念包括以下几点: 镜像…...

数据结构————内核链表
内核链表是Linux内核中广泛使用的一种数据结构,它具有以下特点: 1.双向循环链表:每个节点包含两个指针,一个指向前驱节点(prev),另一个指向后继节点(next),…...

使用API接口获取某宝商品数据详情
什么是淘宝API接口? 淘宝API接口是淘宝开放平台为开发者提供的一种应用程序接口。它允许开发者通过编程方式,安全、高效地与淘宝平台进行数据交互,从而获取商品详细信息、用户信息、订单信息等多种数据。这些接口不仅简化了数据获取流程&…...

用Python实现时间序列模型实战——Day 15: 时间序列模型的选择与组合
一、学习内容 1. 模型选择的标准与方法(如 AIC、BIC) 在时间序列建模中,模型的选择是非常重要的,常用的模型选择标准包括 AIC (Akaike Information Criterion) 和 BIC (Bayesian Information Criterion)。 AIC (Akaike Informat…...

大数据之Flink(五)
15、Flink SQL 15.1、sql-client准备 启用Hadoop集群(在Hadoop100上) start-all.sh启用yarn-session模式 /export/soft/flink-1.13.0/bin/yarn-session.sh -d启动sql-client bin/sql-client.sh embedded -s yarn-sessionsql文件初始化 可以初始化模式、环境(流/批…...

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析
查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但…...

基于 jenkins 的持续测试方案
CI/CD Continuous Integration; Continuous Deployment; 持续集成,将新代码和旧代码一起打包、构建;持续部署,将新构建的包进行部署;持续测试,将新代码、新单元测试一起测试;方案: 公有云DevO…...

我算见识到算法岗transformer面试的难度了
在面试算法岗的时候看到了这篇Transformer面试题,作者梳理一些关于Transformer的知识点,还会陆续更新最新的面试题和讲解答案! 也算是见识到了transformer的面试难度了 1.Transformer为何使用多头注意力机制?(为什么不使用一个头) 2.Tra…...

CommonCollections1
CommonCollections1链 CommonCollections1poc展示调用链分析AbstractInputCheckedMapDecoratorTransformedMapChainedTransformerConstantTransformerInvokerTransformer poc分析通过反射实现Runtime.getRuntime().exec("calc.exe")forNamegetMethodinvoke 依据反射构…...

6、关于Medical-Transformer
6、关于Medical-Transformer Axial-Attention原文链接:Axial-attention Medical-Transformer原文链接:Medical-Transformer Medical-Transformer实际上是Axial-Attention在医学领域的运行,只是在这基础上增加了门机制,实际上也就…...

19_单片机开发常用工具的使用
工欲善其事必先利其器,我们做单片机开发的时候,不管是调试电路还是调试程序,都需要借助一些辅助工具来帮助查找和定位问题,从而帮助我们顺利解决问题。没有任何辅助工具的单片机项目开发很可能就是无法完成的任务,不过…...

最新版微服务项目搭建
一,项目总体介绍 在本项目中,我将使用alibabba的 nacos 作为项目的注册中心,使用 spring cloud gateway 做为项目的网关,用 openfeign 作为服务间的调用组件。 项目总体架构图如下: 注意:我的Java环境是17…...

spring揭秘19-spring事务01-事务抽象
文章目录 【README】【1】事务基本元素【1.1】事务分类 【2】java事务管理【2.1】基于java的局部事务管理【2.2】基于java的分布式事务管理【2.2.1】基于JTA的分布式事务管理【2.2.2】基于JCA的分布式事务管理 【2.3】java事务管理的问题 【3】spring事务抽象概述【3.1】spring…...

基于Matlab的图像去雾系统(四种方法)关于图像去雾的基本算法代码的集合,方法包括局部直方图均衡法、全部直方图均衡法、暗通道先验法、Retinex增强。
基于Matlab的图像去雾系统(四种方法) 关于图像去雾的基本算法代码的集合,方法包括局部直方图均衡法、全部直方图均衡法、暗通道先验法、Retinex增强。 所有代码整合到App designer编写的GUI界面中,包括导入图片,保存处…...

油猴插件录制请求,封装接口自动化参数
参考:如何使用油猴插件提高测试工作效率 一、背景 在酷家乐设计工具测试中,总会有许多高频且较繁琐的工作,比如: 查询插件版本:需要打开Chrome控制台,输入好几个命令然后过滤出版本信息。 查询模型商品&…...

循环购模式!结合引流和复购于一体的商业模型!
欢迎各位朋友,我是你们的电商策略顾问吴军。今天,我将向大家介绍一种新颖的商业模式——循环购模式,它将如何改变我们的消费和收益方式。你是否好奇,为何商家会提供如此慷慨的优惠?消费一千元,不仅能够得到…...

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧
Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用&…...

c中 int 和 unsigned int
c语言中,char、short、int、int64以及unsigned char、unsigned short、unsigned int、unsigned int64等等类型都可以表示整数。但是他们表示整数的位数不同,比如:char/unisigned char表示8位整数; short/unsigned short表示16位整…...

sheng的学习笔记-AI-话题模型(topic model),LDA模型,Unigram Model,pLSA Model
AI目录:sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是话题模型(topic model) 话题模型(topic model)是一族生成式有向图模型,主要用于处理离散型的数据(如文本集合),在信息检索、自然语言处理等领域有广泛应用…...