在K8s平台部署项目流程




网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化运维



在K8s平台部署Java网站项目



制作镜像流程



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_java_02



第一步:制作镜像


使用镜像仓库(私有仓库、公共仓库):
1、配置可信任(如果仓库是HTTPS访问不用配置)
# vi /etc/docker/daemon.json
{
"insecure-registries": ["192.168.31.90"]
}
2、 将镜像仓库认证凭据保存在K8s Secret中
kubectl create secret docker-registry registry-auth \
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-server=192.168.31.90
3、在yaml中使用这个认证凭据
imagePullSecrets:
- name: registry-auth


第二步:使用控制器部署镜像


模板



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_jenkins_03


Pod主要配置启动容器属性:


• 变量

• 资源配额

• 健康检查

• 卷挂载点


案例:



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_java_04


第三步:部署数据库


1、使用deployment部署一个mysql实例, service暴露访


kubectl apply -f mysql.yaml
kubectl get pod,svc


2、测试mysql实例是否可以访问


kubectl run mysql-client --rm -it --image=mysql:5.7.30 – bash
/# mysql -h10.106.166.31 -uroot -p'123456' #10.106.166.31为mysql ClusterIP
mysql> show databases;


3、导入项目sql文件


kubectl cp db/tables_ly_tomcat.sql mysql-client:/ # 将sql文件拷贝到mysql客户端容器中
/# mysql -h10.106.166.31 -uroot -p'123456'
mysql> create database test;
mysql> use test;
mysql> source /tables_ly_tomcat.sql;
mysql> show tables; # 只有一个user表


第四步:对外暴露应用



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_jenkins_05


第五步:增加公网负载均衡器



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_jenkins_06



Jenkins自动化发布项目(CI/CD)

发布流程设计



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化运维_07


使用 Gitlab 作为代码仓库 & 使用 Harbor 作为镜像仓库


Harbor 镜像仓库


项目地址: https://github.com/goharbor/harbor


部署步骤:


# tar zxvf harbor-offline-installer-v2.0.0.tgz
# cd harbor
# cp harbor.yml.tmpl harbor.yml

# vi harbor.yml

hostname: 192.168.31.90
https: # 先注释https相关配置
harbor_admin_password: Harbor12345

# ./prepare
# ./install.sh
# docker-compose ps


Gitlab代码仓库



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_jenkins_08


Jenkins发布系统部署

Jenkins是一款开源 CI&CD 系统,用于自动化各种任务,包括构建、测试和部署。

Jenkins官方提供了镜像: ​​Docker​​ 使用Deployment来部署这个镜像,会暴露两个端口: 8080 Web访问端口, 50000 Slave通 信端口,容器启动后Jenkins数据存储在/var/jenkins_home目录,所以需要将该目录使用 PV持久化存储。

先安装后面所需的插件:


Jenkins下载插件默认服务器在国外,会比较慢,建议修改国内源:


# 进入到nfs共享目录

cd /ifs/kubernetes/ops-jenkins-pvc-xxx
sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && \
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json


# 重建Jenkins


http://NodeIP:30008/restart


管理Jenkins->系统配置-->管理插件-->分别搜索Git Parameter/Git/Pipeline/kubernetes/Config File Provider, 选中点击安装。



• Git:拉取代码

• Git Parameter: Git参数化构建

• Pipeline:流水线

• kubernetes:连接Kubernetes动态创建Slave代理

• Config File Provider: 存储配置文件

• Extended Choice Parameter:扩展选择框参数,支持多选



Jenkins主从架构



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_java_09



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_jenkins_10


当触发Jenkins任务时, Jenkins会调用Kubernetes API创建 Slave Pod, Pod启动后会连接Jenkins,接受任务并处理。



Kubernetes插件配置


Kubernetes插件: 用于Jenkins在Kubernetes集群中运行动态代理


插件介绍: https://github.com/jenkinsci/kubernetes-plugin


配置插件: 管理Jenkins->管理Nodes和云->管理云->添加Kubernetes



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化流水线_11


自定义Jenkins-Slave镜像

构建Slave镜像Dockerfile(结合项目环境)


FROM centos:7
LABEL maintainer lizhenliang
RUN yum install -y java-1.8.0-openjdk maven git libtool-ltdl-devel && \
yum clean all && \
rm -rf /var/cache/yum/* && \
mkdir -p /usr/share/jenkins
COPY slave.jar /usr/share/jenkins/slave.jar
COPY jenkins-slave /usr/bin/jenkins-slave
COPY settings.xml /etc/maven/settings.xml
RUN chmod +x /usr/bin/jenkins-slave
COPY kubectl /usr/bin/
ENTRYPOINT ["jenkins-slave"]



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化流水线_12



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化运维_13


测试主从架构是否正常



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_java_14



Jenkins Pipeline(流水线)


Jenkins Pipeline是一套运行工作流框架,将原本独立运行单个或者多个节点 的任务链接起来,实现单个任务难以完成的复杂流程编排和可视化。


• Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成和持续交付;

• Pipeline通过特定语法对简单到复杂的传输管道进行建模;

• Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化流水线_15


Jenkins Pipeline 语法



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_java_16


Stages 是 Pipeline 中最主要的组成部分, Jenkins 将会按照 Stages 中描述的顺序 从上往下的执行。


• Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,

比如: Build、 Test、 Deploy



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_jenkins_17


Jenkins 流水线自动发布项目

思路-项目部署流程



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化运维_18


在实际工作中,会维护多个项目,如果每个服务都创建一个item,势必给运维维护成 本增加很大, 因此需要编写一个通用Pipeline脚本,将这些项目部署差异化部分使用 Jenkins参数化,人工交互确认发布的分支、副本数、命名空间等。



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化运维_19


部署到K8s平台-思路

将部署项目yaml文件提交到项目代码仓库里,在Slave容器里使用kubectl apply部署。

由于kubectl使用kubeconfig配置文件连接k8s集群,还需要通过Config File Provider插件将kubeconfig配置文件存储到Jenkins,然后再挂载到Slave容器中, 这样就有权限部署了(kubectl apply deploy.yaml --kubeconfig=config)


注:为提高安全性, kubeconfig文件应分配权限



除了上述方式,还可以使用Kubernetes Continuous Deploy插件, 将资源配置(YAML) 部署到Kubernetes,这种不


是很灵活性



流水线脚本与源代码一起版本管理


Jenkinsfile文件建议与源代码一起版本管理,实现流水线即代码 (Pipeline as Code)。


这样做的好处:


• 自动为所有分支创建流水线脚本


• 方便流水线代码复查、追踪、迭代


• 可被项目成员查看和编辑



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_自动化流水线_20


Jenkins从Git仓库中读取Jenkinsfile



k8s容器云平台架构



网站项目部署在k8s案例与Jenkins自动化发布项目(CI/CD)_k8s项目部署_21