(2023.11.05 Sun @KLN)
YAML格式
YAML全稱Yet Another Makeup Language脸狸。經(jīng)常見到的.yml
格式文件可以當(dāng)做是json
文件的超集(superset)最仑,也就是說json文件可以轉(zhuǎn)換為.yml
文件藐俺。
在Kubernetes中,一個(gè).yml
文件作為K8S manifest用來創(chuàng)建pod泥彤。
YAML格式簡單易學(xué)欲芹,其中只有兩種數(shù)據(jù)結(jié)構(gòu),
- maps
- lists
下面分別介紹吟吝。
YAML Maps
maps是一個(gè)key-value型結(jié)構(gòu)菱父,類似于Python中的dict。
---
apiVersion: v1
kind: Pod
首行的---
是分隔符剑逃,在.yml
中是可選項(xiàng)浙宜,除非需要同單一文件中定義多個(gè)結(jié)構(gòu)。在該案例中有兩個(gè)值v1
和Pod
蛹磺,對應(yīng)的key是apiVersion
和kind
梆奈。
該案例相當(dāng)于如下的JSON文件
{
"apiVersion": "v1",
"kind": "Pod"
}
需要注意的是,在YAML格式中称开,引號"
可以省略。
maps結(jié)構(gòu)可以更加復(fù)雜乓梨。
---
apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
api: web
這個(gè)案例中多了一個(gè)key metadata
鳖轰,該key是嵌入(nested)式的key,其中還包含了labels和api這樣的key
YAML的處理器可以根據(jù)空格數(shù)(indentation level)來判定扶镀,空格數(shù)可兩個(gè)可多個(gè)蕴侣,由使用者來定,但一定要保持一致性(consistency)臭觉,比如name和labels是同一級key昆雀,所以前面都是兩個(gè)空格逼龟,而api是labels的nested key逻悠,所以空四格。
注意止吁,不要在YAML文件中使用Tab
鍵空格什乙。
上面案例對應(yīng)的JSON文件如下
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "rss-site",
"labels": {
"app": "web"
}
}
}
YAML Lists
一個(gè)包含多個(gè)元素的數(shù)據(jù)結(jié)構(gòu)挽封。每個(gè)元素前面空格,由-
開始臣镣,在該符號之后在空一格辅愿。一個(gè)-
符號對應(yīng)了一個(gè)元素。
案例如
args:
- sleep
- "1000"
- message
- "Bring back Firefly!"
該list對應(yīng)的JSON表達(dá)為
{
"args": ["sleep", "1000", "message", "Bring back Firefly!"]
}
lists中的元素可以是maps
---
apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
- containerPort: 88
該案例對應(yīng)的JSON文件如
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "rss-site",
"labels": {
"app": "web"
}
},
"spec": {
"containers": [
{
"name": "front-end",
"image": "nginx",
"ports": [
{
"containerPort": "80"
}
]
},
{
"name": "rss-reader",
"image": "nickchase/rss-php-nginx:v1",
"ports": [
{
"containerPort": "88"
}
]
}
]
}
}
(2023.11.12 Sun @KLN)
K8S中YAML設(shè)置
K8S中可以使用設(shè)置Pod和Deployment忆某。
創(chuàng)建pod
首先配置一個(gè)Pod点待,名pod.yml
。
---
apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
- containerPort: 88
逐個(gè)參數(shù)分析弃舒。apiVersion
顧名思義癞埠,注意該案例為Pod,當(dāng)kind
為Deployment時(shí),需要指定另一個(gè)版本因Deployment不存在于v1中燕差。
kind
參數(shù)用來指定YAML創(chuàng)建的類型遭笋,除了穩(wěn)重設(shè)置的Pod
,還可設(shè)置Deployment
徒探,Job
瓦呼,Service
以及其他。
metadata
參數(shù)测暗,其中包括該P(yáng)od的名字央串,已經(jīng)該pod在K8S中的識別標(biāo)簽label
。
spec
參數(shù)用來指定該pod的實(shí)體碗啄。spec
的屬性包括容器质和,內(nèi)存需求,存儲容量稚字,網(wǎng)絡(luò)設(shè)置饲宿,容器失敗時(shí)是否重啟,以及其他胆描。
通過kubectl create -f pod.yml
命令即可根據(jù)pod.yml
中指定的設(shè)置生成一個(gè)pod瘫想。
> kubectl create -f pod.yaml
pod "rss-site" created
查看當(dāng)前pod的情況,使用kubectl get pods
命令
> kubectl get pods
NAME READY STATUS RESTARTS AGE
rss-site 0/2 ContainerCreating 0 6s
注意該pod的STATUS
是ContainerCreating
昌讲,稍事片刻重新執(zhí)行kubectl get pods
命令會看到變?yōu)?code>running国夜。
> kubectl get pods
NAME READY STATUS RESTARTS AGE
rss-site 2/2 Running 0 14s
刪除該pod,用kubectl delete rss-site
> kubectl delete pod rss-site
pod "rss-site" deleted
當(dāng)pod狀態(tài)不正常短绸,比如ErrImagePull
车吹,時(shí),用kubectl describe pod rss-site
查看pod狀態(tài)
> kubectl describe pod rss-site
Name: rss-site
Namespace: default
Node: 10.0.10.7/10.0.10.7
Start Time: Sun, 08 Jan 2017 08:36:47 +0000
Labels: app=web
Status: Pending
IP: 10.200.18.2
Controllers:
Containers:
front-end:
Container ID: docker://a42edaa6dfbfdf161f3df5bc6af05e740b97fd9ac3d35317a6dcda77b0310759
Image: nginx
Image ID: docker://sha256:01f818af747d88b4ebca7cdabd0c581e406e0e790be72678d257735fad84a15f
Port: 80/TCP
State: Running
Started: Sun, 08 Jan 2017 08:36:49 +0000
Ready: True
Restart Count: 0
Environment Variables:
rss-reader:
Container ID:
Image: nickchase/rss-php-nginx
Image ID:
Port: 88/TCP
State: Waiting
Reason: ErrImagePull
Ready: False
Restart Count: 0
Environment Variables:
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
No volumes.
QoS Tier: BestEffort
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
45s 45s 1 {default-scheduler } Normal Scheduled Successfully assigned rss-site to 10.0.10.7
44s 44s 1 {kubelet 10.0.10.7} spec.containers{front-end} Normal Pulling pulling image "nginx"
45s 43s 2 {kubelet 10.0.10.7} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
43s 43s 1 {kubelet 10.0.10.7} spec.containers{front-end} Normal Pulled Successfully pulled image "nginx"
43s 43s 1 {kubelet 10.0.10.7} spec.containers{front-end} Normal Created Created container with docker id a42edaa6dfbf
43s 43s 1 {kubelet 10.0.10.7} spec.containers{front-end} Normal Started Started container with docker id a42edaa6dfbf
43s 29s 2 {kubelet 10.0.10.7} spec.containers{rss-reader} Normal Pulling pulling image "nickchase/rss-php-nginx"
42s 26s 2 {kubelet 10.0.10.7} spec.containers{rss-reader} Warning Failed Failed to pull image "nickchase/rss-php-nginx": Tag latest not found in repository docker.io/nickchase/rss-php-nginx
42s 26s 2 {kubelet 10.0.10.7} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "rss-reader" with ErrImagePull: "Tag latest not found in repository docker.io/nickchase/rss-php-nginx"
41s 12s 2 {kubelet 10.0.10.7} spec.containers{rss-reader} Normal BackOff Back-off pulling image "nickchase/rss-php-nginx"
41s 12s 2 {kubelet 10.0.10.7} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "rss-reader" with ImagePullBackOff: "Back-off pulling image \"nickchase/rss-php-nginx\""
創(chuàng)建deployment
(2023.11.18 Sat @KLN)
K8S的deployment應(yīng)用包括:
- workload的持續(xù)可用:deployment指定特定的保持運(yùn)行的workload的拷貝數(shù)量醋闭,一旦某個(gè)workload掛掉窄驹,K8S自動(dòng)重啟該workload,確保高可用
- 擴(kuò)展workloads:K8S使得修改deployment的replicas數(shù)量變得容易
- 管理應(yīng)用狀態(tài):deployment可以暫停证逻、編輯馒吴、回滾(rollback)
- 易于將workload暴露于cluster外部
案例:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rss-site
labels:
app: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
- containerPort: 88
和pod的模版有很多相似,差別之一是kind
指定為Deployment
瑟曲。該文件保存為deployment.yaml
饮戳,創(chuàng)建deployment命令kubectl create -f deployment.yaml
> kubectl create -f deployment.yaml
deployment "rss-site" created
檢測deployment列表,命令kubectl get deployment
> kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
rss-site 2 2 2 1 7s
查看某deployment的詳細(xì)信息洞拨,命令同pod扯罐,kubectl describe deployment rss-site
。
更新某個(gè)deployment烦衣,最簡單的方式是更新創(chuàng)建該deployment的YAML文件歹河,此時(shí)需要使用apply
命令而非create
命令掩浙。
kubectl apply -f deployment.yaml
此時(shí)更新已經(jīng)進(jìn)入YAML文件,再次運(yùn)行kubectl apply
則生效秸歧。
另一種方法是用kubectl edit
命令編輯某個(gè)特定的對象
kubectl edit deployment.v1.apps/rss-site
接著會跳轉(zhuǎn)到一個(gè)編輯器編輯YAML文件厨姚。保存變更時(shí)也將自動(dòng)應(yīng)用于在線對象。
擴(kuò)展deployment的另一個(gè)方法是用scale
kubectl scale deployment.v1.apps/rss-site --replicas=5
甚至可以自動(dòng)擴(kuò)展键菱,比如設(shè)置pod使用不超過60%的CPU
kubectl autoscale deployment.v1.apps/rss-site --min=3 --max=20 --cpu-percent=60
K8S仍然有其他的方式管理擴(kuò)展谬墙。