k8s之yaml文件的使用及說明
一、關(guān)于yaml文件
1、k8s支持的文件格式
- Kubernetes支持YAML和JSON格式管理資源對象
- JSON格式:主要用于api接口之間消息的傳遞
- YAML格式:用于配置和管理,YAML是一種簡潔的非標(biāo)記性語言,內(nèi)容格式人性化,較易讀
2、YAML語言格式
- 大小寫敏感
- 使用縮進(jìn)表示層級關(guān)系
- 不支持Tab鍵制表符縮進(jìn),只使用空格縮進(jìn)
- 縮進(jìn)的空格數(shù)目不重要,只要相同層級的元素左側(cè)對齊即可,通常開頭縮進(jìn)兩個空格
- 符號字符后縮進(jìn)一個空格,如冒號,逗號,短橫杠(-)等
- “—”表示YAML格式,一個文件的開始,用于分隔文件
- “#”表示注釋
3、查看api資源版本標(biāo)簽
kubectl api-versions #查看api資源版本標(biāo)簽


- 如果是業(yè)務(wù)場景,一般首選使用apps/v1(apps/v1從v1.9版本開始提供API)。
- 在k8s v1.16版本之前使用的是extensions/v1beta1,extensions/v1beta1從v1.20版本開始不再提供Ingress資源。
- 帶有beta字樣的代表的是測試版本,不用在生產(chǎn)環(huán)境中。
4、編寫nginx-test.yaml資源配置清單
4.1 編寫資源配置清單
mkdir /opt/test
#新建目錄
cd !$
cd /opt/test
#切換到新建目錄
vim nginx-test.yaml
apiVersion: apps/v1
#指定api版本標(biāo)簽
kind: Deployment
#定義資源的類型/角色,deployment為副本控制器
#此處資源類型可以是Deployment、Job、Ingress、Service等
metadata:
#定義資源的元數(shù)據(jù)信息,比如資源的名稱、namespace、標(biāo)簽等信息
name: nginx-test
#定義資源名稱
namespace: luck
#定義deployment所在的命名空間
labels:
#定義標(biāo)簽
app: nginx
#定義資源的名稱,在同一個namespace空間中必須是唯一的
spec:
#定義deployment資源需要的參數(shù)屬性,諸如是否在容器失敗時重新啟動容器的屬性
replicas: 3
#定義副本數(shù)量
selector:
#定義標(biāo)簽選擇器
matchLabels:
#定義匹配標(biāo)簽
app: nginx
#指定標(biāo)簽為nginx
#需與后面的.spec.template.metadata.labels定義的標(biāo)簽保持一致
template:
#定義業(yè)務(wù)模板,如果有多個副本,所有副本的屬性會按照模板的相關(guān)配置進(jìn)行匹配
metadata:
#pod的元數(shù)據(jù)
labels:
#定義pod標(biāo)簽
app: nginx
#定義Pod副本將使用的標(biāo)簽,需與前面的.spec.selector.matchLabels定義的標(biāo)簽保持一致
spec:
#定義pod的規(guī)格
containers:
#定義容器屬性
- name: nginx
#定義一個容器名,一個-name:定義一個容器
image: nginx:1.18
#定義容器使用的鏡像以及版本
ports:
#定義容器對外的端口
- containerPort: 80
#定義容器內(nèi)部監(jiān)聽的端口號

4.2 創(chuàng)建資源對象
kubectl apply -f nginx-test.yaml #創(chuàng)建資源對象

4.3 查看創(chuàng)建的pod資源
kubectl get pods -owide #查看創(chuàng)建的pod資源

5、創(chuàng)建service服務(wù)對外提供訪問并測試
5.1 編寫nginx-svc-test.yaml
#編輯yaml文件
vim nginx-svc-test.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: luck
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
#此處定義的selector要與deployment所定義的selector相同
#service依靠標(biāo)簽選擇器來檢索提供服務(wù)的nodes

5.2 創(chuàng)建資源對象
kubectl apply -f nginx-svc-test.yaml #創(chuàng)建資源對象

5.3 查看創(chuàng)建的service
kubectl get pod,svc -n luck #查看創(chuàng)建的service資源

5.4 訪問測試
curl 192.168.10.12:30811 curl 192.168.10.13:30811 #驗證訪問 #或者在瀏覽器輸入nodeIP:nodePort即可訪問


6、詳解k8s中的port

