Kubernetes容器上下文環境

目錄貼:Kubernetes學習系列

  下面我們將主要介紹運行在Kubernetes集群中的容器所能夠感知到的上下文環境,以及容器是如何獲知這些信息的。

  首先,Kubernetes提供了一個能夠讓容器感知到集群中正在發生的事情的方法:環境變量。作為容器環境組成的一部分,這些集群信息對于容器構建“集群環境感知”起著非常重要的作用。其次,Kubernetes容器環境還包括一系列與容器生命周期相關的容器鉤子,其對應的回調函數hook handler可以作為單個容器可選定義項的一部分。這個容器鉤子與操作系統傳統進程模型的通知回調機制有些類似。其實,還有一個與容器環境相關的重要部分是容器可用的文件系統。通過前面的討論可知,在Kubernetes中,容器的文件系統由一個容器鏡像和若干個Volume組成。

  下面我們將著重討論暴露給容器的集群信息和用于向容器發布對其生命周期管理信息的容器鉤子這兩種同容器上下文環境協作的方法。

1、集群環境感知

  運行在Kubernetes集群中的一個容器在容器內部能夠感知兩種類型的環境變量信息,一種是與容器自身相關的信息,另一種是集群的信息。

1.1容器自身信息

  容器能夠感知到的與容器自身相關的信息包括運行該容器的pod的名字、pod所在的namespace、在pod資源配置文件中env字段定義的鍵/值對,等等。其中,pod的名字被設置成容器的的主機名,而且可以在容器內通過所有訪問主機名的方式獲得,例如,hostname命令或JAVA中InetAddress.getLocalHost()函數調用。pod的名字和namespace還可以通過downwardAPI進行訪問。對容器而言,用戶在pod資源配置文件中自定義的環境變量的可訪問性與在Docker鏡像中指定的環境變量是一樣的。downwardAPI示例如下:

[root@k8s-master downwardapi]# cat test-downwardapi.yaml 
apiVersion: v1
kind: Pod
metadata:name: test-downwardaoi-volumelabels:name: test-downwardaoi-volumezone: us-eastcluster: test-cluster1annotations:build: twobuilder: zhenyuyaodidiao
spec:containers:- name: test-hostpathimage: registry:5000/back_demon:1.0volumeMounts:- name: podinfomountPath: /home/laizy/podinforeadOnly: falsecommand:- /run.shvolumes:- name: podinfodownwardAPI:items:- path: "pod_name"fieldRef:fieldPath: metadata.name- path: "pod_namespace"fieldRef:fieldPath: metadata.namespace- path: "pod_labels"fieldRef:fieldPath: metadata.labels- path: "pod_annotations"fieldRef:fieldPath: metadata.annotations[root@k8s-master downwardapi]# kubectl create -f test-downwardapi.yaml 
pod "test-downwardaoi-volume" created[root@k8s-master downwardapi]# kubectl exec -ti test-downwardaoi-volume /bin/bash
[root@test-downwardaoi-volume /]# cd /home/laizy/podinfo/
[root@test-downwardaoi-volume podinfo]# ls
pod_annotations  pod_labels  pod_name  pod_namespace
[root@test-downwardaoi-volume podinfo]# cat pod_annotations 
build="two"
builder="zhenyuyaodidiao"
kubernetes.io/config.seen="2017-03-22T09:42:11.832955302+08:00"
kubernetes.io/config.source="api"
[root@test-downwardaoi-volume podinfo]# cat pod_labels 
cluster="test-cluster1"
name="test-downwardaoi-volume"
zone="us-east"
[root@test-downwardaoi-volume podinfo]# cat pod_name
test-downwardaoi-volume
[root@test-downwardaoi-volume podinfo]# cat pod_name
test-downwardaoi-volume
[root@test-downwardaoi-volume podinfo]# cat pod_namespace 
default
[root@test-downwardaoi-volume podinfo]# exit
exit

?

