網站首頁 編程語言 正文
寫在前面
在前?的課程中,我們在安裝 kubernetes 集群的時候使?了?些 YAML ?件來創建相關的資源,但大家對 YAML ?件還是?常陌?。所以我們先來簡單看?看 YAML ?件是如何?作的,并使? YAML ?件來定義?個 k8s pod,然后再定義?個 k8s deployment吧。
YAML基礎
它的基本語法規則如下:
- ??寫敏感
- 使?縮進表示層級關系
- 縮進時不允許使?Tab鍵,只允許使?空格。
- 縮進的空格數?不重要,只要相同層級的元素左側對?即可
- #表示注釋,從這個字符?直到?尾,都會被解析器忽略。
在我們的 kubernetes 中,你只需要兩種結構類型就?了:
- Lists
- Maps
也就是說,你可能會遇到 Lists 的 Maps 和 Maps 的 Lists,等等。不過不?擔?,你只要掌握了這兩 種結構也就可以了,其他更加復雜的我們暫不討論。
Maps
?先我們來看看 Maps,我們都知道 Map 是字典,就是?個 key:value 的鍵值對,Maps 可以讓我們 更加?便的去書寫配置信息,例如:
--- apiVersion: v1 kind: Pod
第??的 - - - 是分隔符,是可選的,在單??件中,可?連續三個連字號 --- 區分多個?件。這?我 們可以看到,我們有兩個鍵: kind 和 apiVersion ,他們對應的值分別是:v1 和Pod。上?的 YAML ?件轉換成 JSON 格式的話,你肯定就容易明?了:
{ "apiVersion": "v1", "kind": "pod" }
我們在創建?個相對復雜?點的 YAML ?件,創建?個 KEY 對應的值不是字符串?是?個 Maps:
--- apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web
上?的 YAML ?件,metadata 這個 KEY 對應的值就是?個 Maps 了,?且嵌套的 labels 這個 KEY 的值?是?個 Map,你可以根據你??的情況進?多層嵌套。
上?我們也提到了 YAML ?件的語法規則,YAML 處理器是根據?縮進來知道內容之間的嗯關聯性 的。?如我們上?的 YAML ?件,我?了兩個空格作為縮進,空格的數量并不重要,但是你得保持? 致,并且?少要求?個空格(什么意思?就是你別?會縮進兩個空格,?會縮進4個空格)。
我們可以看到 name 和 labels 是相同級別的縮進,所以 YAML 處理器就知道了他們屬于同?個 MAP,? app 是 labels 的值是因為 app 的縮進更?。
注意:在 YAML ?件中絕對不要使? tab 鍵。
同樣的,我們可以將上?的 YAML ?件轉換成 JSON ?件:
{ "apiVersion": "v1", "kind": "Pod", "metadata": { "name": "kube100-site", "labels": { "app": "web" } } }
或許你對上?的 JSON ?件更熟悉,但是你不得不承認 YAML ?件的語義化程度更?吧?
Lists
Lists 就是列表,說?了就是數組,在 YAML ?件中我們可以這樣定義:
args - Cat - Dog - Fish
你可以有任何數量的項在列表中,每個項的定義以破折號(-)開頭的,與?元素直接可以縮進?個空 格。對應的 JSON 格式如下:
{ "args": [ 'Cat', 'Dog', 'Fish' ] }
當然,list 的?項也可以是 Maps,Maps 的?項也可以是list如下所示:
--- apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web spec: containers: - name: front-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: - containerPort: 5000
?如這個 YAML ?件,我們定義了?個叫 containers 的 List 對象,每個?項都由 name、image、 ports 組成,每個 ports 都有?個 key 為 containerPort 的 Map 組成,同樣的,我們可以轉成如下 JSON 格式?件:
{ "apiVersion": "v1", "kind": "Pod", "metadata": { "name": "kube100-site", "labels": { "app": web" } }, "spec": { "containers": [{ "name": "front-end", "image": "nginx", "ports": [{ "containerPort": "80" }] }, { "name": "flaskapp-demo", "image": "jcdemo/flaskapp", "ports": [{ "containerPort": "5000" }] }] } }
是不是覺得? JSON 格式的話?件明顯? YAML ?件更復雜了呢?
使? YAML 創建 Pod
現在我們已經對 YAML ?件有了?概的了解了,我相信你應該沒有之前那么懵逼了吧?我們還是來使? YAML ?件來創建?個 Deployment 吧。
API 說明:https://kubernetes.io/docs/reference/generated/kubernetes?api/v1.10/\color{#00C5CD}{https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/ }https://kubernetes.io/docs/reference/generated/kubernetes?api/v1.10/
創建 Pod
--- apiVersion: v1 kind: Pod metadata: name: kube100-site labels: app: web spec: containers: - name: front-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: - containerPort: 5000
這是我們上?定義的?個普通的 POD ?件,我們先來簡單分析下?件內容:
- apiVersion,這?它的值是 v1,這個版本號需要根據我們安裝的 kubernetes 版本和資源類型進? 變化的,記住不是寫死的
- kind,這?我們創建的是?個 Pod,當然根據你的實際情況,這?資源類型可以是 Deployment、 Job、Ingress、Service 等待。
- metadata:包含了我們定義的 Pod 的?些 meta 信息,?如名稱、namespace、標簽等等信息。
- spec:包括?些 containers,storage,volumes,或者其他 Kubernetes 需要知道的參數,以及諸 如是否在容器失敗時重新啟動容器的屬性。你可以在特定 Kubernetes API 找到完整的 Kubernetes Pod 的屬性。
讓我們來看?個典型的容器的定義:
…spec: containers: - name: front-end image: nginx ports: - containerPort: 80 …
在這個例?中,這是?個簡單的最?定義:?個名字(front-end),基于 nginx 的鏡像,以及容器將會監聽的?個端?(80)。在這些當中,只有名字是?常需要的,你也可以指定?個更加復雜的屬性,例如在容器啟動時運?的命令,應使?的參數,?作?錄,或每次實例化時是否拉取映像的新副本。以下是?些容器可選的設置屬性:
name
- image
- command
- args
- workingDir
- ports
- env
- resources
- volumeMounts
- livenessProbe
- readinessProbe
- livecycle
- terminationMessagePath
- imagePullPolicy
- securityContext
- stdin
- stdinOnce
- tty
明?了 POD 的定義后,我們將上?創建 POD 的 YAML ?件保存成 pod.yaml,然后使? kubectl 創建 POD:
$ kubectl create -f pod.yaml
pod "kube100-site" created
然后我們就可以使?我們前??較熟悉的 kubectl 命令來查看 POD 的狀態了:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube100-site 2/2 Running 0 1m
到這?我們的 POD 就創建成功了,如果你在創建過程中有任何問題,我們同樣可以使?前?的 kubectl describe 進?排查。我們先刪除上?創建的POD:
$ kubectl delete -f pod.yaml
pod "kube100-site" deleted
創建 Deployment
現在我們可以來創建?個真正的 Deployment。在上?的例?中,我們只是單純的創建了?個 POD 實 例,但是如果這個 POD 出現了故障的話,我們的服務也就掛掉了,所以 k8s 提供了? 個 Deployment 的概念,可以讓 kubernetes 去管理?組 POD 的副本,也就是副本集,這樣就可以保 證?定數量的副本?直可?的,不會因為?個 POD 掛掉導致整個服務掛掉。我們可以這樣定義?個 Deployment:
--- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kube100-site spec: replicas: 2
注意這? apiVersion 對應的值是 extensions/v1beta1 ,當然 kind 要指定為 Deployment,因為這 就是我們需要的,然后我們可以指定?些 meta 信息,?如名字,或者標簽之類的。最后,最重要的 是 spec 配置選項,這?我們定義需要兩個副本,當然還有很多可以設置的屬性,?如?個 Pod 在沒 有任何錯誤變成準備的情況下必須達到的最?秒數。 我們可以在Kubernetes v1beta1 API參考中找到 ?個完整的 Depolyment 可指定的參數列表。 現在我們來定義?個完整的 Deployment 的 YAML ?件:
--- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kube100-site spec: replicas: 2 template: metadata: labels: app: web spec: containers: - name: front-end image: nginx ports: - containerPort: 80 - name: flaskapp-demo image: jcdemo/flaskapp ports: - containerPort: 5000
看起來是不是和我們上?的 pod.yaml 很類似啊,注意其中的 template,其實就是對 POD 對象的定義。將上?的 YAML ?件保存為 deployment.yaml,然后創建 Deployment:
$ kubectl create -f deployment.yaml
deployment "kube100-site" created
```同樣的,想要查看它的狀態,我們可以檢查 Deployment的列表:
```go
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kube100-site 2 2 2 2 2m
我們可以看到所有的 Pods 都已經正常運?了。 到這?我們就完成了使? YAML ?件創建 Kubernetes Deployment 的過程,在了解了 YAML ?件的基礎后,定義 YAML ?件其實已經很簡單了,最主要的是要根據實際情況去定義 YAML ?件,所以查閱 Kubernetes ?檔很重要。
可以使?http://www.yamllint.com/去檢驗 YAML ?件的合法性
原文鏈接:https://juejin.cn/post/7143516384876560391
相關推薦
- 2023-02-17 pytorch/transformers?最后一層不加激活函數的原因分析_python
- 2022-07-14 python輸出小數精度控制的方法_python
- 2022-06-25 React服務端渲染和同構的實現_React
- 2022-03-23 c++特殊構造函數詳解_C 語言
- 2022-12-09 python進階collections標準庫使用示例詳解_python
- 2022-09-21 使用Python遍歷文件夾實現查找指定文件夾_python
- 2024-03-25 使用HttpURLConnection發送POST請求并攜帶請求參數
- 2021-12-06 Go語言實現一個簡單生產者消費者模型_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支