Pod 基礎(chǔ)
基本概念
Pod 的實(shí)質(zhì)只是一個(gè)邏輯概念, k8s 真正處理的還是 Linux 容器的 Namspace 和 Cgroup.
Pod 可以類比于操作系統(tǒng)
Container 則類比于應(yīng)用程序
Pod 創(chuàng)建過程
Pod, 其實(shí)是一組共享可某些資源的容器
- 創(chuàng)建中間容器, infra 容器
占用資源極少, 僅用來控制 Namspace 和 Cgroup
整個(gè)Pod只有一個(gè) ip 地址
Pod 內(nèi)的容器 A B可以直接使用 localhosts 進(jìn)行通信, 他們共用一份的資源
Pod 的生命周期只跟 infra 容器一致 - 其他定義的容器通過 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ī)制
- 恢復(fù)機(jī)制
pod.spec.restartPolicy
- Always
- OnFailure
- Never
- 健康檢查機(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