1.2集群信息

  我們在前面已經討論過Kubernetes服務發現的兩種機制:DNS和環境變量。service環境變量屬于集群信息,在容器創建時由Kubemetes集群API注人,在容器內以環境變量或域名的方式被訪問。

2.容器鉤子

  容器鉤子是Kubemetes針對容器生命周期管理引入的事件處理機制,它負責監聽Kubemetes對容器生命周期的管理信息,并將這些信息以廣播的形式通知給容器。然后執行相應的回調函數。

2.1容器鉤子類型

  Kubemetes支持兩種類型的容器鉤子,分別為PostStart和PreStop。

  PostStart。該鉤子在容器被創建后立刻觸發,通知容器它已經被創建。該鉤子不需要向其所對應的hook handler傳人任何參數。如果該鉤子對應的hook handler執行失敗,則該容器會被殺死,并根據該容器的重啟策略決定是否要重啟該容器。

  PreStop。該鉤子在容器被刪除前觸發,其所對應的hook handler必須在刪除該容器的請求發送給Docker daemon之前完成。在該鉤子對應的hook handler完成后不論執行的結果如何,Docker daemon會發送一個SGTERN信號量給Docker daemon來刪除該容器。同樣地。該鉤子也不需要傳人任何參數

2.2hook handler執行

  當一個容器管理hook發生時,管理系統將會在容器中調用注冊的hook handler。其中hook handler通過在包含該容器的pod資源配置文件的Lifecycle字段中定義來完成注冊。注意,當hook handler在執行時,其他對該容器所在pod的管理動作將被阻塞除非該容器異常退出。而如果你自定義的hook handler阻塞時,其他對pod的管理操作包括容器健康檢查將不會發生,直到hook handler繼續執行完畢。因此,一般建議用戶自定義的hook handler代碼盡可能地輕量化,盡管確實有一些場景的hook handler需要長時間運行(例如在容器時退出保存運行狀態等)。

2.3hook handler的執行方式

  hook handler是hook在容器內執行的回調函數,也即hook暴露給容器的方式。Kubemetes支持兩種不同的hook handler類型,分別是Exec和HTTPGet。

    Exec。在容器的cgroup和namespace內啟動一個新進程來執行指定的命令,由該命令消耗的資源全部要計人容器的消耗。正如在之前容器健康檢查中提到的,如果Exec執行的命令最后在標準輸出stdout的結果為0k,就代表handler執行成功,否則就被認為執行異常,并且Kuberlet將強制重新啟動該容器。

    HTTPGet。向容器的指定接口發起一個HTTP請求作為handler的具體執行內容,并通過返回的HTTP狀態碼來判斷該請求執行是否成功。

  綜上,hook機制為用戶提供了一種能夠根據容器生命周期及其上下文的變化來觸發不同操作的協作方法。這對于很多需要精細控制容器的場景是非常有用的,比如在容器結束前執行一些清理工作來保證其“優雅”退出。以下給出hook執行exec的示例:

[root@k8s-master hook]# cat test-lifecycle-hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:labels:name: test-lifecycle-hostpathrole: mastername: test-lifecycle-hostpath
spec:containers:- name: test-lifecycle-hostpathimage: registry:5000/back_demon:1.0lifecycle:postStart:exec:command:- "touch"- "/home/laizy/test/hostpath/post-start"preStop:exec:command:- "touch"- "/home/laizy/test/hostpath/pre-stop"volumeMounts:- name: testhostmountPath: /home/laizy/test/hostpathreadOnly: falsecommand:- /run.shvolumes:- name: testhosthostPath:path: /home/testhost
[root@k8s-master hook]# date
2017年 03月 22日 星期三 10:21:58 CST
[root@k8s-master hook]# kubectl create -f test-lifecycle-hostpath.yaml 
pod "test-lifecycle-hostpath" created
[root@k8s-master hook]# kubectl get pod -o wide
NAME                                READY     STATUS    RESTARTS   AGE       IP          NODE
test-lifecycle-hostpath             1/1       Running   0          13s       10.0.9.3    k8s-node-3
[root@k8s-master hook]# date
2017年 03月 22日 星期三 10:22:52 CST
[root@k8s-master hook]# kubectl delete pod test-lifecycle-hostpath 
pod "test-lifecycle-hostpath" deleted

