本文主要模擬Springboot 程序的微服務部署,及CI&CD的Jenkins設計. 當前的K8S集群位一個master節點和三個workers 節點。
單機部署准備編譯jar包的image,此處由於未注冊鏡像到docker-hub,所以只在服務器本地每個worker節點中build,有自己的docker-hub倉庫的可用push上去。
首先編寫構建jar包鏡像所需的腳本Dockerfile文件
FROM openjdk:8-jre-alpine MAINTAINER Jack Lee USER root RUN mkdir -p /home/SpiderWiki WORKDIR /home/SpiderWiki COPY SpiderWiki-1.0-SNAPSHOT.jar SpiderWiki-1.0-SNAPSHOT.jar EXPOSE 8888 ENTRYPOINT ["java","-jar", "SpiderWiki-1.0-SNAPSHOT.jar"]
單機上build鏡像和部署請用命令:
docker build -t test/spiderwiki:v1.0 .
echo "SpiderWiki image id :" $(docker images test/spiderwiki:v1.0 -q)
echo "Creating SpiderWiki container......"
docker run --name spiderwiki-web -p 8001:8888 -v /root/spiderwiki:/home/SpiderWiki -d test/spiderwiki:v1.0
echo "SpiderWiki container is running......"

K8S集群部署(啟動3個副本pod):
則編寫K8S 腳本,Ingress-SpiderWiki.yml :
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-spiderwiki
labels:
app: app-spiderwiki
spec:
replicas: 3
selector:
matchLabels:
app: app-spiderwiki
template:
metadata:
labels:
app: app-spiderwiki
spec:
containers:
- name: spiderwiki
image: voith/spiderwiki:v1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
---
apiVersion: v1
kind: Service
metadata:
name: spiderwiki-service
spec:
type: ClusterIP
selector:
app: app-spiderwiki
ports:
- protocol: TCP
port: 80
targetPort: 8888
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-web-spiderwiki
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
defaultBackend:
service:
name: spiderwiki-service
port:
number: 80
rules:
- host: spiderwiki.com
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: spiderwiki-service
port:
number: 80
腳本編寫完成后,run起來:
deployment.sh
#!/bin/bash
set -e
echo "Starting to build SpiderWiki docker image......"
#docker build -t voith/spiderwiki:v1.0 .
#echo "SpiderWiki image id :" $(docker images voith/spiderwiki:v1.0 -q)
#echo "Creating SpiderWiki container......"
#docker run --name spiderwiki-web -p 8001:8888 -v /root/spiderwiki:/home/SpiderWiki -d voith/spiderwiki:v1.0
#echo "SpiderWiki container is running......"
kubectl apply -f Ingress-SpiderWiki.yml
kubectl get pods --all-namespaces -o wide
kubectl get svc --all-namespaces -o wide
kubectl get ingress --all-namespaces -o wide

使用CI&CD部署:
編寫Jenkinsfile:
pipeline { agent any options { buildDiscarder(logRotator(numToKeepStr: '720')) } environment { GIT_REPO="https://github.com/xxxx/SpiderWiki.git" BRANCH="main" GIT_AUTH="xxxxxxx" DOCKER_REGISTRY_AUTH="xxxx" IMG_NAME="test/spiderwiki:v1.0" } stages { stage('Pulling from Git') { checkout([$class: 'GitSCM', branches: [[name: '${BRANCH}']], userRemoteConfigs: [[credentialsId: "${GIT_AUTH}", url: "${GIT_REPO}"]]]) } stage('Compiling SpiderWiki'){ sh 'sudo su root -c "mvn clean package -Dmaven.test.skip=true"' } stage('Building SpiderWiki Image'){ withCredentials([usernamePassword(credentialsId: "${DOCKER_REGISTRY_AUTH}", passwordVariable: 'PASSWORD', usernameVariable: 'USER_NAME')]) { sh """ echo ' FROM openjdk:8-jre-alpine MAINTAINER ming.lu USER root RUN mkdir -p /home/SpiderWiki WORKDIR /home/SpiderWiki COPY target/SpiderWiki-1.0-SNAPSHOT.jar SpiderWiki-1.0-SNAPSHOT.jar EXPOSE 8888 ENTRYPOINT ["java","-jar", "SpiderWiki-1.0-SNAPSHOT.jar"] '> Dockerfile docker build -t ${IMG_NAME} . docker login -u ${USER_NAME} -p '${PASSWORD}' docker push ${IMG_NAME} """ } } stage('Deplying to K8S'){ sh """ #!/bin/bash sudo su root -c "kubectl apply -f Ingress-SpiderWiki.yml" """ } stage('Verifying') { sh """ echo "checking if it's running" """ } } post { success { echo 'All activities have been performed successfully!' } failure { echo 'At least one activity has failed!' echo "Build time: ${new Date()}" echo "Build ID: ${env.BUILD_ID}" echo "Build URL: ${env.BUILD_URL}" emailext body: "" } unstable { echo 'The pipeline has been marked as unstable!' } changed { echo 'The state of the Pipeline has changed!' } } } }
