k8s——pod 基礎(chǔ)&進(jìn)階

Pod 基礎(chǔ)

基本概念

Pod 的實(shí)質(zhì)只是一個(gè)邏輯概念, k8s 真正處理的還是 Linux 容器的 Namspace 和 Cgroup.
Pod 可以類比于操作系統(tǒng)
Container 則類比于應(yīng)用程序

Pod 創(chuàng)建過程

Pod, 其實(shí)是一組共享可某些資源的容器

  1. 創(chuàng)建中間容器, infra 容器

    占用資源極少, 僅用來控制 Namspace 和 Cgroup
    整個(gè)Pod只有一個(gè) ip 地址
    Pod 內(nèi)的容器 A B可以直接使用 localhosts 進(jìn)行通信, 他們共用一份的資源
    Pod 的生命周期只跟 infra 容器一致

  2. 其他定義的容器通過 Join Network Namespace 的方式, 與 infra 容器關(guān)聯(lián)在一起

Pod 中重要字段

  • NodeSelector

    是一個(gè)供用戶將 pod 與 node 進(jìn)行綁定的字段注暗。
    這樣的一個(gè)配置限定了該 pod 只能運(yùn)行在 'disktype: ssd' 標(biāo)簽的節(jié)點(diǎn)上。

apiVersion: v1
kind: Pod
...
spec:
 nodeSelector:
   disktype: ssd
  • NodeName

    用戶設(shè)置時(shí)用于測(cè)試或調(diào)試祷膳,一般由調(diào)度器負(fù)責(zé)設(shè)置

  • HostAliases

    定義了 Pod 的 host 文件

apiVersion: v1
kind: Pod
...
spec:
  hostAliases:
  ‐ ip: "10.1.2.3"
    hostnames:
    ‐ "foo.remote"
    ‐ "bar.remote"
...
  • ImagePullPolicy

    定義鏡像拉取的策略屡立,默認(rèn)是 Always(每次創(chuàng)建 pod 都要重新拉取一次)
    Nerver/isNotPresent 不主動(dòng)拉取/宿主機(jī)不存在時(shí)拉取

  • Lifecycle

    定義 Container Lifecycle Hooks.

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"]

postStart, 在容器啟動(dòng)后立即執(zhí)行一個(gè)指定的操作膨俐。
preStop, 在容器被殺死之前執(zhí)行一個(gè)指定的操作。

容器的設(shè)計(jì)模式

  • sidecar

sidecar 指的就是我們可以在一個(gè) Pod 中焚刺,啟動(dòng)一個(gè)輔助容器,來完成一些獨(dú)立于主進(jìn)
程(主容器)之外的工作兄淫。
比如蔓姚,在我們的這個(gè)應(yīng)用 Pod 中,Tomcat 容器是我們要使用的主容器泄私,而 WAR 包容器的存在备闲,
只是為了給它提供一個(gè) WAR 包而已。所以恬砂,我們用 Init Container 的方式優(yōu)先運(yùn)行 WAR 包容器泻骤,
扮演了一個(gè) sidecar 的角色乳幸。

apiVersion: v1
kind: Pod
metadata:
  name: javaweb‐2
spec:
  initContainers:
  ‐ image: geektime/sample:v2
    name: war
    command: ["cp", "/sample.war", "/app"]
    volumeMounts:
    ‐ mountPath: /app
      name: app‐volume
  containers:
  ‐ image: geektime/tomcat:7.0
    name: tomcat
    command: ["sh","‐c","/root/apache‐tomcat‐7.0.42‐v2/bin/start.sh"]
    volumeMounts:
    ‐ mountPath: /root/apache‐tomcat‐7.0.42‐v2/webapps
      name: app‐volume
    ports:
    ‐ containerPort: 8080
      hostPort: 8001 
  volumes:
  ‐ name: app‐volume
    emptyDir: {}

Pod 進(jìn)階

Projected Volume

投射數(shù)據(jù)卷钧椰,是為容器提供預(yù)先定義好的數(shù)據(jù)符欠。

  • Secret;
  • ConfigMap诊沪;
  • Downward API曾撤;
  • ServiceAccountToken。

Secret

它的作用挤悉,是幫你把 Pod 想要訪問的加密數(shù)據(jù)装悲,存放到 Etcd 中

典型的使用場(chǎng)景(存放數(shù)據(jù)庫的 Credential 信息):

apiVersion: v1
kind: Pod
metadata:
  name: test‐projected‐volume 
spec:
  containers:
  ‐ name: test‐secret‐volume
    image: busybox
    args:
    ‐ sleep
    ‐ "86400"
    volumeMounts:
    ‐ name: mysql‐cred
      mountPath: "/projected‐volume"
      readOnly: true
  volumes:
  ‐ name: mysql‐cred
    projected:
      sources:
      ‐ secret:
          name: user
      ‐ secret:
          name: pass

上面 pod 中用到的數(shù)據(jù)庫的用戶名、密碼
正是以 Secret 對(duì)象的方式交給 Kubernetes 保存的

$ kubectl create secret generic user ‐‐from‐file=./username.txt
$ kubectl create secret generic pass ‐‐from‐file=./password.tx