在node3上查看外掛出來的路徑上,生成了兩個文件,post-start文件是在pod創建之后生成的;pre-stop文件是在pod刪除之前生成的。

[root@k8s-node-3 ~]# ll /home/testhost/
總用量 0
-rw-r--r--. 1 root root 0 3月  22 10:22 post-start
-rw-r--r--. 1 root root 0 3月  22 10:23 pre-stop
[root@k8s-node-3 ~]# 

?

對應的httpGet示例簡單示意如下:

containers:- name: lifecycleimage: busyboxlifecycle:postStart:exec:command:- "touch"- "/var/log/lifecycle/post-start"preStop:httpGet:path: "/abort"port: 8080

?

轉載于:https://www.cnblogs.com/zhenyuyaodidiao/p/6558444.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253135.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shell-腳本只能運行1次

用空文件進行判斷 pathpwd if [ -f ${path}/.runned ]; then {echo "This script can only execute once! You have runned it!"exit } elsetouch ${path}/.runned fi 轉載于:https://www.cnblogs.com/music378/p/7677648.html

運放電壓跟隨電路應用

電壓跟隨器的顯著特點:輸入阻抗高,輸出阻抗低。 如下所示為利用放大器搭建的電壓跟隨電路,方便測量電壓大小: 此電路目的是測量電池電壓,電池電壓范圍(3~4.2V)分壓后最大電壓為2.1V 屬于3.3V電…

Mac與Phy組成原理的簡單分析

Mac與Phy組成原理的簡單分析 2011-12-28 15:30:43 //http://blog.chinaunix.net/uid-20528014-id-3050217.html 本文乃fireaxe原創,使用GPL發布,可以自由拷貝,轉載。但轉載請保持文檔的完整性,并注明原作者及原鏈接。內容可任意使…

[BZOJ3994][SDOI2015]約數個數和

3994: [SDOI2015]約數個數和 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1104 Solved: 762 [Submit][Status][Discuss]Description 設d(x)為x的約數個數,給定N、M,求 Input 輸入文件包含多組測試數據。 第一行,一個整數T&#xff0…

月蝕動漫獲快看漫畫600萬元A輪戰略投資,走國漫精品化路線

11月5日消息,月蝕動漫宣布獲得快看漫畫600萬元A輪戰略投資。 據了解,月蝕動漫曾于2017年1月獲得原力創投的百萬級種子輪投資,2018年1月獲得英諾天使基金的百萬級天使輪投資。 據月蝕動漫創始人賀小桐透露,團隊能在行業寒冬期獲得…

大力智能臺燈T6 結構拆解

近幾年教育硬件產品層出不窮,教育硬件賽道布局時間較長的有網易、訊飛、步步高系等公司,2020年10月,字節跳動旗下大力教育經過兩年多的調研和研發,高調推出首款智能硬件產品“大力智能作業臺燈” T5。 上市一年取得不錯的銷售成績…

C++靜態庫與動態庫

http://www.cnblogs.com/skynet/p/3372855.html

第5章 IDA Pro

5.1 加載一個可執行文件 默認情況下IDA Pro的反匯編代碼中不包含PE頭或資源節,可以手動指定加載。 5.2 IDA Pro接口 5.2.1 反匯編窗口模式 二進制模式/圖形模式: 圖形模式:紅色表示一個條件跳轉沒有被采用,綠色表示這個條件跳轉被…

樹鏈剖分(模板)

luogu題庫 題目描述 如題,已知一棵包含N個結點的樹(連通且無環),每個節點上包含一個數值,需要支持以下操作: 操作1: 格式: 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上…

定制或外購適配器規格需求列表

輸入特性例如輸入電壓180~264VAC 200~264VAC輸入頻率47~63Hz輸入電流0.7A Max功率因素>0.47 10W220VAC浪涌電流<60A電源效率>81.26%空載功耗0.2W 輸出特性例如輸出電壓11.4~12.6V DC輸出電流1.75A紋波要求<120mV 負載調整率5%線性…

