文章參考:https://www.kubernetes.org.cn
簡介
Kubernetes是一個開源的,用於管理雲平台中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規划,更新,維護的一種機制。
Kubernetes一個核心的特點就是能夠自主的管理容器來保證雲平台中的容器按照用戶的期望狀態運行着(比如用戶想讓apache一直運行,用戶不需要關心怎么去做,Kubernetes會自動去監控,然后去重啟,新建,總之,讓apache一直提供服務),管理員可以加載一個微型服務,讓規划器來找到合適的位置,同時,Kubernetes也系統提升工具以及人性化方面,讓用戶能夠方便的部署自己的應用(就像canary deployments)。
節點node
- master > 負責調度
- worker > 負責項目運行
Kubernetes節點有運行應用容器必備的服務,而這些都是受Master的控制。
每次個節點上當然都要運行Docker。Docker來負責所有具體的映像下載和容器運行。
Kubernetes主要由以下幾個核心組件組成:
- etcd保存了整個集群的狀態;
- apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API注冊和發現等機制;
- controller manager負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
- scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
- kubelet負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;
- Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);
- kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;
除了核心組件,還有一些推薦的Add-ons:
- kube-dns負責為整個集群提供DNS服務
- Ingress Controller為服務提供外網入口
- Heapster提供資源監控
- Dashboard提供GUI
- Federation提供跨可用區的集群
- Fluentd-elasticsearch提供集群日志采集、存儲與查詢
術語解釋
- pods
在Kubernetes中,最小的管理元素不是一個個獨立的容器,而是Pod,Pod是最小的,管理,創建,計划的最小單元.一個Pod(就像一群鯨魚,或者一個豌豆夾)相當於一個共享context的配置組,在同一個context下,應用可能還會有獨立的cgroup隔離機制,一個Pod是一個容器環境下的“邏輯主機”,它可能包含一個或者多個緊密相連的應用,這些應用可能是在同一個物理主機或虛擬機上。
- 同一個Pod中的應用可以共享磁盤
- 由於docker的架構,一個Pod是由多個相關的並且共享磁盤的容器組成
- Labels
標簽其實就一對 key/value ,被關聯到對象上,比如Pod,標簽的使用我們傾向於能夠標示對象的特殊特點,並且對用戶而言是有意義的(就是一眼就看出了這個Pod是尼瑪數據庫),但是標簽對內核系統是沒有直接意義的。標簽可以用來划分特定組的對象(比如,所有女的),標簽可以在創建一個對象的時候直接給與,也可以在后期隨時修改,每一個對象可以擁有多個標簽,但是,key值必須是唯一的
- Namespace
Namespace是對一組資源和對象的抽象集合,比如可以用來將系統內部的對象划分為不同的項目組或用戶組。常見的pods, services, replication controllers和deployments等都是屬於某一個namespace的(默認是default),而node, persistentVolumes等則不屬於任何namespace
- Replication Controller
Replication Controller 保證了在所有時間內,都有特定數量的Pod副本正在運行,如果太多了,Replication Controller就殺死幾個,如果太少了,Replication Controller會新建幾個,和直接創建的pod不同的是,Replication Controller會替換掉那些刪除的或者被終止的pod,不管刪除的原因是什么(維護阿,更新啊,Replication Controller都不關心)。基於這個理由,我們建議即使是只創建一個pod,我們也要使用Replication Controller。Replication Controller 就像一個進程管理器,監管着不同node上的多個pod,而不是單單監控一個node上的pod,Replication Controller 會委派本地容器來啟動一些節點上服務(Kubelet ,Docker)。
- Node
Node是Pod真正運行的主機,可以物理機,也可以是虛擬機。為了管理Pod,每個Node節點上至少要運行container runtime(比如docker或者rkt)、kubelet和kube-proxy服務。
每個Node都包括以下狀態信息
- 地址:包括hostname、外網IP和內網IP
- 條件(Condition):包括OutOfDisk、Ready、Me* moryPressure和DiskPressure
- 容量(Capacity):Node上的可用資源,包括CPU、內存和Pod總數
- 基本信息(Info):包括內核版本、容器引擎版本、OS類型等
- ReplicaSets
ReplicaSet是下一代復本控制器。ReplicaSet和 Replication Controller之間的唯一區別是現在的選擇器支持。Replication Controller只支持基於等式的selector(env=dev或environment!=qa),但ReplicaSet還支持新的,基於集合的selector(version in (v1.0, v2.0)或env notin (dev, qa))。在試用時官方推薦ReplicaSet。
- Services
Kubernetes Pod是平凡的,它門會被創建,也會死掉(生老病死),並且他們是不可復活的。 ReplicationControllers動態的創建和銷毀Pods(比如規模擴大或者縮小,或者執行動態更新)。每個pod都由自己的ip,這些IP也隨着時間的變化也不能持續依賴。這樣就引發了一個問題:如果一些Pods(讓我們叫它作后台,后端)提供了一些功能供其它的Pod使用(讓我們叫作前台),在kubernete集群中是如何實現讓這些前台能夠持續的追蹤到這些后台的?答案是:Service
Kubernete Service 是一個定義了一組Pod的策略的抽象,我們也有時候叫做宏觀服務。這些被服務標記的Pod都是(一般)通過label Selector決定的(下面我們會講到我們為什么需要一個沒有label selector的服務)
- Volumes
容器中的磁盤的生命周期是短暫的,這就帶來了一系列的問題,第一,當一個容器損壞之后,kubelet 會重啟這個容器,但是文件會丟失-這個容器會是一個全新的狀態,第二,當很多容器在同一Pod中運行的時候,很多時候需要數據文件的共享。Kubernete Volume解決了這個問題.
一個Kubernetes volume,擁有明確的生命周期,與所在的Pod的生命周期相同。因此,Kubernetes volume獨立與任何容器,與Pod相關,所以數據在重啟的過程中還會保留,當然,如果這個Pod被刪除了,那么這些數據也會被刪除。更重要的是,Kubernetes volume 支持多種類型,任何容器都可以使用多個Kubernetes volume。
- Deployment
Deployment為Pod和ReplicaSet提供了一個聲明式定義(declarative)方法,用來替代以前的ReplicationController來方便的管理應用。典型的應用場景包括:
- 定義Deployment來創建Pod和ReplicaSet
2.滾動升級和回滾應用 - 擴容和縮容
- 暫停和繼續Deployment
比如一個簡單的nginx應用可以定義為
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
- Secret
Secret解決了密碼、token、密鑰等敏感數據的配置問題,而不需要把這些敏感數據暴露到鏡像或者Pod Spec中。Secret可以以Volume或者環境變量的方式使用。
Secret有三種類型:
- Service Account:用來訪問Kubernetes API,由Kubernetes自動創建,並且會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中;
- Opaque:base64編碼格式的Secret,用來存儲密碼、密鑰等;
- kubernetes.io/dockerconfigjson:用來存儲私有docker registry的認證信息。
- Ingress
在本篇文章中你將會看到一些在其他地方被交叉使用的術語,為了防止產生歧義,我們首先來澄清下。
- 節點:Kubernetes集群中的服務器;
- 集群:Kubernetes管理的一組服務器集合;
- 邊界路由器:為局域網和Internet路由數據包的路由器,執行防火牆保護局域網絡;
- 集群網絡:遵循Kubernetes網絡模型實現群集內的通信的具體實現,比如flannel 和 OVS。
- 服務:使用標簽選擇器標識一組pod成為的Kubernetes Service。 除非另有說明,否則服務的虛擬IP僅可在集群內部訪問。
什么是Ingress?
通常情況下,service和pod的IP僅可在集群內部訪問。集群外部的請求需要通過負載均衡轉發到service在Node上暴露的NodePort上,然后再由kube-proxy將其轉發給相關的Pod。
Ingress可以給service提供集群外部訪問的URL、負載均衡、SSL終止、HTTP路由等。為了配置這些Ingress規則,集群管理員需要部署一個Ingress controller,它監聽Ingress和service的變化,並根據規則配置負載均衡並提供訪問入口。
- ConfigMap
ConfigMap用於保存配置數據的鍵值對,可以用來保存單個屬性,也可以用來保存配置文件。ConfigMap跟secret很類似,但它可以更方便地處理不包含敏感信息的字符串。