精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

K8s+SpringBoot實(shí)現(xiàn)零宕機(jī)發(fā)布

jf_ro2CN3Fa ? 來(lái)源:CSDN-lc_1203 ? 2023-01-31 16:31 ? 次閱讀

前言

K8s + SpringBoot實(shí)現(xiàn)零宕機(jī)發(fā)布:健康檢查+滾動(dòng)更新+優(yōu)雅停機(jī)+彈性伸縮+Prometheus監(jiān)控+配置分離(鏡像復(fù)用)。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能。

項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro

配置

健康檢查

健康檢查類(lèi)型:就緒探針(readiness)+ 存活探針(liveness)

探針類(lèi)型:exec(進(jìn)入容器執(zhí)行腳本)、tcpSocket(探測(cè)端口)、httpGet(調(diào)用接口

業(yè)務(wù)層面

項(xiàng)目依賴(lài) pom.xml


org.springframework.boot
spring-boot-starter-actuator

定義訪問(wèn)端口、路徑及權(quán)限 application.yaml

management:
server:
port:50000#啟用獨(dú)立運(yùn)維端口
endpoint:#開(kāi)啟health端點(diǎn)
health:
probes:
enabled:true
endpoints:
web:
exposure:
base-path:/actuator#指定上下文路徑,啟用相應(yīng)端點(diǎn)
include:health

將暴露/actuator/health/readiness和/actuator/health/liveness兩個(gè)接口,訪問(wèn)方式如下:

http://127.0.0.1:50000/actuator/health/readiness
http://127.0.0.1:50000/actuator/health/liveness

運(yùn)維層面

k8s部署模版deployment.yaml

apiVersion:apps/v1
kind:Deployment
spec:
template:
spec:
containers:
-name:{APP_NAME}
image:{IMAGE_URL}
imagePullPolicy:Always
ports:
-containerPort:{APP_PORT}
-name:management-port
containerPort:50000#應(yīng)用管理端口
readinessProbe:#就緒探針
httpGet:
path:/actuator/health/readiness
port:management-port
initialDelaySeconds:30#延遲加載時(shí)間
periodSeconds:10#重試時(shí)間間隔
timeoutSeconds:1#超時(shí)時(shí)間設(shè)置
successThreshold:1#健康閾值
failureThreshold:6#不健康閾值
livenessProbe:#存活探針
httpGet:
path:/actuator/health/liveness
port:management-port
initialDelaySeconds:30#延遲加載時(shí)間
periodSeconds:10#重試時(shí)間間隔
timeoutSeconds:1#超時(shí)時(shí)間設(shè)置
successThreshold:1#健康閾值
failureThreshold:6#不健康閾值

滾動(dòng)更新

k8s資源調(diào)度之滾動(dòng)更新策略,若要實(shí)現(xiàn)零宕機(jī)發(fā)布,需支持健康檢查

apiVersion:apps/v1
kind:Deployment
metadata:
name:{APP_NAME}
labels:
app:{APP_NAME}
spec:
selector:
matchLabels:
app:{APP_NAME}
replicas:{REPLICAS}#Pod副本數(shù)
strategy:
type:RollingUpdate#滾動(dòng)更新策略
rollingUpdate:
maxSurge:1#升級(jí)過(guò)程中最多可以比原先設(shè)置的副本數(shù)多出的數(shù)量
maxUnavailable:1#升級(jí)過(guò)程中最多有多少個(gè)POD處于無(wú)法提供服務(wù)的狀態(tài)

優(yōu)雅停機(jī)

在K8s中,當(dāng)我們實(shí)現(xiàn)滾動(dòng)升級(jí)之前,務(wù)必要實(shí)現(xiàn)應(yīng)用級(jí)別的優(yōu)雅停機(jī)。否則滾動(dòng)升級(jí)時(shí),還是會(huì)影響到業(yè)務(wù)。使應(yīng)用關(guān)閉線程、釋放連接資源后再停止服務(wù)

業(yè)務(wù)層面

項(xiàng)目依賴(lài) pom.xml


org.springframework.boot
spring-boot-starter-actuator

定義訪問(wèn)端口、路徑及權(quán)限 application.yaml

spring:
application:
name:
profiles:
active:@profileActive@
lifecycle:
timeout-per-shutdown-phase:30s#停機(jī)過(guò)程超時(shí)時(shí)長(zhǎng)設(shè)置30s,超過(guò)30s,直接停機(jī)

server:
port:8080
shutdown:graceful#默認(rèn)為IMMEDIATE,表示立即關(guān)機(jī);GRACEFUL表示優(yōu)雅關(guān)機(jī)

management:
server:
port:50000#啟用獨(dú)立運(yùn)維端口
endpoint:#開(kāi)啟shutdown和health端點(diǎn)
shutdown:
enabled:true
health:
probes:
enabled:true
endpoints:
web:
exposure:
base-path:/actuator#指定上下文路徑,啟用相應(yīng)端點(diǎn)
include:health,shutdown

將暴露/actuator/shutdown接口,調(diào)用方式如下:

curl-XPOST127.0.0.1:50000/actuator/shutdown

運(yùn)維層面

確保dockerfile模版集成curl工具,否則無(wú)法使用curl命令

FROMopenjdk:8-jdk-alpine
#構(gòu)建參數(shù)
ARGJAR_FILE
ARGWORK_PATH="/app"
ARGEXPOSE_PORT=8080

#環(huán)境變量
ENVJAVA_OPTS=""
JAR_FILE=${JAR_FILE}

#設(shè)置時(shí)區(qū)
RUNln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime&&echo'Asia/Shanghai'>/etc/timezone
RUNsed-i's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g'/etc/apk/repositories
&&apkadd--no-cachecurl
#將maven目錄的jar包拷貝到docker中,并命名為for_docker.jar
COPYtarget/$JAR_FILE$WORK_PATH/


#設(shè)置工作目錄
WORKDIR$WORK_PATH



>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element實(shí)現(xiàn)的后臺(tái)管理系統(tǒng)+用戶(hù)小程序,支持RBAC動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
>
>*項(xiàng)目地址:
>*視頻教程

#指定于外界交互的端口
EXPOSE$EXPOSE_PORT
#配置容器,使其可執(zhí)行化
ENTRYPOINTexecjava$JAVA_OPTS-jar$JAR_FILE

k8s部署模版deployment.yaml

注:經(jīng)驗(yàn)證,java項(xiàng)目可省略結(jié)束回調(diào)鉤子的配置

此外,若需使用回調(diào)鉤子,需保證鏡像中包含curl工具,且需注意應(yīng)用管理端口(50000)不能暴露到公網(wǎng)

apiVersion:apps/v1
kind:Deployment
spec:
template:
spec:
containers:
-name:{APP_NAME}
image:{IMAGE_URL}
imagePullPolicy:Always
ports:
-containerPort:{APP_PORT}
-containerPort:50000
lifecycle:
preStop:#結(jié)束回調(diào)鉤子
exec:
command:["curl","-XPOST","127.0.0.1:50000/actuator/shutdown"]

彈性伸縮

為pod設(shè)置資源限制后,創(chuàng)建HPA

apiVersion:apps/v1
kind:Deployment
metadata:
name:{APP_NAME}
labels:
app:{APP_NAME}
spec:
template:
spec:
containers:
-name:{APP_NAME}
image:{IMAGE_URL}
imagePullPolicy:Always
resources:#容器資源管理
limits:#資源限制(監(jiān)控使用情況)
cpu:0.5
memory:1Gi
requests:#最小可用資源(靈活調(diào)度)
cpu:0.15
memory:300Mi
---
kind:HorizontalPodAutoscaler#彈性伸縮控制器
apiVersion:autoscaling/v2beta2
metadata:
name:{APP_NAME}
spec:
scaleTargetRef:
apiVersion:apps/v1
kind:Deployment
name:{APP_NAME}
minReplicas:{REPLICAS}#縮放范圍
maxReplicas:6
metrics:
-type:Resource
resource:
name:cpu#指定資源指標(biāo)
target:
type:Utilization
averageUtilization:50

Prometheus集成

業(yè)務(wù)層面

項(xiàng)目依賴(lài) pom.xml

 

org.springframework.boot
spring-boot-starter-actuator


io.micrometer
micrometer-registry-prometheus

定義訪問(wèn)端口、路徑及權(quán)限 application.yaml

management:
server:
port:50000#啟用獨(dú)立運(yùn)維端口
metrics:
tags:
application:${spring.application.name}
endpoints:
web:
exposure:
base-path:/actuator#指定上下文路徑,啟用相應(yīng)端點(diǎn)
include:metrics,prometheus

將暴露/actuator/metric和/actuator/prometheus接口,訪問(wèn)方式如下:

http://127.0.0.1:50000/actuator/metric
http://127.0.0.1:50000/actuator/prometheus

運(yùn)維層面

deployment.yaml

apiVersion:apps/v1
kind:Deployment
spec:
template:
metadata:
annotations:
prometheus:io/port:"50000"
prometheus.io/path:/actuator/prometheus#在流水線中賦值
prometheus.io/scrape:"true"#基于pod的服務(wù)發(fā)現(xiàn)

配置分離

方案:通過(guò)configmap掛載外部配置文件,并指定激活環(huán)境運(yùn)行

作用:配置分離,避免敏感信息泄露;鏡像復(fù)用,提高交付效率

通過(guò)文件生成configmap

#通過(guò)dry-run的方式生成yaml文件
kubectlcreatecm-n--from-file=application-test.yaml--dry-run=1-oyaml>configmap.yaml

#更新
kubectlapply-fconfigmap.yaml

掛載configmap并指定激活環(huán)境

apiVersion:apps/v1
kind:Deployment
metadata:
name:{APP_NAME}
labels:
app:{APP_NAME}
spec:
template:
spec:
containers:
-name:{APP_NAME}
image:{IMAGE_URL}
imagePullPolicy:Always
env:
-name:SPRING_PROFILES_ACTIVE#指定激活環(huán)境
value:test
volumeMounts:#掛載configmap
-name:conf
mountPath:"/app/config"#與Dockerfile中工作目錄一致
readOnly:true
volumes:
-name:conf
configMap:
name:{APP_NAME}

匯總配置

業(yè)務(wù)層面

項(xiàng)目依賴(lài) pom.xml

 

org.springframework.boot
spring-boot-starter-actuator


io.micrometer
micrometer-registry-prometheus

定義訪問(wèn)端口、路徑及權(quán)限 application.yaml

spring:
application:
name:project-sample
profiles:
active:@profileActive@
lifecycle:
timeout-per-shutdown-phase:30s#停機(jī)過(guò)程超時(shí)時(shí)長(zhǎng)設(shè)置30s,超過(guò)30s,直接停機(jī)

server:
port:8080
shutdown:graceful#默認(rèn)為IMMEDIATE,表示立即關(guān)機(jī);GRACEFUL表示優(yōu)雅關(guān)機(jī)

management:
server:
port:50000#啟用獨(dú)立運(yùn)維端口
metrics:
tags:
application:${spring.application.name}
endpoint:#開(kāi)啟shutdown和health端點(diǎn)
shutdown:
enabled:true
health:
probes:
enabled:true
endpoints:
web:
exposure:
base-path:/actuator#指定上下文路徑,啟用相應(yīng)端點(diǎn)
include:health,shutdown,metrics,prometheus

運(yùn)維層面

確保dockerfile模版集成curl工具,否則無(wú)法使用curl命令

FROMopenjdk:8-jdk-alpine
#構(gòu)建參數(shù)
ARGJAR_FILE
ARGWORK_PATH="/app"
ARGEXPOSE_PORT=8080

#環(huán)境變量
ENVJAVA_OPTS=""
JAR_FILE=${JAR_FILE}

#設(shè)置時(shí)區(qū)
RUNln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime&&echo'Asia/Shanghai'>/etc/timezone
RUNsed-i's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g'/etc/apk/repositories
&&apkadd--no-cachecurl
#將maven目錄的jar包拷貝到docker中,并命名為for_docker.jar
COPYtarget/$JAR_FILE$WORK_PATH/


#設(shè)置工作目錄
WORKDIR$WORK_PATH


#指定于外界交互的端口
EXPOSE$EXPOSE_PORT
#配置容器,使其可執(zhí)行化
ENTRYPOINTexecjava$JAVA_OPTS-jar$JAR_FILE

k8s部署模版deployment.yaml

apiVersion:apps/v1
kind:Deployment
metadata:
name:{APP_NAME}
labels:
app:{APP_NAME}
spec:
selector:
matchLabels:
app:{APP_NAME}
replicas:{REPLICAS}#Pod副本數(shù)
strategy:
type:RollingUpdate#滾動(dòng)更新策略
rollingUpdate:
maxSurge:1
maxUnavailable:0
template:
metadata:
name:{APP_NAME}
labels:
app:{APP_NAME}
annotations:
timestamp:{TIMESTAMP}
prometheus.io/port:"50000"#不能動(dòng)態(tài)賦值
prometheus.io/path:/actuator/prometheus
prometheus.io/scrape:"true"#基于pod的服務(wù)發(fā)現(xiàn)
spec:
affinity:#設(shè)置調(diào)度策略,采取多主機(jī)/多可用區(qū)部署
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
-weight:100
podAffinityTerm:
labelSelector:
matchExpressions:
-key:app
operator:In
values:
-{APP_NAME}
topologyKey:"kubernetes.io/hostname"#多可用區(qū)為"topology.kubernetes.io/zone"
terminationGracePeriodSeconds:30#優(yōu)雅終止寬限期
containers:
-name:{APP_NAME}
image:{IMAGE_URL}
imagePullPolicy:Always
ports:
-containerPort:{APP_PORT}
-name:management-port
containerPort:50000#應(yīng)用管理端口
readinessProbe:#就緒探針
httpGet:
path:/actuator/health/readiness
port:management-port
initialDelaySeconds:30#延遲加載時(shí)間
periodSeconds:10#重試時(shí)間間隔
timeoutSeconds:1#超時(shí)時(shí)間設(shè)置
successThreshold:1#健康閾值
failureThreshold:9#不健康閾值
livenessProbe:#存活探針
httpGet:
path:/actuator/health/liveness
port:management-port
initialDelaySeconds:30#延遲加載時(shí)間
periodSeconds:10#重試時(shí)間間隔
timeoutSeconds:1#超時(shí)時(shí)間設(shè)置
successThreshold:1#健康閾值
failureThreshold:6#不健康閾值
resources:#容器資源管理
limits:#資源限制(監(jiān)控使用情況)
cpu:0.5
memory:1Gi
requests:#最小可用資源(靈活調(diào)度)
cpu:0.1
memory:200Mi
env:
-name:TZ
value:Asia/Shanghai
---
kind:HorizontalPodAutoscaler#彈性伸縮控制器
apiVersion:autoscaling/v2beta2
metadata:
name:{APP_NAME}
spec:
scaleTargetRef:
apiVersion:apps/v1
kind:Deployment
name:{APP_NAME}
minReplicas:{REPLICAS}#縮放范圍
maxReplicas:6
metrics:
-type:Resource
resource:
name:cpu#指定資源指標(biāo)
target:
type:Utilization
averageUtilization:50

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    494

    瀏覽量

    22046
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    338

    瀏覽量

    14312
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    149

    瀏覽量

    35786
  • GitHub
    +關(guān)注

    關(guān)注

    3

    文章

    467

    瀏覽量

    16389
  • 小程序
    +關(guān)注

    關(guān)注

    1

    文章

    234

    瀏覽量

    12114
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    169

原文標(biāo)題:K8s + SpringBoot實(shí)現(xiàn)零宕機(jī)發(fā)布

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于SpringBoot mybatis方式的增刪改查實(shí)現(xiàn)

    SpringBoot mybatis方式實(shí)現(xiàn)增刪改查
    發(fā)表于 06-18 16:56

    springboot集成mqtt

    springboot集成mqtt,大綱一.數(shù)據(jù)入庫(kù)1.數(shù)據(jù)入庫(kù)解決方案二.開(kāi)發(fā)實(shí)時(shí)訂閱發(fā)布展示頁(yè)面1.及時(shí)通訊技術(shù)2.技術(shù)整合
    發(fā)表于 07-16 07:53

    怎樣去使用springboot

    怎樣去使用springboot呢?學(xué)習(xí)springboot需要懂得哪些?
    發(fā)表于 10-25 07:13

    TELNET拔網(wǎng)線輸出信息較長(zhǎng)時(shí)宕機(jī)怎么解決

    用netutils-1.3.2版本里的telnet,發(fā)現(xiàn)如下兩個(gè)問(wèn)題:1、登錄telnet之后拔網(wǎng)線,立馬宕機(jī)2、再telnet里輸入netstat,假如netstat信息比較長(zhǎng),立馬宕機(jī)再論壇里
    發(fā)表于 08-24 14:07

    開(kāi)始入門(mén) K8s | 調(diào)度器的調(diào)度流程和算法介紹

    Kubernetes 作為當(dāng)下最流行的容器自動(dòng)化運(yùn)維平臺(tái),以聲明式實(shí)現(xiàn)了靈活的容器編排,本文以 v1.16 版本為基礎(chǔ)詳細(xì)介紹了 K8s 的基本調(diào)度框架、流程,以及主要的過(guò)濾器、Score 算法實(shí)現(xiàn)
    發(fā)表于 03-09 17:04 ?1163次閱讀

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬(wàn)的容器,突然感覺(jué)不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來(lái)了解一下 K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3417次閱讀

    簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系

    這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利用圖文講解的很透徹,有需要的同學(xué)可以研究下 最近項(xiàng)目用到kubernetes(以下簡(jiǎn)稱(chēng)k8sks之間有
    的頭像 發(fā)表于 06-24 15:48 ?3361次閱讀

    k8s-ovs一款基于ovs的k8s網(wǎng)絡(luò)插件

    ./oschina_soft/k8s-ovs.zip
    發(fā)表于 05-13 11:28 ?0次下載
    <b class='flag-5'>k8s</b>-ovs一款基于ovs的<b class='flag-5'>k8s</b>網(wǎng)絡(luò)插件

    mysql部署在k8s上的實(shí)現(xiàn)方案

    的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。這里主要講 mysql 部署在 k8s 上,mysql 部署在 k8s 上的優(yōu)勢(shì)主要有以下幾點(diǎn)。
    的頭像 發(fā)表于 09-26 10:39 ?2475次閱讀

    SpringBoot實(shí)現(xiàn)多線程

    SpringBoot實(shí)現(xiàn)多線程
    的頭像 發(fā)表于 01-12 16:59 ?1801次閱讀
    <b class='flag-5'>SpringBoot</b><b class='flag-5'>實(shí)現(xiàn)</b>多線程

    什么是 SpringBoot

    本文從為什么要有 `SpringBoot`,以及 `SpringBoot` 到底方便在哪里開(kāi)始入手,逐步分析了 `SpringBoot` 自動(dòng)裝配的原理,最后手寫(xiě)了一個(gè)簡(jiǎn)單的 `start` 組件,通過(guò)實(shí)戰(zhàn)來(lái)體會(huì)了 `
    的頭像 發(fā)表于 04-07 11:28 ?1268次閱讀
    什么是 <b class='flag-5'>SpringBoot</b>?

    SpringBoot的核心注解1

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到配置
    的頭像 發(fā)表于 04-07 14:34 ?676次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解1

    SpringBoot的核心注解2

    今天跟大家來(lái)探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到配置
    的頭像 發(fā)表于 04-07 14:34 ?1928次閱讀
    <b class='flag-5'>SpringBoot</b>的核心注解2

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    ),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。 在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過(guò)內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問(wèn),而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。 kubernetes(
    發(fā)表于 07-19 13:14 ?1100次閱讀

    k8s生態(tài)鏈包含哪些技術(shù)

    1. Apache APISIX Ingress 定義 ? 在 K8s 生態(tài)中,Ingress 作為表示 K8s 流量入口的一種資源,想要讓其生效,就需要有一個(gè) Ingress Controller
    的頭像 發(fā)表于 08-07 10:56 ?1187次閱讀
    <b class='flag-5'>k8s</b>生態(tài)鏈包含哪些技術(shù)