也可以使用 YAML 文件的方式創(chuàng)建 Secret 對(duì)象
這種方式可以只保存一個(gè) Secret 對(duì)象洞渤,包含兩份 Secret 數(shù)據(jù)

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  user: YWRtaW4=
  pass: MWYyZDFlMmU2N2Rm

注意01: 為了避免明文風(fēng)險(xiǎn), Secret對(duì)象保存的數(shù)據(jù)必須是經(jīng)過 Base64 轉(zhuǎn)碼的

$ echo ‐n 'admin' | base64
YWRtaW4=
$ echo ‐n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

注意02: 生產(chǎn)環(huán)境中属瓣,還應(yīng)開啟 Secret 的加密插件

ConfigMap

可以從文件或者目錄創(chuàng)建 ConfigMap, 也可以直接編寫 ConfigMap 對(duì)象的 YAML 文件

# 配置文件
cat example/ui.properties

# 保存
$ kubectl create configmap ui‐config ‐‐from‐file=example/ui.properties

# 查看
$ kubectl get configmaps ui‐config ‐o yaml

Downward API

Downward API 能夠獲取到的信息,一定是 Pod 里的容器進(jìn)程啟動(dòng)之前就能夠確定下來的信息

volumes:
  ‐ name: podinfo
    projected:
      sources:
      ‐ downwardAPI:
        items:
          ‐ path: "labels"
            fieldRef:
              fieldPath: metadata.labels

ServiceAccountToken

Service Account

解決 API Server 的授權(quán)問題
Service Account 對(duì)象的作用是 Kubernetes 進(jìn)行權(quán)限分配的對(duì)象

比如:

Service Account A护昧,可以只被允許對(duì) Kubernetes API 進(jìn)行 GET 操作
Service Account B溜畅,則可以有 Kubernetes API 的所有操作的權(quán)限

ServiceAccountToken

像這樣的 Service Account 的授權(quán)信息和文件,實(shí)際上保存在它所綁定的一個(gè)特殊的 Secret 對(duì)象里的怠晴。這個(gè)特殊的 Secret 對(duì)象,就叫作ServiceAccountToken

k8s 為每個(gè) pod 都提供了一個(gè)默認(rèn)的服務(wù)賬戶

$ kubectl describe pod nginx‐deployment‐5c678cfb6d‐lg9lw

pod 健康檢查與恢復(fù)機(jī)制

  1. 恢復(fù)機(jī)制
    pod.spec.restartPolicy
  • Always
  • OnFailure
  • Never
  1. 健康檢查機(jī)制
    livenessProbe

可定義執(zhí)行命令浴捆,發(fā)起 http/tcp 請(qǐng)求

# http
livenessProbe:
   httpGet:
      path: /healthz
      port: 8080
      httpHeaders:
      ‐ name: X‐Custom‐Header
        value: Awesome
  initialDelaySeconds: 3
  periodSeconds: 3

# tcp
livenessProbe:
   tcpSocket:
      port: 8080
   initialDelaySeconds: 15
   periodSeconds: 20

# command
livenessProbe:
 exec:
 command:
        ‐ cat
        ‐ /tmp/healthy
 initialDelaySeconds: 5
 periodSeconds: 5

PodPreset(Pod 預(yù)配置)

preset.yaml

apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
  name: allow‐database
spec:
  selector:
    matchLabels:
      role: frontend
  env:
    ‐ name: DB_PORT
      value: "6379"
  volumeMounts:
    ‐ mountPath: /cache
      name: cache‐volume
  volumes:
    ‐ name: cache‐volume
      emptyDir: {}

pod.yaml

pod.yaml 定義了 role: frontend 標(biāo)簽
會(huì)被自動(dòng)添加 preset.yaml 中的內(nèi)容

apiVersion: v1
kind: Pod
metadata:
  name: website
  labels:
    app: website
    role: frontend
spec:
  containers:
    ‐ name: website
      image: nginx
      ports:
        ‐ containerPort: 80
$ kubectl create ‐f preset.yaml
$ kubectl create ‐f pod.yaml
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冲粤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梯捕,更是在濱河造成了極大的恐慌,老刑警劉巖襟铭,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件短曾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哩都,警方通過查閱死者的電腦和手機(jī)婉徘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來献雅,“玉大人塌计,你說我怎么就攤上這事⌒拷觯” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贱傀,是天一觀的道長伊脓。 經(jīng)常有香客問我,道長报腔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任纤房,我火速辦了婚禮翻诉,結(jié)果婚禮上捌刮,老公的妹妹穿的比我還像新娘舒岸。我一直安慰自己,他們只是感情好棚蓄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布碍脏。 她就那樣靜靜地躺著稍算,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钾埂。 梳的紋絲不亂的頭發(fā)上科平,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音髓考,去河邊找鬼弃酌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妓湘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豌研,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼唬党,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了初嘹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤坷随,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缸匪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體类溢,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年砂心,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛇耀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡译暂,死狀恐怖撩炊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伯顶,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布砾淌,位于F島的核電站谭网,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏愉择。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一衷戈、第九天 我趴在偏房一處隱蔽的房頂上張望层坠。 院中可真熱鬧,春花似錦谦趣、人聲如沸疲吸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捂寿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窃祝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抡句,地道東北人杠愧。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像流济,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雕憔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344