| 相關(guān)port | 說明 |
|---|---|
| port | port是k8s集群內(nèi)部訪問service的端口,即通過clusterIP:port可以從Pod所在的Node上訪問到service |
| nodePort | nodePort是外部訪問k8s集群中service的端口,通過nodeIP:nodePort可以從外部訪問到某個service |
| targetPort | targetPort是Pod的端口,從port或nodePort來的流量經(jīng)過kube-proxy反向代理負(fù)載均衡轉(zhuǎn)發(fā)到后端Pod的targetPort上,最后進(jìn)入容器。 |
| containerPort | containerPort是Pod內(nèi)部容器的端口,targetPort映射到containerPort。 |
7、試運(yùn)行生成yaml模板后創(chuàng)建實例
7.1 --dry-run:試運(yùn)行
- kubectl run --dry-run打印相應(yīng)的API對象而不執(zhí)行創(chuàng)建
kubectl run dryrun-test --image=nginx --port=80 --replicas=3 --dry-run #--dry-run不會實際創(chuàng)建任何資源,而是會輸出一個 YAML 或 JSON 格式的資源配置,即并不會真的創(chuàng)建出pod和deployment實例,去掉該參數(shù)后即可真正執(zhí)行命令。 -------------------------------------------------------------------------------------------------------- dryrun-test:是創(chuàng)建的 Pod(或更具體地說是 Deployment,因為使用了 --replicas)的名稱。 --image=nginx:指定了 Pod 中容器的鏡像。 --port=80:通常用于指定容器內(nèi)的端口,但注意這個參數(shù)在 kubectl run 命令中可能不會直接設(shè)置容器的端口,而是需要額外的參數(shù)(如 --container-port)來明確指定。不過,在某些版本的 Kubernetes 中,--port 可能被解釋為容器端口。 --replicas=3:表示你想要創(chuàng)建一個 Deployment,而不是單個 Pod,并且該 Deployment 將確保有 3 個 Pod 副本在運(yùn)行。 --dry-run:表示不會實際創(chuàng)建資源,而是輸出一個描述這些資源的 YAML 或 JSON 配置。 -------------------------------------------------------------------------------------------------------- kubectl get pod,deploy #查看資源

7.2 查看生成yaml格式
- 使用–dry-run試運(yùn)行可不觸發(fā)生成命令,然后通過-o yaml可實現(xiàn)對其yaml資源配置清單的查看
kubectl run dryrun-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml #查看生成的yaml資源配置清單

7.3 查看生成json格式
- 同理,可通過-o json查看該命令產(chǎn)生的json配置清單
kubectl run dryrun-test --image=nginx --port=80 --replicas=3 --dry-run -o json #查看生成的json資源配置清單

7.4 yaml和json的主要區(qū)別
YAML使用空格縮進(jìn),這是Python開發(fā)人員熟悉的領(lǐng)域。
JavaScript開發(fā)人員喜歡JSON,因為它是JavaScript的一個子集,可以直接在JavaScript中解釋和編寫,同時使用簡寫方式聲明JSON,在使用沒有空格的典型變量名時,不需要鍵中的雙引號。
有很多解析器在YAML和JSON的所有語言中都能很好地工作。
在許多情況下,YAML的空白格式可以更容易查看,因為格式化需要更人性化的方法。
如果您的編輯器中沒有空格可見或縮進(jìn)線指示符,那么YAML的空白雖然更緊湊,更容易查看,但可能難以手動編輯。
JSON的序列化和反序列化要快得多,因為要檢查的功能明顯少于YAML,這使得更小更輕的代碼能夠處理JSON。
一個常見的誤解是YAML需要較少的標(biāo)點符號并且比JSON更緊湊,但這完全是錯誤的??崭袷遣豢梢姷?,所以看起來字符較少,但是如果你計算實際的空格是必要的,以便正確解釋YAML以及正確的縮進(jìn),你會發(fā)現(xiàn)YAML實際上需要比JSON更多的字符。JSON不使用空格來表示層次結(jié)構(gòu)或分組,并且可以通過刪除不必要的空格來輕松展平,以實現(xiàn)更緊湊的傳輸。
7.5 使用yaml格式導(dǎo)出生成模板
kubectl run dryrun-test --image=nginx --port=80 --dry-run -o yaml > nginx.yaml #使用yaml格式導(dǎo)出生成模板

7.6 刪除一些不必要的參數(shù)
#編輯yaml配置文件
vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
#刪除上面一行
labels:
run: dryrun-test
name: dryrun-test
spec:
containers:
- image: nginx
name: dryrun-test
ports:
- containerPort: 80
resources: {}
#刪除上面一行
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
#刪除上面一行


