在K8s平台部署项目流程
在K8s平台部署Java网站项目
制作镜像流程
第一步:制作镜像
使用镜像仓库(私有仓库、公共仓库):
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
第二步:使用控制器部署镜像
模板
Pod主要配置启动容器属性:
• 变量• 资源配额• 健康检查• 卷挂载点
案例:
第三步:部署数据库
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表
第四步:对外暴露应用
第五步:增加公网负载均衡器
Jenkins自动化发布项目(CI/CD)
发布流程设计
使用 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代码仓库
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主从架构
当触发Jenkins任务时, Jenkins会调用Kubernetes API创建
Slave Pod, Pod启动后会连接Jenkins,接受任务并处理。
Kubernetes插件配置
Kubernetes插件: 用于Jenkins在Kubernetes集群中运行动态代理
插件介绍: https://github.com/jenkinsci/kubernetes-plugin
配置插件: 管理Jenkins->管理Nodes和云->管理云->添加Kubernetes
自定义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"]
测试主从架构是否正常
Jenkins Pipeline(流水线)
Jenkins Pipeline是一套运行工作流框架,将原本独立运行单个或者多个节点
的任务链接起来,实现单个任务难以完成的复杂流程编排和可视化。
• Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成和持续交付;• Pipeline通过特定语法对简单到复杂的传输管道进行建模;• Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。
Jenkins Pipeline 语法
Stages 是 Pipeline 中最主要的组成部分, Jenkins 将会按照 Stages 中描述的顺序
从上往下的执行。
• Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如: Build、 Test、 Deploy• Steps:步骤, Steps 是最基本的操作单元,可以是打印一句话,也可以是构建一 个 Docker 镜像,由各类 Jenkins 插件提供,比如命令: sh ‘mvn',就相当于我 们平时 shell 终端中执行 mvn命令一样 。
Jenkins 流水线自动发布项目
思路-项目部署流程
在实际工作中,会维护多个项目,如果每个服务都创建一个item,势必给运维维护成
本增加很大, 因此需要编写一个通用Pipeline脚本,将这些项目部署差异化部分使用
Jenkins参数化,人工交互确认发布的分支、副本数、命名空间等。
部署到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)。
这样做的好处:
• 自动为所有分支创建流水线脚本
• 方便流水线代码复查、追踪、迭代
• 可被项目成员查看和编辑