摘要:雲是由不少小水滴組成的,把每個計算機想象成小水滴,聯合起來就造成了雲。通常水滴先出現,而後出現管理水滴的平臺(如OpenStack,Kubernetes)。
1.雲是由不少小水滴組成的,把每個計算機想象成小水滴,聯合起來就造成了雲;傳統的水滴就是VM;Docker的出現,改變了小水滴的粒度node
2.水滴獨立可運行,內部完整 (如 VM,Docker容器)json
3.通常水滴先出現,而後出現管理水滴的平臺(如OpenStack,Kubernetes)api
1.Kubernetes是一個開源的,用於管理雲平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單而且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制app
2.Kubernetes一個核心的特色就是可以自主的管理容器來保證雲平臺中的容器按照用戶的指望狀態運行着(好比用戶想讓dlcatalog一直運行,用戶不須要關心怎麼去作,Kubernetes會自動去監控,而後去重啓,新建,總之,讓dlcatalog一直提供服務)dom
3.在Kubenetes中,全部的容器均在Pod中運行,一個Pod能夠承載一個或者多個相關的容器函數
在Kubernetes中,最小的管理元素不是一個個獨立的容器,而是Pod;一個Pod是一個容器環境下的「邏輯主機」,一個Pod是由多個相關的而且共享磁盤的容器組成;在同一個Pod裏,容器之間的端口不能重複,不然Pod會起不來,或者起來後無限重啓ui
Node是Pod真正運行的主機,能夠是物理機,也能夠是虛擬機;爲了管理Pod,每一個Node節點上至少要運行container runtime(好比Docker)、kubelet和kube-proxy服務;Node本質上不是Kubernetes來建立的,Kubernetes只是管理Node上的資源;雖然能夠經過manifest建立一個Node對象(以下json所示),但Kubernetes也只是去檢查是否真的是有這麼一個Node,若是檢查失敗,也不會往上調度Pod雲計算
{ "kind": "Node", "apiVersion": "v1", "metadata": { "name": "10.63.90.18", "labels": { "name": "my-first-k8s-node" } } }
Service是一個抽象的概念,是K8s裏面的精華;每一個K8s上的App,均可以申請集羣內部的「名號」,用來表明本身;K8s就會給你的App分配一個Service許可證,許可證上面帶着「假IP」,任何集羣內部只要訪問這個IP,就等於訪問你的Appspa
假設咱們擁有一些Pod,每一個Pod都開放了9083端口,而且都帶有一個標籤app=MyApp;以下這段json代碼會建立一個新的Service對象,名稱爲my-dlcatalog-metastore-service,而且會鏈接目標端口9083;而且帶有標籤app=MyApp的Pod會被分配一個ip地址,這個ip是給kube-proxy使用的,集羣內部只要訪問這個ip,就等於訪問你的App;須要注意的是,K8s裏面的Pod實際ip通常沒什麼用3d
kind: Service, apiVersion: v1, metadata: name: my-dlcatalog-metastore-service spec: selector: app: MyApp ports: - protocol: TCP, port: 20403, targetPort: 9083
ConfigMap用於保存配置數據的鍵值對,能夠用來保存單個屬性,也能夠用來保存配置文件;ConfigMap跟secret很相似,但它能夠更方便地處理不包含敏感信息的字符串;
使用volume將ConfigMap做爲文件或目錄直接掛載
以下表示將建立的ConfigMap直接掛載至Pod的/etc/config目錄下
apiVersion: v1 kind: Pod metadata: name: vol-test-pod spec: containers: - name: test-container image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530 command: [ "/bin/sh", "bin/start_server.sh" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config restartPolicy: Never
指定Node節點調度
有三種方式指定 Pod 只運行在指定的 Node 節點上
方式一:
nodeSelector:只調度到匹配指定label的Node上
方式二:
nodeAffinity:功能更豐富的 Node 選擇器,好比支持集合操做
nodeAffinity 目前支持兩種:requiredDuringSchedulingIgnoredDuringExecution與preferredDuringSchedulingIgnoredDuringExecution,分別表明必須知足條件和優選條件
好比下面的例子表明調度到包含標籤 http://kubernetes.io/e2e-az-name 而且值爲 e2e-az1 或 e2e-az2 的 Node 上,而且優選還帶有標籤 another-node-label-key=another-node-label-value 的 Node
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value containers: - name: with-node-affinity image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530
方式三:
podAffinity:調度到知足條件的 Pod 所在的 Node 上
podAffinity 基於 Pod 的標籤來選擇 Node,僅調度到知足條件 Pod 所在的 Node 上,支持 podAffinity 和 podAntiAffinity
這個功能比較繞,如下面的兩個例子做爲講解:
第一個例子表示:
若是一個 「Node 所在 Zone 中包含至少一個帶有 security=S1 標籤且運行中的 Pod」,那麼能夠調度到該 Node;不調度到 「包含至少一個帶有 security=S2 標籤且運行中 Pod」 的 Node 上
apiVersion: v1 kind: Pod metadata: name: with-pod-affinity spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: failure-domain.beta.kubernetes.io/zone podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S2 topologyKey: kubernetes.io/hostname containers: - name: with-node-affinity image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530
第二個例子表示:
若是一個 「Node 所在 Zone 中包含至少一個帶有 appVersion= jwsdlcatalog-x86_64-1.0.1.20200918144530標籤且運行中的 Pod」,那麼推薦不調度到該 Node;不調度到 「包含至少一個帶有app= jwsdlcatalog-x86_64標籤且運行中 Pod」 的 Node 上
spec: restartPolicy: Always #pod重啓策略 securityContext: runAsUser: 2000 fsGroup: 2000 affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: appVersion operator: In values: - concat: - get_input: IMAGE_NAME - '-' - get_input: IMAGE_VERSION #numOfMatchingPods: "2" #必定不要加此字段,此字段是華爲本身的實現,社區沒有接納 topologyKey: "failure-domain.beta.kubernetes.io/zone" weight: 100 requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - get_input: IMAGE_NAME numOfMatchingPods: "1" topologyKey: "kubernetes.io/hostname" containers: - image: concat: - get_input: IMAGE_ADDR #拼接鏡像的地址(#用拼接函數解決數字型參數問題) - "/" - get_input: IMAGE_NAME #拼接鏡像的地址(#用拼接函數解決數字型參數問題) - ":" - get_input: IMAGE_VERSION #拼接鏡像的地址(#用拼接函數解決數字型參數問題) name: jwsdlcatalog
注:本文純屬我的觀點,部分圖片若有雷同,純屬意外