暫時列個架子,後續慢慢補充。。。
項目結構
1.註冊登陸阿里雲賬號(步驟略)
購買ECS、購買域名
實名認證-創建域名模板-認證備案
2.服務器基礎環境搭建(準備三臺ECS、步驟略)
安裝docker、安裝docker-compose、鏡像加速地址設置、修改yum源配置、阿里雲組策略開放端口、內網ip設置
3.安裝基本環境(內容太多,後續單獨放一篇文章內)
ELK、nacos集羣、mysql主從、redis、FastDFS集羣、jenkins+nexus、mongo+mongo-express、sentinel、seata、nginx等等
nacos集羣
version: '3'
services:
# nacos-server服務註冊與發現,配置中心服務
docker-nacos-server:
image: nacos/nacos-server:1.0.1
container_name: nacos-server-1
ports:
- "8848:8848"
- "9555:9555"
networks:
- nacos_net
restart: on-failure
privileged: true
environment:
PREFER_HOST_MODE: ip #如果支持主機名可以使用hostname,否則使用ip,默認也是ip
SPRING_DATASOURCE_PLATFORM: mysql #數據源平臺 僅支持mysql或不保存empty
NACOS_SERVER_IP: 10.211.55.17 #多網卡情況下,指定ip或網卡
NACOS_SERVERS: 10.211.55.17:8848 10.211.55.18:8848 10.211.55.19:8848 #集羣中其它節點[ip1:port ip2:port ip3:port]
MYSQL_MASTER_SERVICE_HOST: 10.211.55.17 #mysql配置,Master爲主節點,Slave爲從節點
MYSQL_MASTER_SERVICE_PORT: 3306
MYSQL_MASTER_SERVICE_DB_NAME: nacos
MYSQL_MASTER_SERVICE_USER: root
MYSQL_MASTER_SERVICE_PASSWORD: mysql1234
MYSQL_SLAVE_SERVICE_HOST: 10.211.55.17
MYSQL_SLAVE_SERVICE_PORT: 3306
MYSQL_SLAVE_SERVICE_DB_NAME: nacos
MYSQL_SLAVE_SERVICE_USER: root
MYSQL_SLAVE_SERVICE_PASSWORD: mysql1234
#JVM調優參數
#JVM_XMS: #-Xms default :2g
#JVM_XMX: #-Xmx default :2g
#JVM_XMN: #-Xmn default :1g
#JVM_MS: #-XX:MetaspaceSize default :128m
#JVM_MMS: #-XX:MaxMetaspaceSize default :320m
#NACOS_DEBUG: n #是否開啓遠程debug,y/n,默認n
#TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,默認false
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs #日誌輸出目錄
- ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置
networks:
nacos_net:
driver: bridge
version: '3'
services:
# nacos-server服務註冊與發現,配置中心服務
docker-nacos-server:
image: nacos/nacos-server:1.0.1
container_name: nacos-server-3
ports:
- "8848:8848"
- "9555:9555"
networks:
- nacos_net
restart: on-failure
privileged: true
environment:
PREFER_HOST_MODE: ip #如果支持主機名可以使用hostname,否則使用ip,默認也是ip
SPRING_DATASOURCE_PLATFORM: mysql #數據源平臺 僅支持mysql或不保存empty
NACOS_SERVER_IP: 10.211.55.18 #多網卡情況下,指定ip或網卡
NACOS_SERVERS: 10.211.55.17:8848 10.211.55.18:8848 10.211.55.19:8848 #集羣中其它節點[ip1:port ip2:port ip3:port]
MYSQL_MASTER_SERVICE_HOST: 10.211.55.17 #mysql配置,Master爲主節點,Slave爲從節點
MYSQL_MASTER_SERVICE_PORT: 3306
MYSQL_MASTER_SERVICE_DB_NAME: nacos
MYSQL_MASTER_SERVICE_USER: root
MYSQL_MASTER_SERVICE_PASSWORD: mysql1234
MYSQL_SLAVE_SERVICE_HOST: 10.211.55.17
MYSQL_SLAVE_SERVICE_PORT: 3306
#JVM調優參數
#JVM_XMS: #-Xms default :2g
#JVM_XMX: #-Xmx default :2g
#JVM_XMN: #-Xmn default :1g
#JVM_MS: #-XX:MetaspaceSize default :128m
#JVM_MMS: #-XX:MaxMetaspaceSize default :320m
#NACOS_DEBUG: n #是否開啓遠程debug,y/n,默認n
#TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,默認false
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs #日誌輸出目錄
- ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置
networks:
nacos_net:
driver: bridge
version: '3'
services:
# nacos-server服務註冊與發現,配置中心服務
docker-nacos-server:
image: nacos/nacos-server:1.0.1
container_name: nacos-server-3
ports:
- "8848:8848"
- "9555:9555"
networks:
- nacos_net
restart: on-failure
privileged: true
environment:
PREFER_HOST_MODE: ip #如果支持主機名可以使用hostname,否則使用ip,默認也是ip
SPRING_DATASOURCE_PLATFORM: mysql #數據源平臺 僅支持mysql或不保存empty
NACOS_SERVER_IP: 10.211.55.19 #多網卡情況下,指定ip或網卡
NACOS_SERVERS: 10.211.55.17:8848 10.211.55.18:8848 10.211.55.19:8848 #集羣中其它節點[ip1:port ip2:port ip3:port]
MYSQL_MASTER_SERVICE_HOST: 10.211.55.17 #mysql配置,Master爲主節點,Slave爲從節點
MYSQL_MASTER_SERVICE_PORT: 3306
MYSQL_MASTER_SERVICE_DB_NAME: nacos
MYSQL_MASTER_SERVICE_USER: root
MYSQL_MASTER_SERVICE_PASSWORD: mysql1234
MYSQL_SLAVE_SERVICE_HOST: 10.211.55.17
MYSQL_SLAVE_SERVICE_PORT: 3306
#JVM調優參數
#JVM_XMS: #-Xms default :2g
#JVM_XMX: #-Xmx default :2g
#JVM_XMN: #-Xmn default :1g
#JVM_MS: #-XX:MetaspaceSize default :128m
#JVM_MMS: #-XX:MaxMetaspaceSize default :320m
#NACOS_DEBUG: n #是否開啓遠程debug,y/n,默認n
#TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,默認false
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs #日誌輸出目錄
- ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置
networks:
nacos_net:
driver: bridge
version: '3'
services:
#jenkins setting
jenkins:
container_name: dev_jenkins
image: jenkins/jenkins:lts
#host port:container port
ports:
- "8081:8080"
- "51000:50000"
#volumes path|host path:container path
volumes:
- /usr/local/jenkins:/var/jenkins_home
environment:
TZ: 'Asia/Shanghai'
restart: always
#nexus setting
nexus:
container_name: dev_nexus
image: sonatype/nexus3
#host port:container port
ports:
- "8080:8080"
- "50000:50000"
#volumes path|host path:container path
volumes:
- /usr/local/nexus:/nexus-data
environment:
TZ: 'Asia/Shanghai'
restart: always
暫略。。。
4.安裝前端環境(或docker安裝,同時編譯打包前端項目到鏡像推送私倉)
node npm vue yarn
wget https://nodejs.org/dist/v10.15.0/node-v10.15.0.tar.gz
tar zxvf node-v10.15.0.tar.gz
node 軟連接
【安裝node npm參考 https://blog.csdn.net/cpongo3/article/details/89157498】
npm安裝yarn
yarn設置淘寶鏡像
npm install -g yarn --registry=https://registry.npm.taobao.org
yarn config set registry https://registry.npm.taobao.org -g
yarn必要時設置環境變量
export PATH=/usr/local/nodejs/bin/:$PATH(臨時生效,關閉shell失效)
或 vi /etc/profile (對所有用戶永久生效)
加上 export PATH=/usr/local/nodejs/bin/:$PATH
source /etc/profile 立即生效
git clone項目之後需要npm install
啓動vue項目
進入項目根目錄(目錄會有package.json文件,記錄node插件依賴、項目等信息),進行安裝yarn(會在目錄創建node_models目錄,存放npm插件),並運行工程
yarn install
yarn run serve
5.開通阿里雲鏡像服務,創建開發、測試、生產鏡像命名空間,yum安裝git,安裝maven,docker build鏡像push私倉,jenkins自動化發佈
鏡像build(進入項目pom目錄,-f參數指定項目下的Dockerfile)
docker image build --no-cache -t registry.cn-zhangjiakou.aliyuncs.com/gx-v1-dev/gx-auth:1.2.0 -f ./gx-auth/src/main/docker/Dockerfile .
指定鏡像打tag
sudo docker tag dd022772a116 registry.cn-zhangjiakou.aliyuncs.com/gx-v1-dev/gx-auth:1.2.0
登陸阿里雲鏡像倉庫【需要輸入密碼】
sudo docker login --username=[個人用戶名] registry.cn-zhangjiakou.aliyuncs.com
鏡像push到阿里雲鏡像倉庫指定命名空間
sudo docker tag [ImageId] registry.cn-zhangjiakou.aliyuncs.com/[個人鏡像地址]:[鏡像版本號]
例如
sudo docker push registry.cn-zhangjiakou.aliyuncs.com/gx-v1-dev/gx-auth:1.2.0
通過構建jenkins的pipeline腳本,實現自動化鏡像打包及部署(需要配置憑證)
pipeline {
agent any
environment {
//project名稱
project_name="gx-cloud"
//應用名稱,jar包不帶後綴
app_name="gx-auth-1.0-SNAPSHOT"
// 項目打包後rar包目錄,一般在Srv下或者Shell下,需要根據自己的項目靈活改變,跟項目裏面dockerfile文件下的目錄一樣
app_war_path = "gx-auth/target/{app_name}.jar"
app_version="1.0"
//Docker鏡像名稱
docker_name="gx-auth"
//鏡像版本,不用動
image_tag="${app_version}.${BUILD_NUMBER}"
//鏡像倉庫命名空間,開發dev,測試test
docker_space="gx-v1-dev"
//DockerFile文件路徑
docker_file_path="gx-auth/src/main/docker/Dockerfile"
//Git倉庫地址
git_url = "xxxx"
//鏡像倉庫地址,不用動
repo_url="【鏡像倉庫地址】/${docker_space}/${docker_name}"
}
parameters {
string(name: 'branch', defaultValue: '【需要發版的分支名稱】', description: '發佈分支')
}
stages {
stage('Git Clone') {
steps {
script {
echo "checkout from ${branch}"
echo "${image_tag}"
checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '【jenkins的憑證id】', url: "$git_url"]]])
echo "checkout sucess"
}
}
}
stage('Maven Build') {
steps {
script {
sh'''
export MAVEN_HOME=/usr/local/apache-maven-3.6.2
/usr/local/apache-maven-3.6.2/bin/mvn clean package install -f ${project_name}/pom.xml -Dmaven.test.skip=true
'''
}
}
}
stage('Docker Build') {
steps {
script {
docker_result = sh returnStdout: true ,script: "docker images -q ${docker_name}";
echo "********docker_result${docker_result}"
if (docker_result!='') {
sh " docker rmi --force \$(docker images -q ${docker_name})"
}
sh "docker image build --no-cache -t ${docker_name}:latest -f ${docker_file_path} . "
withCredentials([usernamePassword(credentialsId: '【jenkins的憑證id】', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USER')]) {
sh "docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} 【鏡像倉庫地址】";
}
sh "docker tag ${docker_name}:latest 【鏡像倉庫地址】/${docker_space}/${docker_name}:${app_version}.${BUILD_NUMBER}"
sh "docker push 【鏡像倉庫地址】/${docker_space}/${docker_name}:${app_version}.${BUILD_NUMBER}"
sh "docker tag ${docker_name}:latest 【鏡像倉庫地址】/${docker_space}/${docker_name}:latest"
sh "docker push 【鏡像倉庫地址】/${docker_space}/${docker_name}:latest"
docker_result = sh returnStdout: true ,script: "docker images -q ${docker_name}";
echo "********docker_result${docker_result}"
if (docker_result!='') {
sh " docker rmi --force \$(docker images -q ${docker_name})"
}
}
}
}
stage('Deploy To K8s') {
steps {
script {
result = sh returnStdout: true ,script: "kubectl get deployment --selector=app=${docker_name} --kubeconfig='/root/.kube/dev_config' --namespace=default"
if(result==''){
sh'''
echo "deploy application"
sed -e "s#{TAG}#${image_tag}#g;s#{APOLLO_META}#${apollo_meta}#g;s#{REPO_URL}#${repo_url}#g;s#{APP_ID}#${app_id}#g;s#{APP_NAME}#${app_name}#g;s#{IMAGE_NAME}#${docker_name}#g" /root/deployment/k8s-deployment.yml > /root/deployment.yml
kubectl apply -f /root/deployment.yml --kubeconfig="/root/.kube/dev_config"
'''
}else{
sh "echo 'update application'"
sh "kubectl patch deployment ${docker_name} -p '{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"image\":\"${repo_url}:${image_tag}\",\"name\":\"${docker_name}\"}]}}}}' --kubeconfig='/root/.kube/dev_config' --namespace=default"
}
}
}
}
}
post {
success {
sh "echo 'success'"
}
failure {
echo "failure"
}
unstable {
echo "unstable"
}
}
}
最後一步需要k8s設置相關及配置中心地址等信息,取消,改爲腳本在應用服務器啓動應用容器(可通過jenkins配置應用服務器,並上傳ssh公鑰實現免密登陸)
6.增加nginx進行轉發,域名解析設置
www.sssgg.fun 首頁 80端口 匹配 門戶網站(door.sssgg.fun)
www.home.sssgg.fun 用戶項目
www.config.sssgg.fun 監控和配置項目
www.admin.sssgg.fun 後臺管理項目
開發環境(測試環境dev改爲sit)
www.dev.sssgg.fun 首頁 80端口 匹配 門戶網站
www.dev.home.sssgg.fun 用戶項目
www.dev.config.sssgg.fun 監控和配置項目
www.dev.admin.sssgg.fun 後臺管理項目