k8s有五種工作負載資源控制器:
1. Pod:自主式Pod,不受控制器控制,失敗了,不會被自動修復。
2. ReplicaSet:支持擴縮容、自動恢復達到期望的副本數、標籤選擇器。幫用戶管理無狀態的服務。
3. Deployment:工作在ReplicaSet之上,還支持滾動更新、聲明式定義(動態修改配置),pod數量可以大於node數量,無狀態,關注羣體穩定。
4. StatefulSet:有狀態pod,關注個體穩定。
5. DaemonSet:用於確保集羣中的每一個節點(或者只在部分節點)只運行一個pod,如系統級的後臺用戶,logstash等。
6. Job:執行完任務就退出,不需要一直運行;如果任務沒有完成就crash還是會恢復,直到任務完成。
服務發現及服務均衡資源: Service, Ingress
配置與存儲: Volume, CSI, configMap(配置), Secret(存儲敏感信息)
大部分資源配置清單都由五個關鍵字組成
apiVersion : 表示屬於哪一個羣組及其版本,如果沒有指定羣組(apiVersion: v1)怎表面是core羣組(基本組件羣組)
kubectl api-versions這個命令可以顯示出當前支持的apiVersioin示例
kind: 資源類別,用來標記你打算創建一個怎麼樣的資源,Pod, ReplicaSet, Deployment..Service, Ingress...
metadata: 元數據
name:
namespace:
labels: 每一個資源的標籤
annotations: 資源註解
uid: 唯一標誌
每個資源的引用路徑: /api/GROUP/VERSION/namespace/NAMESPACE/TYPE/NAME, 可以用curl去獲取
spec: 用戶預期達到的目標狀態描述
status:當前狀態,此狀態會無限與spec靠近, 此字段k8s維護,用戶只能讀取,不能修改。
以上每一個關鍵字都可以通過 kubectl explain xx來獲取詳細信息,如 kubectl explain pod
當我想知道pod的metadata怎麼定義時,可以 kubectl explain pod.metada , 想知道spec下面的container怎麼定義時: kubectl explain pod.spec.containers
第一個yaml資源配置清單
vim first-demo.yaml
apiVersion: v1
kind: Pod #Pod類型
metadata:
name: pod-demo
namespace: default
labels: #這個通過kubectl explain pods.metadata.labels得知它是<map[string]string>類型的,則需要寫成如下,也可以寫成
#{app:myapp, tier: frontend}
app: myapp
tier: frontend
spec: #kubectl explain pods.spec輸出中可以看到 containers 後面有一個containers <[]Object> -required- 說明containers是必
#須 有的, <[]Object> 說明它是一個列表的則需要以如下方式定義,- 開頭
containers: ## kubectl explain pods.spec.containers可以
- name: myapp
image: ikubernetes/myapp:v1
- name: busybox
image: busybox:latest
command: #["/bin/sh", "-c", "sleep 3600"], 因爲 command <[]string>又是列表類型的,所以它有兩種定義方式
- "/bin/sh"
- "-c"
- "echo ${date} >> /usr/share/nginx/html/index.html; sleep 5"
寫好,保存退出。
[root@master manifests]# pwd
/root/manifests
[root@master manifests]# ls
pod-demo.yaml
然後:
[root@master manifests]# kubectl create -f pod-demo.yaml #根據資源配置清單生成pod
pod/pod-demo created
[root@master manifests]# kubectl get pods #查看pod狀態
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 0 19s
[root@master manifests]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-demo 1/2 Running 1 32s
[root@master manifests]#
查看生成後的pod描述:詳細顯示了pod的信息, describe pods,這裏先指定pods類型,再指定名稱
[root@master manifests]# kubectl describe pods pod-demo
。。。
使用 kubectl logs pod-demo myapp,可查看pod內部容器日誌
kubectl delete pods pod-demo 可以刪除pod, 也可以通過yaml文件刪除: kubectl delete -f pod-demo.yaml
kubectl get pods -w 可以監控pod狀態
kubectl exec -it pod-demo -c myapp -- /bin/sh 可以進入到容器裏面
注意: 同一個pod中運行多個container時,它們的文件系統也是隔離的,除非我們讓它們掛載到同一個數據卷中。
標籤:
許多資源支持內嵌字段定義其使用的標籤選擇器:
matchLabels: 直接給定鍵值
matchExpressions: 基於給定的表達式來定義使用標籤選擇器,{key:"KEY", operator:"OPERATOR",values:[V1, V2...]}
操作符:In,NotIn: values字段的值必須爲非空列表;
Exists, NotExists: values字段的值必須爲空列表
nodeSelector <map[string]string>
節點標籤選擇器
nodeName <string>
annotations: 與label不同的地方在於, 它不能用於挑選資源對象,僅用於爲對象提供“元數據”。