溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用k8s容器鉤子確保服務(wù)安全退出

發(fā)布時(shí)間:2021-09-08 15:24:05 來源:億速云 閱讀:165 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要為大家展示了“如何使用k8s容器鉤子確保服務(wù)安全退出”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用k8s容器鉤子確保服務(wù)安全退出”這篇文章吧。

Kubernetes為容器提供了生命周期鉤子。
鉤子能使容器感知其生命周期內(nèi)的事件,并且當(dāng)相應(yīng)的生命周期鉤子被調(diào)用時(shí)運(yùn)行指定的代碼。

@[TOC]

容器生命周期的鉤子

Kubernetes為容器提供了生命周期鉤子。
鉤子能使容器感知其生命周期內(nèi)的事件,并且當(dāng)相應(yīng)的生命周期鉤子被調(diào)用時(shí)運(yùn)行指定的代碼。

容器鉤子分為兩類觸發(fā)點(diǎn):容器創(chuàng)建后PostStart和容器終止前PreStop。

PostStart

這個(gè)鉤子在容器創(chuàng)建后立即執(zhí)行。
但是,并不能保證鉤子將在容器ENTRYPOINT之前運(yùn)行。
沒有參數(shù)傳遞給處理程序。

容器ENTRYPOINT和鉤子執(zhí)行是異步操作。
如果鉤子花費(fèi)太長(zhǎng)時(shí)間以至于容器不能運(yùn)行或者掛起, 容器將不能達(dá)到running狀態(tài)

PreStop

這個(gè)鉤子在容器終止之前立即被調(diào)用。
它是阻塞的,意味著它是同步的, 所以它必須在刪除容器的調(diào)用發(fā)出之前完成

如果鉤子在執(zhí)行期間掛起, Pod階段將停留在running狀態(tài)并且永不會(huì)達(dá)到failed狀態(tài)。

如果PostStart或者PreStop鉤子失敗, 容器將會(huì)被kill。
用戶應(yīng)該使他們的鉤子處理程序盡可能的輕量。

鉤子處理程序的實(shí)現(xiàn)

容器可以通過實(shí)現(xiàn)和注冊(cè)該鉤子的處理程序來訪問鉤子。
可以為容器實(shí)現(xiàn)兩種類型的鉤子處理程序:

  • Exec - 在容器的cgroups和命名空間內(nèi)執(zhí)行一個(gè)特定的命令,比如pre-stop.sh。
    該命令消耗的資源被計(jì)入容器。

  • HTTP - 對(duì)容器上的特定的端點(diǎn)執(zhí)行HTTP請(qǐng)求。

在Pod的事件中沒有鉤子處理程序的日志。 如果一個(gè)處理程序因?yàn)槟承┰蜻\(yùn)行失敗,它廣播一個(gè)事件。
對(duì)于PostStart, 這是FailedPostStartHook事件, 對(duì)于PreStop, 這是FailedPreStopHook事件。
你可以通過運(yùn)行kubectl describe pod <pod_name>來查看這些事件。

定義預(yù)啟動(dòng)和預(yù)結(jié)束事件操作

下面將會(huì)創(chuàng)建含有一個(gè)容器的Pod,我們將會(huì)給這個(gè)容器設(shè)置預(yù)啟動(dòng)和預(yù)結(jié)束操作。
https://raw.githubusercontent.com/kubernetes/website/master/docs/tasks/configure-pod-container/lifecycle-events.yaml

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/usr/sbin/nginx","-s","quit"]

使用 prestop hook 保證服務(wù)安全退出

在實(shí)際生產(chǎn)環(huán)境中使用spring框架,由于服務(wù)更新過程中,服務(wù)容器被直接終止,部分請(qǐng)求仍然被分發(fā)到終止的容器,導(dǎo)致出現(xiàn)500錯(cuò)誤,這部分錯(cuò)誤的請(qǐng)求數(shù)據(jù)占比較少,也可以忽略。
考慮添加優(yōu)雅的終止方式,將錯(cuò)誤請(qǐng)求降到最低,直至沒有錯(cuò)誤出現(xiàn)。

這里介紹 spring cloud 的服務(wù)發(fā)現(xiàn)組件:
Eureka 是一個(gè)基于 REST 的服務(wù),作為服務(wù)注冊(cè)中心,用于定位服務(wù)來進(jìn)行中間層服務(wù)器負(fù)載均衡和故障轉(zhuǎn)移。
各服務(wù)啟動(dòng)時(shí),會(huì)向Eureka Server注冊(cè)自己的信息(IP,端口,服務(wù)信息等),Eureka Server會(huì)存儲(chǔ)這些信息.
微服務(wù)啟動(dòng)后,會(huì)周期性(默認(rèn)30秒)的向Eureka Server發(fā)送心跳以續(xù)約自己的”租期”,并可以從eureka中獲取其他微服務(wù)的地址信息,執(zhí)行相關(guān)的邏輯。

考慮現(xiàn)在eureka server 修改注冊(cè)實(shí)例的狀態(tài),暫停服務(wù)( InstanceStatus.OUT_OF_SERVICE ),保留一段時(shí)間后,再刪除服務(wù)。

禁用某個(gè)服務(wù):
curl -X PUT “http://admin:admin@192.168.101.100:8761/eureka/apps/{appName}/{instanceId}/status?value=OUT_OF_SERVICE"

說明:admin:admin是eureka的登錄名和密碼,如果沒有,直接去掉前面這段;
instanceId是上面打開的鏈接顯示的服務(wù)列表中的標(biāo)簽內(nèi)容,如:myapp:192.168.1.100:8080

在k8s 中的具體操作:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: NAME-service-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: NAME-service
  template:
    metadata:
      labels:
        app: NAME-service
    spec:
      containers:
      - name: NAME-service
        lifecycle:
          preStop:
            exec:
              command:
                - "/bin/sh"
                - "-c"
                - ">

刪除了無用的信息,重點(diǎn)關(guān)注 lifecycle
首先定義了服務(wù)名和端口的環(huán)境變量,把這部分單獨(dú)作為變量,便于不同的服務(wù)進(jìn)行修改。
使用 curl PUT 到eureka 配置狀態(tài)為 OUT_OF_SERVICE。
配置一個(gè)sleep時(shí)間,作為服務(wù)停止緩沖時(shí)間。

以上是“如何使用k8s容器鉤子確保服務(wù)安全退出”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

k8s
AI