因為之前寫過基於K8S部署jenkins master/slave平台,在這個的基礎上構建微服務到K8S集群中
Jenkins-slave構建微服務項目到K8S集群
1、微服務項目上傳到git倉庫
這個就不多說了
2、更改注冊中心eureka的配置文件
進入到項目代碼中,更改微服務中eureka-service的配置文件application.yaml(需要和開發對一下,具體還要加哪些參數)
server:
port: 8761
spring:
application:
name: eureka-service
eureka:
instance:
prefer-ip-address: false
client:
region: default
service-url:
defaultZone: http://eureka-0.eureka.default:${server.port}/eureka/,http://eureka-1.eureka.default:${server.port}/eureka/
register-with-eureka: true
fetch-registry: true
其他應用程序往eureka注冊,需要在各自的application.yaml里添加下面的eureka信息
eureka:
instance:
prefer-ip-address: false
client:
region: default
service-url:
defaultZone: http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/
register-with-eureka: true
fetch-registry: true
3、創建statefulset資源文件部署eureka,ingress做負載均衡
(將所以要創建的資源都合並到一個yaml文件,上傳到git倉庫 項目代碼的eureka目錄下)
#創建Service為headless
apiVersion: v1
kind: Service
metadata:
namespace: NS
labels:
app: eureka
name: eureka
spec:
clusterIP: None
selector:
app: eureka
ports:
- port: 8761
protocol: TCP
targetPort: 8761
status:
loadBalancer: {}
---
#創建StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: eureka
namespace: NS
spec:
selector:
matchLabels:
app: eureka
serviceName: "eureka"
replicas: RSCOUNT
template:
metadata:
labels:
app: eureka
spec:
imagePullSecrets:
- name: SECRET_NAME
containers:
- name: eureka
image: IMAGE_NAME
ports:
- containerPort: 8761
---
#創建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: eureka-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: eureka.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: eureka
port:
number: 8761
4、在jenkins創建流水線任務
新建任務——eureka 流水線——然后進入項目配置,Jenkinsfile如下:
def registry = "10.48.14.50:8888"
def project = "dev"
def app_name = "eureka-service"
def jar_path = "build/libs"
def jar_name = "${app_name}-0.0.1-SNAPSHOT.jar"
def jar_port = "8761"
def image_name = "${registry}/${project}/${app_name}:${BUILD_NUMBER}"
def git_address = "http://10.48.14.100:30080/001/xiangmu.git"
// 認證
def secret_name = "registrypullauth"
def docker_registry_auth = "b07ed5ba-e191-4688-9ed2-623f4753781c"
def git_auth = "a5ec87ae-87a1-418e-aa49-53c4aedcd261"
def k8s_auth = "3cd3f414-a0e2-4bc0-8808-78c64e6ad7d2"
def JAVA_OPTS = "-Xms128m -Xmx256m -Dfile.encoding=UTF8 -Duser.timezone=GMT+08 -Dspring.profiles.active=test"
pipeline {
agent {
kubernetes {
label "jenkins-slave"
yaml """
kind: Pod
metadata:
name: jenkins-slave
spec:
containers:
- name: jnlp
image: "${registry}/library/jenkins-slave-jdk:latest"
imagePullPolicy: Always
env:
- name: TZ
value: Asia/Shanghai
volumeMounts:
- name: docker-cmd
mountPath: /usr/bin/docker
- name: docker-sock
mountPath: /var/run/docker.sock
- name: gradle-cache
mountPath: /root/.gradle
volumes:
- name: docker-cmd
hostPath:
path: /usr/bin/docker
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: gradle-cache
hostPath:
path: /tmp/gradle
"""
}
}
parameters {
choice (choices: ['1', '2', '3', '5', '7'], description: '副本數', name: 'ReplicaCount')
choice (choices: ['dev','test','prod','default'], description: '命名空間', name: 'Namespace')
}
stages {
stage('拉取代碼'){
steps {
checkout([$class: 'GitSCM',
branches: [[name: "${params.Branch}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]
])
}
}
stage('代碼編譯'){
steps {
sh """
java -version
pwd
cd ${app_name}
pwd
gradle -v
gradle clean build -x test
"""
}
}
stage('構建鏡像'){
steps {
withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
sh """
echo '
FROM ${registry}/library/java:11
MAINTAINER liang
RUN apk add -U tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ADD ${jar_path}/${jar_name} /
EXPOSE ${jar_port}
CMD java -jar $JAVA_OPTS /${jar_name}
'> ${app_name}/Dockerfile
docker build -t ${image_name} ${app_name}
docker login -u ${username} -p ${password} ${registry}
docker push ${image_name}
"""
}
}
}
stage('部署到K8S平台'){
steps {
configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: 'admin.kubeconfig')]) {
sh """
pwd
sed -i 's#IMAGE_NAME#${image_name}#' ${app_name}/deploy.yaml
sed -i 's#SECRET_NAME#${secret_name}#' ${app_name}/deploy.yaml
sed -i 's#RSCOUNT#${ReplicaCount}#' ${app_name}/deploy.yaml
sed -i 's#NS#${Namespace}#' ${app_name}/deploy.yaml
kubectl apply -f ${app_name}/deploy.yaml -n ${Namespace} --kubeconfig=admin.kubeconfig
sleep 10
kubectl get pod -n ${Namespace} --kubeconfig=admin.kubeconfig
"""
}
}
}
}
}
構建項目:可以選擇啟動的副本數、項目代碼分支、k8s命名空間(dev、test、prod:代表開發、測試、生產環境)

查看構建日志:


瀏覽器訪問eureka: 需要添加dns記錄或者host文件(根據自己的實際情況添加) http://eureka.test.com
5、構建其他應用程序部署到K8S
修改微服務網關gateway的配置文件application.yaml:
server:
port: 8130
spring:
application:
name: gateway-service
eureka:
instance:
prefer-ip-address: false
client:
region: default
service-url:
defaultZone: http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/
register-with-eureka: true
fetch-registry: true
創建deploy資源 部署gateway,ingress做負載均衡
apiVersion: v1
kind: Service
metadata:
namespace: NS
labels:
app: gateway
name: gateway
spec:
selector:
app: gateway
ports:
- port: 8130
protocol: TCP
targetPort: 8130
status:
loadBalancer: {}
---
#創建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway
namespace: NS
spec:
selector:
matchLabels:
app: gateway
replicas: RSCOUNT
template:
metadata:
labels:
app: gateway
spec:
imagePullSecrets:
- name: SECRET_NAME
containers:
- name: gateway
image: IMAGE_NAME
ports:
- containerPort: 8130
---
#創建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gateway-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: gateway.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: gateway
port:
number: 8130
jenkins中創建gateway項目,使用eureka的Jenkinsfile,只需要修改其中的變量就可以了,這里就不寫了
......
應用程序構建完成后,查看是否注冊到eureka:

再查看eureka日志,說明成功了

大概就是這樣,部署微服務的其他應用程序也是一樣。
需要注意的是:項目中application.yaml的參數要問開發人員(有些程序需要連數據庫)
原文鏈接:https://www.cnblogs.com/cfzy/p/16160965.html

