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


- 如果是業(yè)務(wù)場(chǎng)景,一般首選使用apps/v1(apps/v1從v1.9版本開始提供API)。
- 在k8s v1.16版本之前使用的是extensions/v1beta1,extensions/v1beta1從v1.20版本開始不再提供Ingress資源。
- 帶有beta字樣的代表的是測(cè)試版本,不用在生產(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
#定義資源的名稱,在同一個(gè)namespace空間中必須是唯一的
spec:
#定義deployment資源需要的參數(shù)屬性,諸如是否在容器失敗時(shí)重新啟動(dòng)容器的屬性
replicas: 3
#定義副本數(shù)量
selector:
#定義標(biāo)簽選擇器
matchLabels:
#定義匹配標(biāo)簽
app: nginx
#指定標(biāo)簽為nginx
#需與后面的.spec.template.metadata.labels定義的標(biāo)簽保持一致
template:
#定義業(yè)務(wù)模板,如果有多個(gè)副本,所有副本的屬性會(huì)按照模板的相關(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
#定義一個(gè)容器名,一個(gè)-name:定義一個(gè)容器
image: nginx:1.18
#定義容器使用的鏡像以及版本
ports:
#定義容器對(duì)外的端口
- containerPort: 80
#定義容器內(nèi)部監(jiān)聽的端口號(hào)

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

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

5、創(chuàng)建service服務(wù)對(duì)外提供訪問并測(cè)試
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)建資源對(duì)象
kubectl apply -f nginx-svc-test.yaml #創(chuàng)建資源對(duì)象

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

5.4 訪問測(cè)試
curl 192.168.10.12:30811 curl 192.168.10.13:30811 #驗(yàn)證訪問 #或者在瀏覽器輸入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可以從外部訪問到某個(gè)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)建實(shí)例
7.1 --dry-run:試運(yùn)行
- kubectl run --dry-run打印相應(yīng)的API對(duì)象而不執(zhí)行創(chuàng)建
kubectl run dryrun-test --image=nginx --port=80 --replicas=3 --dry-run #--dry-run不會(huì)實(shí)際創(chuàng)建任何資源,而是會(huì)輸出一個(gè) YAML 或 JSON 格式的資源配置,即并不會(huì)真的創(chuàng)建出pod和deployment實(shí)例,去掉該參數(shù)后即可真正執(zhí)行命令。 -------------------------------------------------------------------------------------------------------- dryrun-test:是創(chuàng)建的 Pod(或更具體地說是 Deployment,因?yàn)槭褂昧?--replicas)的名稱。 --image=nginx:指定了 Pod 中容器的鏡像。 --port=80:通常用于指定容器內(nèi)的端口,但注意這個(gè)參數(shù)在 kubectl run 命令中可能不會(huì)直接設(shè)置容器的端口,而是需要額外的參數(shù)(如 --container-port)來明確指定。不過,在某些版本的 Kubernetes 中,--port 可能被解釋為容器端口。 --replicas=3:表示你想要?jiǎng)?chuàng)建一個(gè) Deployment,而不是單個(gè) Pod,并且該 Deployment 將確保有 3 個(gè) Pod 副本在運(yùn)行。 --dry-run:表示不會(huì)實(shí)際創(chuàng)建資源,而是輸出一個(gè)描述這些資源的 YAML 或 JSON 配置。 -------------------------------------------------------------------------------------------------------- kubectl get pod,deploy #查看資源

