(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格式簡(jiǎn)單易學(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,對(duì)應(yīng)的key是apiVersion和kind。
該案例相當(dāng)于如下的JSON文件
{
"apiVersion": "v1",
"kind": "Pod"
}
需要注意的是,在YAML格式中,引號(hào)"可以省略。
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是同一級(jí)key,所以前面都是兩個(gè)空格,而api是labels的nested key,所以空四格。
注意,不要在YAML文件中使用Tab鍵空格。
上面案例對(duì)應(yīng)的JSON文件如下
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "rss-site",
"labels": {
"app": "web"
}
}
}
YAML Lists
一個(gè)包含多個(gè)元素的數(shù)據(jù)結(jié)構(gòu)。每個(gè)元素前面空格,由-開始,在該符號(hào)之后在空一格。一個(gè)-符號(hào)對(duì)應(yīng)了一個(gè)元素。
案例如
args:
- sleep
- "1000"
- message
- "Bring back Firefly!"
該list對(duì)應(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
該案例對(duì)應(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中的識(shí)別標(biāo)簽label。
spec參數(shù)用來指定該pod的實(shí)體。spec的屬性包括容器,內(nèi)存需求,存儲(chǔ)容量,網(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命令會(huì)看到變?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
檢測(cè)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,最簡(jiǎn)單的方式是更新創(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è)特定的對(duì)象
kubectl edit deployment.v1.apps/rss-site
接著會(huì)跳轉(zhuǎn)到一個(gè)編輯器編輯YAML文件。保存變更時(shí)也將自動(dòng)應(yīng)用于在線對(duì)象。
擴(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ò)展。