⒈資源含義
k8s中所有的內容都被抽象為資源,資源實例化之后,叫做對象。
⒉資源分類
名稱空間級別
僅在此名稱空間下生效,k8s的系統組件是默認放在kube-system名稱空間下的,而kubectl get pod等價於kubectl get pod -n default,因此查看不到k8s的系統組件。
1.工作負載型資源(workload):Pod【k8s最小組成部分,共享網絡棧共享存儲卷】、ReplicaSet【RS,調度器、控制器,通過標簽去控制pod的創建、副本數量】、Deployment【控制器,通過控制RS的創建去創建pod】、StatefulSet【為有狀態服務所建立的管理器】、DaemonSet【可以在每一個節點都運行一個pod的組件】、Job【工作、任務】、CronJob【輪詢工作、輪詢任務,為批處理而生的】(ReplicationController在v1.11版本被廢棄)
2.服務發現及負載均衡型資源(ServiceDiscovery LoadBalance):Service【簡稱svc,服務,將服務暴露出去】、Ingress【將服務暴露出去】、...
3.配置與存儲型資源:Volume(存儲卷)【給pod提供持久化的能力】、CSI(容器存儲接口,可以擴展各種各樣的第三方存儲卷)
4.特殊類型的存儲卷:ConfigMap(當配置中心來使用的資源類型)【一般用來存儲配置文件達到熱更新的狀態】、Secret(保存敏感數據)【加密方案存儲數據,一般用來保存密碼文件、密鑰等等】、DownwardAPI(把外部環境中的信息輸出給容器)【類似於CSI,】
集群級別
不管在任何名稱空間下定義,在其他的名稱空間下都能看得到,在定義的時候無需指定名稱空間
例如:Namespace【名稱空間】、Node【節點】、Role【角色】、ClusterRole、RoleBinding、ClusterRoleBinding
元數據級別
提供一個指標,不像是名稱空間類型又不像集群級別,本質上更像是在兩者之間,但是它有自己的特點,所以更應該作為一個單獨的分類,例如HPA【通過cpu的利用率進行平滑擴展】就是一個很明顯的元數據類型,通過指標進行操作。
根據一些指標去進行對應的操作
例如:HPA、PodTemplate【pod模板】、LimitRange【資源限制】
⒊資源清單
k8s一般都是通過定義資源清單的方式去創建資源
資源清單等價於劇本,寫好了每一步應該如何去做
在k8s中,一般使用yaml格式的文件來創建符合我們預期期望的資源,這樣的yaml文件我們一般稱為資源清單
⒋資源清單常用的字段
必須存在的屬性【創建資源清單的時候沒有這些屬性的存在它是不允許被執行的】
參數名稱 | 字段類型 | 說明 |
version | String | 這里是指的是K8SAPI的版本,目前基本上是v1,可以用kubectl api-version命令查詢 |
kind | String | 這里指的是yam文件定義的資源類型和角色,比如:Pod |
metadata | Object | 元數據對象,固定值就寫metadata |
metadata.name | String | 元數據對象的名字,這里由我們編寫,比如命名Pod的名字 |
metadata.namespace | String | 元數據對象的命名空間,由我們自身定義,如果不定義的 話則默認是default名稱空間 |
Spec | Object | 詳細定義對象,固定值就寫Spec |
spec.containers[] | List | 這里是Spec對象的容器列表定義,是個列表 |
spec.containers[].name | String | 這里定義容器的名字 |
spec.containers[].image | String | 這里定義要用到的鏡像名稱 |
主要屬性【這些屬性比較重要,如果不指定的話系統會自動補充默認值】
參數名稱 | 字段類型 | 說明 |
spec.containers[].name | String | 這里定義容器的名字 |
spec.containers[].image | String | 這里定義要用到的鏡像名稱 |
spec.containers[].imagePullPolicy | String | 定義鏡像拉取策略,有Always、Never、 IfNotPresent三個值可選(1)Always:意思是 每次都嘗試重新拉取鏡像(2)Never:表示僅 使用本地鏡像(3)lfNotPresent:如果本地有 鏡像就使用本地鏡像,沒有就拉取在線鏡像。 上面三個值都沒設置的話,默認是Always。 |
spec.containers[].command[] | List | 指定容器啟動命令,因為是數組可以指定多 個,不指定則使用鏡像打包時使用的啟動命令。 |
spec.containers[].args[] | List | 指定容器啟動命令參數,因為是數組可以指定 多個。 |
spec.containers[].workingDir | String | 指定容器的工作目錄,進入容器時默認所在的目錄 |
spec.containers[].volumeMounts[] | List | 指定容器內部的存儲卷配置 |
spec.containers[].volumeMounts[].name | String | 指定可以被容器掛載的存儲卷的名稱 |
spec.containers[].volumeMounts[].mountPath | String | 指定可以被容器掛載的存儲卷的路徑 |
spec.containers[].volumeMounts[].readOnly | String | 設置存儲卷路經的讀寫模式,true或者false, 默認為讀寫模式 |
spec.containers[].ports[] | List | 指定容器需要用到的端口列表 |
spec.containers[].ports[].name | String | 指定端口名稱 |
spec.containers[].ports[].containerPort | String | 指定容器需要監聽的端口號 |
spec.containers[].ports[].hostPort | String | 指定容器所在主機需要監聽的端口號,默認跟 上面containerPort相同,注意設置了hostPort 同一台主機無法啟動該容器的相同副本 (因為主機的端口號不能相同,這樣會沖突) |
spec.containers[].ports[].protocol | String | 指定端口協議,支持TCP和UDP,默認值為 TCP |
spec.containers[].env[] | List | 指定容器運行前需設置的環境變量列表 |
spec.containers[].env[].name | String | 指定環境變量名稱 |
spec.containers[].env[].value | String | 指定環境變量值 |
spec.containers[].resources | Object | 指定資源限制和資源請求的值(這里開始就是 設置容器的資源上限) |
spec.containers[].resources.limits | Object | 指定設置容器運行時資源的運行上限 |
spec.containers[].resources.limits.cpu | String | 指定CPU的限制,單位為core數,將用於 docker run --cpu-shares參數 這里前面文章 Pod資源限制有講過) |
spec.containers[].resources.limits.memory | String | 指定MEM內存的限制,單位為MlB、GiB |
spec.containers[].resources.requests | Object | 指定容器啟動和調度時的限制設置 |
spec.containers[].resources.requests.cpu | String | CPU請求,單位為core數,容器啟動時初始化可用數量 |
spec.containers[].resources.requests.memory | String | 內存請求,單位為MIB、GiB,容器啟動的初始化可用數量 |
額外的參數項
參數名稱 | 字段類型 | 說明 |
spec.restartPolicy | String | 定義Pod的重啟策略,可選值為Always、OnFailure,默認值為 Always。1.Always:Pod一旦終止運行,則無論容器是如何終 止的,kubelet服務都將重啟它。2.OnFailure:只有Pod以 非零退出碼終止時,kubelet才會重啟該容器。如果容器正常 結束(退出碼為0),則kubelet將不會重啟它。3.Never: Pod終止后,kubelet將退出碼報告給Master,不會重啟該Pod。 |
spec.nodeSelector | Object | 定義Node的Label過濾標簽,以key:value格式指定,選擇node節點 去運行 |
spec.imagePullSecrets | Object | 定義pull鏡像時使用secret名稱,以name:secretkey格式指定 |
spec.hostNetwork | Boolean | 定義是否使用主機網絡模式,默認值為false。設置true表示使用 宿主機網絡,不使用docker網橋,同時設置了true將無法在同 一台宿主機上啟動第二個副本。 |
查看資源有那些資源清單屬性,使用以下命令
kubectl explain pod
查看屬性說明,使用以下命令
kubectl explain pod.apiVersion
⒌資源清單格式
apiVersion: group/apiversion #如果沒有給定group名稱,那么默認為core,可以使用kubectlapi-versions命令獲取當前k8s版本上所有的apiversion版本信息(每個版本可能不同)kind: #資源類別
metadata: #資源元數據
name:
namespace:
lables:
annotations: #主要目的是方便用戶閱讀查找
spec: #期望的狀態(disired state)
status: #當前狀態,本字段由Kubernetes自身維護,用戶不能去定義
⒍資源清單的常用命令
1.獲取apiVersion版本信息
kubectl api-versions
2.獲取資源的apiVersion的版本信息(以pod為例),該命令同時輸出屬性設置幫助文檔
kubectl explain pod
*字段配置格式
apiVersion <string> #表示字符串類型 metadata <Object> #表示需要嵌套多層字段 1abels <map[string]string> #表示由k:v組成的映射 finalizers <[]string> #表示字串列表 ownerReferences <[]Object>#表示對象列表 hostPID <boolean> #布爾類型 priority <integer> #整型 name <string> -required- #如果類型后面接-required-,表示為必填字段
⒎示例:通過定義清單文件創建Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
1abels:
app:myapp
spec:
containers:
- name: myapp-1
image: hub.coreqi.cn/1ibrary/myapp:v1
- name: busybox-1
image: busybox:latest
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
通過yaml文件創建pod
kubectl create -f xxx.yaml
獲取資源的資源配置文件
#使用 -o 參數 加 yaml,可以將資源的配置以yaml的格式輸出出來,也可以使用json,輸出為json格式
kubectl get pod {podName} -o yaml