7.7 使用yaml模板創(chuàng)建實例
kubectl apply -f nginx.yaml #使用yaml模板創(chuàng)建實例 kubectl get pod,deploy #顯示pod資源信息

8、將現(xiàn)有資源生成yaml模板導(dǎo)出并保存為文件
8.1 將現(xiàn)有的資源生成模板導(dǎo)出
kubectl get svc #顯示svc信息 kubectl get svc nginx-svc -o yaml #將現(xiàn)有的資源生成模板導(dǎo)出


8.2 保存到文件中
kubectl get svc nginx-svc -o yaml > my-svc.yaml #輸出到my-svc.yaml文件中

9、explain:查看字段幫助信息
- 可一層層的查看相關(guān)資源對象的幫助信息
kubectl explain deployment.spec.template.spec.containers #查看相關(guān)資源對象的幫助信息 kubectl explain pods.spec.containers #查看相關(guān)資源對象的幫助信息


10、獲取資源配置清單的總結(jié)
kubectl run dryrun-test --image=nginx --port=80 --dry-run -o yaml > nginx.yaml #沒有相關(guān)資源,使用run命令--dry-run選項 kubectl get svc nginx-svc -o yaml > my-svc.yaml #已有相關(guān)資源,使用get命令導(dǎo)出
二、編寫MySQL的yaml文件
1、編寫文件
vim mysql.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mysql-server
---
apiVersion: apps/v1
kind: Deployment
#mysql為動態(tài)服務(wù)器,其pod控制器應(yīng)當(dāng)設(shè)置為StatefulSet,為便于理解基礎(chǔ),先設(shè)置為Deployment
metadata:
labels:
apps: mysql
name: mysql-db
namespace: mysql-server
spec:
replicas: 1
selector:
matchLabels:
apps: mysql
template:
metadata:
labels:
apps: mysql
spec:
containers:
- name: mysql
image: mysql:latest
#使用MySQL的官方鏡像
ports:
- containerPort: 3306
env:
#定義環(huán)境變量列表
- name: MYSQL_ROOT_PASSWORD
#環(huán)境變量的名稱
value: password
#設(shè)置MySQL的root密碼,也就是環(huán)境變量的值
#當(dāng)MySQL容器首次啟動時,它會檢查數(shù)據(jù)庫是否已經(jīng)初始化,并且如果沒有提供密碼相關(guān)的環(huán)境變量,它會報錯并退出
volumeMounts:
#定義如何掛載卷到容器中
- name: mysql-test
#引用的卷的名稱
mountPath: /var/lib/mysql
#卷在容器中的掛載路徑
volumes:
#定義Pod中使用的卷列表
- name: mysql-test
#卷的名稱,與volumeMounts中的name相對應(yīng)
emptyDir: {}
#一個空目錄卷。這種類型的卷在Pod首次被調(diào)度到節(jié)點上時創(chuàng)建,并在Pod被刪除時銷毀。它不持久化數(shù)據(jù),僅用于臨時存儲
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
namespace: mysql-server
labels:
apps: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
selector:
apps: mysql


2、生成資源
kubectl apply -f mysql.yaml #指定yaml配置文件 kubectl get pod,svc -n mysql-server -owide #查看詳細(xì)信息

3、訪問驗證
- 登錄mysql容器
kubectl exec -it mysql-db-557b9b7f5b-vjsnm -n mysql-server bash
#進(jìn)入mysql容器
root@mysql-db-557b9b7f5b-vjsnm:/# mysql -u root -p'password'
#登錄mysql服務(wù)
mysql> show databases;
#查看數(shù)據(jù)庫信息

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
K8s學(xué)習(xí)之Pod的定義及詳細(xì)資源調(diào)用案例
Kubernetes將所有內(nèi)容抽象為資源,通過操作資源管理集群,核心單元是Pod,通過控制器管理Pod,資源管理分為命令式對象管理、命令式對象配置和聲明式對象配置,各有適用場景,需要的朋友可以參考下2024-09-09
k8s跨服務(wù)調(diào)用入門到實戰(zhàn)示例詳解
這篇文章主要為大家介紹了k8s跨服務(wù)調(diào)用入門到實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Kubernetes k8s configmap 容器技術(shù)解析
這篇文章主要為大家介紹了k8s configmap 容器技術(shù)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
k8s創(chuàng)建啟動、刪除pod的實現(xiàn)過程
Kubernetes中Pod是管理容器的最小單元,包括創(chuàng)建、管理和刪除過程,Pod狀態(tài)包括Pending、Running、Succeeded、Failed和Unknown2026-01-01

