因为之前写过基于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的参数要问开发人员(有些程序需要连数据库)

K8S+Jenkins自动化构建微服务项目(后续)的更多相关文章

  1. 用Docker运行Jenkins自动化构建.NET Core项目

    目标 当代码提交到GitHub后,自动生成构建项目并部署到服务器.接下来介绍一下如何在容器中运行Jenkins,并自动化构建GitHub上的项目,使用自动化构建来解放你的双手. 前置条件 一台已经安装 ...

  2. 构建微服务开发环境7————使用Github管理项目代码的版本

    [内容指引] 1.注册GitHub帐号: 2.下载Github Desktop客户端: 3.macOS安装Github Desktop客户端: 4.windows安装Github Desktop客户端 ...

  3. .Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心

    一.开场白 在系统设计里我们有很多配置希望独立于系统之外,而又能够被系统实时读取.但是在传统的系统设计里,配置信息通常是耦合在系统内的,比如.net里通常会放在App.config或者web.conf ...

  4. .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证

    这里第一次搭建,所以IdentityServer端比较简单,后期再进行完善. 1.新建API项目MI.Service.Identity,NuGet引用IdentityServer4,添加类InMemo ...

  5. 使用http://start.spring.io/构建maven微服务项目的几个坑及eclipse构建spring boot微服务项目

    一,使用http://start.spring.io/构建maven微服务项目 本来嘛,直接构建的项目导入时没有任何问题的导入就可以运行,可是最近构建好项目,然后导入,种种报错 1.导入之后POM报错 ...

  6. 通过GeneXus如何快速构建微服务架构

    概览 “微服务”是一个非常广泛的话题,在过去几年里,市面上存在着各种不同的定义. 虽然对这种架构方式没有一个非常精确的定义,但仍然有一些概念具有代表性. 微服务有着许多围绕业务能力.自动化部署.终端智 ...

  7. 使用Spring Cloud和Docker构建微服务架构

    原文:https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do 作者:Alexander Lukyan ...

  8. 使用 Spring Cloud 和 Docker 构建微服务架构

    如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构. 本文通过使用Spring Boot.Spring Cloud和Docker构 ...

  9. Jenkins自动化构建系列:01敏捷开发、自动化构建与持续集成

    <SVN与TortoiseSVN实战系列>已写完,今天新开一个<Jenkins自动化构建系列>,上周听了Bob Jiang老师的Agile1001公开课,一直想写个总结,这篇关 ...

随机推荐

  1. 知识点简单总结——Pollard-Rho算法

    知识点简单总结--Pollard-Rho算法 MillerRabin算法 用于对较大(int64)范围内的数判定质数. 原理:费马小定理,二次探测定理. 二次探测定理:若 $ p $ 为奇素数且 $ ...

  2. 怎么根据Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序?

    public int compareTo(Student o) { return this.age - o.age; // 比较年龄(年龄的升序)    } 应该理解成return (-1)×(thi ...

  3. Eureka server

    Eureka server使用的不是spring mvc的框架,而是使用Jersey. Eureka server ,启动的流程,追本溯源,是在 DiscoveryClient里面,使用这个构造方法 ...

  4. input 输入框只能输入数字,一行代码解决,兼容谷歌 火狐

    <input id="mobile" name="mobile" type="text" onkeyup="this.val ...

  5. IE中的编码位置

    进入设置 找到Editor 找到File Encodings

  6. 决策树算法一:hunt算法,信息增益(ID3)

    决策树入门 决策树是分类算法中最重要的算法,重点 决策树算法在电信营业中怎么工作? 这个工人也是流失的,在外网转移比处虽然没有特征来判断,但是在此节点处流失率有三个分支概率更大 为什么叫决策树? 因为 ...

  7. Numpy的数学统计函数

    Numpy的数学统计函数 本节内容: 1.Numpy有哪些数学统计函数: 函数名 说明 np.sum 所有元素的和 np.prod 所有元素的乘积 np.cumsum 元素的累积加和 np.cumpr ...

  8. 带你玩转prefetch, preload, dns-prefetch,defer和async

    现代浏览器性能优化-JS篇 众所周知,JS的加载和执行会阻塞浏览器渲染,所以目前业界普遍推荐把script放到</body>之前,以解决js执行时找不到dom等问题.但随着现代浏览器的普及 ...

  9. HTML5打造原生应用——Ionic框架简介与Ionic Hello World

    试了试用Ionic框架打造了两个应用,然后在Google Play上架了. 程序语言答人 教你设计物联网 更有意思的是这是在一周的业余时间内完成的三个应用中的两个,接着让我们看看这个框架如何实现高效地 ...

  10. “一键”生成HTML——Emmet插件常用语法

    Emmet是一款文本编辑器/IDE的插件,用来快速生成复杂的HTML代码,只要掌握一些常用的语法(类似于CSS选择器),就可以减少重复编码的工作(主要是懒).我个人惯用的是sublime,因此下文介绍 ...