7.2 查看生成yaml格式
- 使用–dry-run試運(yùn)行可不觸發(fā)生成命令,然后通過-o yaml可實(shí)現(xiàn)對(duì)其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,因?yàn)樗荍avaScript的一個(gè)子集,可以直接在JavaScript中解釋和編寫,同時(shí)使用簡寫方式聲明JSON,在使用沒有空格的典型變量名時(shí),不需要鍵中的雙引號(hào)。
有很多解析器在YAML和JSON的所有語言中都能很好地工作。
在許多情況下,YAML的空白格式可以更容易查看,因?yàn)楦袷交枰诵曰姆椒ā?/p>
如果您的編輯器中沒有空格可見或縮進(jìn)線指示符,那么YAML的空白雖然更緊湊,更容易查看,但可能難以手動(dòng)編輯。
JSON的序列化和反序列化要快得多,因?yàn)橐獧z查的功能明顯少于YAML,這使得更小更輕的代碼能夠處理JSON。
一個(gè)常見的誤解是YAML需要較少的標(biāo)點(diǎn)符號(hào)并且比JSON更緊湊,但這完全是錯(cuò)誤的??崭袷遣豢梢姷?,所以看起來字符較少,但是如果你計(jì)算實(shí)際的空格是必要的,以便正確解釋YAML以及正確的縮進(jìn),你會(huì)發(fā)現(xiàn)YAML實(shí)際上需要比JSON更多的字符。JSON不使用空格來表示層次結(jié)構(gòu)或分組,并且可以通過刪除不必要的空格來輕松展平,以實(shí)現(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)建實(shí)例
kubectl apply -f nginx.yaml #使用yaml模板創(chuàng)建實(shí)例 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)資源對(duì)象的幫助信息
kubectl explain deployment.spec.template.spec.containers #查看相關(guān)資源對(duì)象的幫助信息 kubectl explain pods.spec.containers #查看相關(guān)資源對(duì)象的幫助信息


10、獲取資源配置清單的總結(jié)
kubectl run dryrun-test --image=nginx --port=80 --dry-run -o yaml > nginx.yaml #沒有相關(guān)資源,使用run命令--dry-run選項(xiàng) 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為動(dòng)態(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容器首次啟動(dòng)時(shí),它會(huì)檢查數(shù)據(jù)庫是否已經(jīng)初始化,并且如果沒有提供密碼相關(guān)的環(huán)境變量,它會(huì)報(bào)錯(cuò)并退出
volumeMounts:
#定義如何掛載卷到容器中
- name: mysql-test
#引用的卷的名稱
mountPath: /var/lib/mysql
#卷在容器中的掛載路徑
volumes:
#定義Pod中使用的卷列表
- name: mysql-test
#卷的名稱,與volumeMounts中的name相對(duì)應(yīng)
emptyDir: {}
#一個(gè)空目錄卷。這種類型的卷在Pod首次被調(diào)度到節(jié)點(diǎn)上時(shí)創(chuàng)建,并在Pod被刪除時(shí)銷毀。它不持久化數(shù)據(jù),僅用于臨時(shí)存儲(chǔ)
---
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、訪問驗(yàn)證
- 登錄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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kubekey安裝Kubernetes-1.24.8的詳細(xì)過程
這篇文章主要介紹了Kubekey安裝Kubernetes-1.24.8的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Rainbond上部署API?Gateway?Kong及環(huán)境配置教程
這篇文章主要為大家介紹了Rainbond上部署API?Gateway?Kong及環(huán)境配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
centos搭建k8s環(huán)境詳細(xì)步驟及常用命令
kubernetes是google開源的容器集群管理系統(tǒng),提供應(yīng)用部署、維護(hù)、擴(kuò)展機(jī)制等功能,利用kubernetes能方便管理跨集群運(yùn)行容器化的應(yīng)用,這篇文章主要給大家介紹了關(guān)于centos搭建k8s環(huán)境詳細(xì)步驟及常用命令的相關(guān)資料,需要的朋友可以參考下2024-01-01
Linux安裝Kubernetes(k8s)超詳細(xì)教程
Kubernetes是一個(gè)輕便的和可擴(kuò)展的開源平臺(tái),用于管理容器化應(yīng)用和服務(wù),通過Kubernetes能夠進(jìn)行應(yīng)用的自動(dòng)化部署和擴(kuò)縮容,這篇文章主要給大家介紹了關(guān)于Linux安裝Kubernetes(k8s)的相關(guān)資料,需要的朋友可以參考下2024-07-07
使用k8tz解決pod內(nèi)的時(shí)區(qū)問題(坑的解決)
時(shí)區(qū)的不一致,會(huì)帶來很多困擾。即使代碼與時(shí)區(qū)無關(guān),但容器日志與系統(tǒng)日志時(shí)間相關(guān)聯(lián)排查問題也會(huì)讓人頭疼,這篇文章主要介紹了使用k8tz優(yōu)雅的解決pod內(nèi)的時(shí)區(qū)問題,需要的朋友可以參考下2022-10-10

