Jenkins配合K8S更新pod
机器说明
192.168.218.133 k8s-master
192.168.218.129 centos
环境配置说明(centos机器上)
Jenkins ver. 2.156
Java version:1.8.0_342
Docker version:20.10.17
涉及的Linux 知识
sed : 更新、替换、删除文件中的内容
ssh: 多台机器之间联调调用
一、需求背景
需求: 进入jenkins配置项目,完成立即构建并且更新项目。
实现步骤:
- 需要多台机器配合
- K8S集群状态,一台CentOS安装jenkins
- 上传Harbor镜像,K8S集群完成镜像获取更新
二、完成两台机器之前免登录访问
目标: 完成两台机器免登录访问
分析:
- 1、需要centos机器访问 k8s-master 机器,那么就需要在k8s-master机器上生产 ssh-rsa密钥
- 2、将公钥 发送 到 centos机器上
- 3、反转同理(centos生成,发送到 k8s-master)
生成对称加密
- 加密方式选 rsa|dsa均可以,默认dsa
- 生成密钥,一路回车即可
ssh-keygen -t rsa
- 密钥路径生成后会自动保存在 /root/.ssh 文件下
- 会同步创建 id_rsa(私钥)、id_rsa.pub(公钥)
发送公钥到需要免密登录的服务器
简易做法
// 这一步会自动将公钥发送到指定服务器,并且会生成 authorized_keys 文件
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.218.133
稳妥做法
- 简易做法会覆盖 目标服务器 authorized_keys 文件,所以最好是copy数据
>(content) cat ~/.ssh/id_rsa.pub
>(k8s-master) vim ~/.ssh/authorized_keys
>(k8s-master) cat ~/.ssh/authorized_keys
- 如图做法
测试
- 在 centos 机器上执行以下命令,输出 111 并且不需要密码登录,标识免登录完成!
ssh root@192.168.218.133 "echo 111"
二、准备工作(centos机器上)
1、准备nginx 的index.html 文件
- 需要更改的是:
<h3>version:$0</h3>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是一个本地构建的nginx!!!</h1>
<h3>version:$0</h3>
</body>
</html>
2、准备Dockfile
FROM nginx
copy /home/dockerfile/nginx.html /usr/share/nginx/html/index.html
三、Jenkins 配置shell执行脚本
1、进入jenkins界面
- 前提是完成 Jenkins 安装
2、创建项目
3、配置项目
# 删除随机值,设置随机版本数据
unset nginxHtml2Version
nginxHtml2Version=$RANDOM
# 修改文件
sed -i "9c <h3>version:$nginxHtml2Version</h3>" /home/dockfile/nginx.html
# build docker file
docker build -t nginxhtml-$nginxHtml2Version -f DockerfileNginxHtml .
# docker login 登录harbor镜像仓库
docker login harbor.vip.com -u admin -p xxxxxx
# tag 给镜像打上tag
docker tag nginxhtml-$nginxHtml2Version harbor.vip.com/nginx/nginxhtml-$nginxHtml2Version
# push harbor镜像仓库
docker push harbor.vip.com/nginx/nginxhtml-$nginxHtml2Version
# docker删除多个镜像
docker rmi -f nginxhtml-$nginxHtml2Version harbor.vip.com/nginx/nginxhtml-$nginxHtml2Version
# 将版本号传送到 k8s-master
ssh root@192.168.218.133 "echo $nginxHtml2Version > /home/k8s/deploy/nginxhtml/nginxhtml.v"
# 执行shell脚本,完成yml的更新
ssh root@192.168.218.133 "/home/k8s/deploy/nginxhtml/nginxhtml.sh"
四、k8s-mater
1、更新nginx版本的 shell 文件
- nginxhtml.sh
# 获取版本号
version=$(cat /home/k8s/deploy/nginxhtml/nginxhtml.v)
# 更新文件
sed -i "s/harbor.vip.com\/nginx\/nginxhtml.*/harbor.vip.com\/nginx\/nginxhtml\-$version/g" /home/k8s/deploy/nginxhtml/nginxhtml.yml
# apply
kubectl apply -f /home/k8s/deploy/nginxhtml/nginxhtml.yml
2、yaml文件
- nginxhtml.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-html
spec:
selector:
matchLabels:
app: nginx-html
version: v1
replicas: 3
template:
metadata:
labels:
app: nginx-html
version: v1
spec:
containers:
- name: nginx-html
image: harbor.vip.com/nginx/nginxhtml-25947
imagePullPolicy: IfNotPresent
ports:
- name: nginx-html
containerPort: 80
protocol: TCP
# 如果没有这个配置,在 docker pull harbor的时候需要docker login
# kubectl create secret docker-registry
imagePullSecrets:
- name: harbor-registry
---
# SVC
apiVersion: v1
kind: Service
metadata:
name: nginx-html-service
labels:
app: nginx-html
spec:
type: NodePort
ports:
- name: http
port: 80
selector:
app: nginx-html
五、执行操作查看是否有误
1、Jenkins执行日志
2、查看 kubectl 结果
3、访问地址
- http://192.168.218.133:32082