使用 typescript ,提升 vue 項目的開發體驗(1)

此文已由作者張漢銳授權網易云社區發布。歡迎訪問網易云社區,了解更多網易技術產品運營經驗。前言:對于我們而言,typescript 更像一個工具官方指南從 vue2.5 之后,vue 對 ts 有更好的支持。根據官方文檔,vue 結合 type…

Linux進程間通信——使用共享內存

//本文轉載http://blog.csdn.net/ljianhui/article/details/10253345下面將講解進程間通信的另一種方式,使用共享內存。一、什么是共享內存顧名思義,共享內存就是允許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞…

laravel擴展包開發步驟總結

1. 創建包1php artisan workbench vendor/package --resources注: vendor:開發商名 package:包名2.修改下包里composer.json中的authors123456"authors": [{"name": "cicl","email": "test126.com"}]3. 為創建的包注冊Se…

洛谷 P1340 獸徑管理

題目描述 約翰農場的牛群希望能夠在 N 個(1<N<200) 草地之間任意移動。草地的編號由 1到 N。草地之間有樹林隔開。牛群希望能夠選擇草地間的路徑&#xff0c;使牛群能夠從任一 片草地移動到任一片其它草地。 牛群可在路徑上雙向通行。 牛群并不能創造路徑&#xff0c;但是…

功放關鍵規格參數檢查

編號規格備注1功放類型(開環/閉環)影響電性能指標2工作電壓(V)影響IC的穩定性3最大耐壓(V)影響IC的穩定性4最小負載(ohm)穩定性&#xff0c;過流&#xff0c;輸出功率&#xff0c;散熱5輸出功率過流&#xff0c;輸出功率&#xff0c;散熱6輸出方式(SE/BTL/PBTL)輸出功率&#x…

不踩雷不將就 京東智能產品30天無憂退

剁手節已經來臨&#xff0c;鋪天蓋地的促銷信息讓人應接不暇&#xff0c;恰好又是換季&#xff0c;確實需要買買買一波了。各種滿減活動讓人眼花繚亂&#xff0c;這波堪稱全年最大力度的促銷活動&#xff0c;令人是又喜又怕。倘若之前踩過雷的朋友&#xff0c;必然現在會謹慎許…

Linux進程間通信——使用信號量

//轉自http://blog.csdn.net/ljianhui/article/details/10243617 這篇文章將講述別一種進程間通信的機制——信號量。注意請不要把它與之前所說的信號混淆起來&#xff0c;信號與信號量是不同的兩種事物。有關信號的更多內容&#xff0c;可以閱讀我的另一篇文章&#xff1a;L…

麥克風陣列音頻檢查方法和標準

為確保產品能夠符合算法要求&#xff0c;務必提前做好相關設計&#xff0c;盡量確保各項指標滿足如下標準。 音頻評測工作&#xff0c;主要集中在研發設計階段&#xff1b;針對產品形態的不同&#xff0c;測試可分為裸板測試和整機測 試&#xff0c;下表為不同階段需要測試的…

Linux下git的使用——將已有項目放到github上

本地已經有一個項目了&#xff0c;需要將該項目放到github上&#xff0c;怎么操作&#xff1f; 步驟&#xff1a; 本地安裝git&#xff0c;有github賬號是前提。 &#xff08;1&#xff09;先在github創建一個空的倉庫&#xff0c;并復制鏈接地址。使用https&#xff0c;以.git…

SVG格式圖片轉成HTML中SVG的Path路徑

AI圖標制作完成之后&#xff0c;保存的svg文件包含許多AI的信息&#xff0c;如果要在HTML中使用&#xff0c;我們需要在svg文件中提取/修改信息&#xff0c;重新保存。 1、在AI中已經完成圖標&#xff0c;要保存SVG文件&#xff0c;點擊“文件(File)”-“另存為(Save As)”&…