容器化部署搭建
CI/CD流程图
华为云k8s集群搭建
第一步:购买k8s集群及对应的work节点(配置可以参考uat环境的配置参数)
环境清单列表
字段名 | 类型 | 配置 | 备注 |
云容器引擎 | 包年包月 | 虚拟机集群(高可用)1-50节点 | open-dev k8s集群 |
弹性云服务器 | 包年包月 | 内存优化型-m3.large.8-2vCPUs-16GB-linux高IO-40GB高IO-100GB | k8s集群节点 |
关系型数据库 | 包年包月 | 数据库引擎MySQL 5.7-存储空间超高IO,100GB | 数据库 |
弹性公网IP | 包年包月 | 带宽大小 (Mbit/s) 5 | 数据库连接公网IP |
弹性公网IP | 包年包月 | 带宽大小 (Mbit/s) 5 | 自动化应用部署访问公网IP |
对象存储服务 | 包年包月 | 100GB、公网下行流量包 100GB、CDN回源流量1TB,3AZ存储包100GB | OSS文件服务器 |
云服务器 | 包年包月 | 内存优化型-m3.large.8-4vCPUs-8GB-linux高IO-40GB高IO-100GB | jenkins部署 |
NAT网关 | 按需 | 集群网络通信 |
CI/CD环境搭建步骤
一、jenkins部署
copy文件到linux服务器
启动命令:nohup java -jar jenkins.war &
访问地址
http://ip:8080
设置登录密码
编写脚本
流水线脚本备注
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('GitLab拉取代码') {
steps{
echo"git pull from ${REPOSITORY}"
git branch: "${BRANCH}", credentialsId: '76ed55e0-9507-43b3-896f-7f0d25e03e89', url: "${REPOSITORY}"
}
}
stage ("静态代码检查") {
steps {
echo "start code check"
}
}
stage('Gradle构建') {
steps{
echo"gradle build"
sh "gradle clean build -x test"
}
}
stage('Docker构建镜像') {
steps{
echo"docker image"
sh "${SCRIPT_DIR}/newbuild.sh ${MODULE} ${ENV} ${BUILD_NUMBER}"
}
}
stage('更新服务') {
steps {
echo "update service "
sh "${SCRIPT_DIR}/deploy.sh ${MODULE} ${ENV} ${PROFILE} ${BUILD_NUMBER}"
}
}
}
}
二、linux 环境下安装git
yum安装
yum install -y git
配置拉取代码授权
设置用户名和email
git config --global user.name "xxxxx"
git config --global user.email "xxxx@qq.com"
生成ssh key
ssh-keygen -t rsa -C "xxxx@qq.com"
jenkins拉取代码的脚本
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('npm构建') {
steps{
echo"npm build"
sh "npm install;npm run build"
}
}
}
三、安装GitBook(用户构建开放平台的OpenApi文档)
构建服务器上安装Gitbook
npm install gitbook-cli
jenkinsGitbook构建脚本
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('gitbook构建') {
steps{
echo"gitbook build"
sh "gitbook install;gitbook build;"
}
}
}
}
四、Jenkisn-nodejs构建环境/yarn前端构建环境
nodejs构建环境
下载linuxgradle包
wget https://nodejs.org/dist/v9.8.0/node-v9.8.0-linux-x64.tar.xz
解压安装包
xz -d node-v9.8.0-linux-x64.tar.xz
tar -xvf node-v9.8.0-linux-x64.tar
进入目录下
cd [文件名]
配置软链接
ln -s /opt/nodejs/node-v9.8.0-linux-x64/bin/node /usr/local/bin/node
ln -s /opt/nodejs/node-v9.8.0-linux-x64/bin/npm /usr/local/bin/npm
验证是否成功
node -v
npm -v
jenkins-nodejs构建脚本
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('npm构建') {
steps{
echo"npm build"
sh "npm build;npm run build"
}
}
}
}
yarn构建环境安装
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum install -y yarn
jenkins-yarn构建脚本
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('yarn 构建') {
steps{
echo"yarn build"
sh "yarn;npm run build"
}
}
}
}
五、Jenkisn-Gradle构建环境搭建
用wget下载
wget https://downloads.gradle.org/distributions/gradle-3.2.1-all.zip
解压文件
unzip [文件名]
修改环境变量
vim /etc/profile
放到文件最后
PATH=$PATH:/opt/gradle/gradle-3.5/bin
export PATH
刷新环境
source /etc/profile
验证是否生效
gradle -v
jenkins-Gradle构建脚本
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('Gradle构建') {
steps{
echo"gradle build"
sh "gradle clean build -x test"
}
}
}
}
六、Jenkisn-Docker构建环境搭建
docker安装
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务:
sudo systemctl start docker
docker链接远程仓库
首先登录
greentown账户的密钥
秘钥Id(AK)
2LBNTxxxRVXKUSURGS11
秘钥(SK)
Eea3or111XCYBO2225CPUj2DN7tRbx2222vRqc
配置秘钥(在Linux服务器上输入此命令)
printf "2LBNTxxxRVXKUSURGS11" | openssl dgst -binary -sha256 -hmac "Eea3or111XCYBO2225CPUj2DN7tRbx2222vRqc" | od -An -vtx1 | sed 's/[ \n]//g' | sed 'N;s/\n//'
秘钥:851ded7994233H42453233426b2542a31bbcf370bacc82c9404bb45bf3f83ed3
docker login -u [区域项目名]@[AK] -p [登录密钥] [镜像仓库地址]
范例:docker login -u cn-east-3@2LBNTxxxRVXKUSURGS11 -p 851ded7994233H42453233426b2542a31bbcf370bacc82c9404bb45bf3f83ed3 swr.cn-east-3.myhuaweicloud.com
Docker构建镜像
docker build -t [镜像仓库地址][镜像仓库][镜像:版本] -f [docker名字] .
Docker镜像推送
docker push [镜像仓库地址][镜像仓库][镜像:版本]
jenkins-Docker构建脚本
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('Docker构建镜像') {
steps{
echo"docker image"
sh "${SCRIPT_DIR}/newbuild.sh ${MODULE} ${ENV} ${BUILD_NUMBER}"
}
}
}
}
newbuild.sh脚本
MODULE=$1
ENV=$2
VERSION=$3
DOCKERFILE=$4
#IMAGE_NAME=[区域域名]/[组织]/[镜像名]:[版本]
IMAGE_NAME=swr.cn-east-3.myhuaweicloud.com/greentown/${MODULE}:${VERSION}
if [ ! -n "${DOCKERFILE}" ] ;then
docker build -t ${IMAGE_NAME} .
else
docker build -t ${IMAGE_NAME} -f ${DOCKERFILE} .
fi
docker push ${IMAGE_NAME}
echo "${IMAGE_NAME}" > IMAGE_NAME
echo "镜像${IMAGE_NAME}生成成功"
七.客户端kubectl安装(华为云CCE集群管理里面有安装步骤说明)
首先下载k8s集群对应的kubectl
把文件放到服务的home路径下
cd /home
chmod +x kubectl
mv -f kubectl /usr/local/bin
mkdir -p $HOME/.kube
mv -f kubeconfig.json $HOME/.kube/config
根据使用场景,按需切换kubectl的访问模式
VPC网络内接入访问请执行此命令
kubectl config use-context internal
互联网接入访问请执行此命令
kubectl config use-context external
触发更新命令
部署命令(测试)-kubectl 提供多种远程更新镜像的命令
#kubectl --kubeconfig [集群配置文件] set image -n [命名空间] deploy/[pod名称] [容器名]=[新的镜像地址]
kubectl --kubeconfig kubeconfig-dev.json set image -n develop deploy/redis-dev redis-dev=swr.cn-east-3.myhuaweicloud.com/greentown/redis:V1.0
jenkins-kubectl构建脚本
#!groovy
pipeline {
agent any
environment{
REPOSITORY="[gitlab代码仓库地址]"
BRANCH="[分支]"
MODULE="[pod名称/容器镜像名称]" #k8s集群内pod名称和容器名称保持一致(用户更新服务)
SCRIPT_DIR="/production/file" #服务器docker构建脚本执行脚本地址-newbuild.sh(文档下方有脚本)
ENV="[集群命名空间]" #k8s的集群命名空间
PROFILE="/home/kubeconfig.json" #服务器k8s客户端kubectl执行脚本地址-deploy.sh(下方有脚本)
}
stages{
stage('更新服务') {
steps {
echo "update service "
sh "${SCRIPT_DIR}/deploy.sh ${MODULE} ${ENV} ${PROFILE} ${BUILD_NUMBER}"
}
}
}
}
服务更新脚本deploy.sh
MODULE=$1
ENV=$2
PROFILE=$3
IMAGE=swr.cn-east-3.myhuaweicloud.com/greentown/${MODULE}:$4
echo "update image to:${IMAGE}"
#kubectl --kubeconfig [集群配置文件] set image -n [命名空间] deploy/[pod名称] [容器名]=[新的镜像地址]
kubectl --kubeconfig ${PROFILE} set image -n ${ENV} deploy/${MODULE} ${MODULE}=${IMAGE}
kubeconfig.json脚本(不同的k8s集群有不同的配置文件)
{
"kind": "Config",
"apiVersion": "v1",
"preferences": {},
"clusters": [{
"name": "internalCluster",
"cluster": {
"server": "https://xxx.xxx.xxx.:3233",
"certificate-authority-data": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMxRENDQWJ5Z0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFiTVJrd0Z3WURWUVFLRXhCRFEwVWcKVkdWamFHNXZiRzluYVdWek1CNFhEVEU1TURneU9EQTFORE15TVZvWERUUTVNRGd5TURBMU5ETXlNVm93R3pFWgpNQmNHQTFVRUNoTVFRME5GSUZSbFkyaHViMnh2WjJsbGN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFPZldkV3FxYVFuZXVWTVc1TDUwU0h1azYwOXFZdGkzZFNHMk1va0VXaXZvdnRXaHRabFcKbE1LVDhpVEZQTTFXF1ZFBVSHEyc0wKdEhZWGZjbjNsenNmTmNDeDhSZGg0bXd0eDFqaGwwSHBOZStDM1ZxcU1IK2pScFhlcS9KRGlKN056MEh1OWVxQQozV2JsKzJ6WE5WdSt6SE05QnBPS29qbzIyWFFQcllMdzRnTWZXVVJwY2lRSzVrQU5NMUZVRy9CZlVFTjhmMHRkCm83MWR5L3A2RDBxYm1seHVzY1RUV3JNczRadGdOVDFONnkya3JjdjAxT1Rva2hWTkpnWGpRN3pqVzk4S1RXaW8KWFE0Y1JQc2R6R2UwZXRzY0d2TWtQU280SHh6WlZDdnNXUFhiSHo5UzJTWnRZbTBmYUdvSHBzRkg1SnpFdDZtZwphSXRPeDN4MlRyY0t4SkVSa2pNQXdlZGM3bmdPVjg3K2RuaFl0S2pCY0h2VXQ3R0dDQnhRY3ZVTW9WL2MrYzBiCjBBSW9qa1h5ODdnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
}
}],
"users": [{
"name": "user",
"user": {
"client-certificate-data": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQrVENDQXVHZ0F3SUJBZ0lJQVdWOVpxeGNkS2N3RFFZSktvWklodmNOQVFFTEJRQXdHekVaTUJjR0ExVUUKQ2hNUVEwTkZJRlJsWTJodWIyeHZaMmxsY3pBZUZ3MHhPVEE0TWpnd05UUXpNakZhRncwME9UQTRNakF3TlRRegpNak5hTURJeEZ6QVZCZ05WQkFvVERuTjVjM1JsYlRwdFlYTjBaWEp6TVJjd0ZRWURWUVFERXc1emVYTjBaVzA2CmJXRnpkR1Z5Y3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT2ZXZFdxcWFRbmUKdVZNVzVMNTBTSHVrNjA5cVl0aTNkU0cyTW9rRVdpdm92dFdodFpsV2xNS1Q4aVRGUE0xV0dmQXMzUW1wQUQ0MApRR0JBZXdVUGRvQXdapISjZqWWNFQ2dENWU0Y0VaR29BWTRjRUNnRDV0NGNFWkhZZG1JY0VDZ0Q1CjU0Y0V3S2dBOTRjRXdLZ0FINGNFd0tnQWlJY0V3S2dBeVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQTJncG0KUVFLSitwTkxSbWJNeTExaDJtYUlxODVlUGZrbDliQzZ2a2RCMnpPbUFiS0VEenNKMWpmS2JLUktTb1ZxUXdnYwpzSlBsRGRjWlRiM0svSVh4TXJVZ1BGeXZFRkwrYW04Q3hkTXRlUTdNWUhDYUlzb1dYdjRMTEUvU0toQlNPVWdXCnoyYW9HTzNlVUplVmVtWXlQUXJIODJ1V3RpS3dkcHd5VktvOGRFVkJYaFl5S0tURWJldCtEOFJhYlFNSVRFOFYKY3JncEIrK3NQTWwwazdvSTdHbm5ESWduR2FsbldNZHJtTVRHRTNvTHdXWVlvcjVUbzUxczdsc2hPN2tYQnRTNwp4R2dkcVM1SnVEbHlld3lmaFZ2UnlxZHVxWElpUGpVNW5YWVVNT01DcTBkZ1R2anZkdjNqQTdEN0NkL1V5YzJkCnhhc1ZUSDU4SEk4VDVVMVhmUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
"client-key-data": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBNTlaMWFxcHBDZDY1VXhia3ZuUkllNlRyVDJwaTJMZDFJYll5aVFSYUsraSsxYUcxCm1WYVV3cFB5Sk1VOHpWWVo4Q3pkQ2FrQVBqUkFZRUI3QlE5MmdEQmxjSEVCYUJFRXhxZlQyc3l1WnRHem9LWXUKc2pRU0tXajZKWGY0RXY5QmtLU1p2RjdaQjg5OWJqd0x1M3RxOVZLZjNCQlpDK0ZOQ0ZxMDlmQ2QrVEhETndRWQp0YkQ2Z0xUMUJLL2pGbjVld0VoL1JWQVNVZU1Fb0czS0l2V3luVExUUWV0aFZkZmNPWmkvdFJTRWtrSWZOK1BzCk5lU3JrU05mTWRZV1Rlc2RFVXEydEtsZ3NmNmV1ZW0yVzFPVUZtS20rQk9oSHBBZDg0NmtnMjRhUmp6WkpMV1UKY2wrd1hSS3kwNXN0QTQo1QUg4dU55VjNVTTI4b0V4c204VGh0UUhKUy93akRaWFplMURRb2NURHhNNEsvb3VaVzR2cDBsY2hqMGI5L2g0ClJXUDVEOFFhSmNGLzlCWFN6QUw4Nkk2SnZabzViMDFodGtaOWNwbGJrU1QzWE5nTWhPTEdwRkVDZ1lFQThUbVAKaXlsNnl3c1JITWpJWTZqWVZ0MVIxZVlwNkVQamU5ME5BRHZMamxleFE2YlI0eC9OTE5JSWZWV0kwS1hNekhmVApiM0R3RFhpL2hBwp5ZWhxVklXVXB5YlBpZGlXNnIreC9WWUsyUUFsK3plUmpKZzE4MkU2UVl6UTJXTG03NXRrdTZoMFcyY2lVbThLCnlCWkJMd0tCZ0hlUFdGdFpETUptZ1dWTk9HMWkvWGs1dkl2SXdjNFUwUE4vZEovNzdOc0V5dVJnOVFSZUZlRlMKTElyUFRxakNPV0N0ams3aWtoUGxSeGtaK25MUDJaaHRhMXJlR29UemQrTm83MDdmM0tRRGtpU0FtVGEyUklGeAowLzV0cEQrenk2S1RPNUlKUUJ3TWJRQjZUd1k2ejhkMUljYTVqN1dEdkFiTUY0bERsR2o0Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg=="
}
}],
"contexts": [{
"name": "internal",
"context": {
"cluster": "internalCluster",
"user": "user"
}
}],
"current-context": "internal"
}
k8s客户端kubectl操作流程图