Kubernetes是谷歌開源的容器集羣管理系統,是Google多年大規模容器管理技術Borg的開源版本,主要功能包括:node
Kubernetes 提供了不少的功能,它能夠簡化應用程序的工做流,加快開發速度。一般,一個成功的應用編排系統須要有較強的自動化能力,這也是爲何 Kubernetes 被設計做爲構建組件和工具的生態系統平臺,以便更輕鬆地部署、擴展和管理應用程序。python
用戶可使用Label以本身的方式組織管理資源,還可使用Annotation來自定義資源的描述信息,好比爲管理工具提供狀態檢查等。nginx
此外,Kubernetes控制器也是構建在跟開發人員和用戶使用的相同的API之上。用戶還能夠編寫本身的控制器和調度器,也能夠經過各類插件機制擴展系統的功能。docker
這種設計使得能夠方便地在Kubernetes之上構建各類應用系統。json
Container(容器)是一種便捷式、輕量級的操做系統級虛擬化技術。它使用namespace隔離不一樣的軟件運行環境,並經過鏡像自包含軟件的運行環境,從而使得容器能夠很方便的在任何地方運行。後端
因爲容器體積小且啓動快,所以能夠在每一個容器鏡像中打包一個應用程序。這種一對一的應用鏡像關係擁有不少好處。使用容器,不須要與外部的基礎架構環境綁定,由於每個應用程序都不須要外部依賴,更不須要與外部的基礎架構環境依賴。完美解決了從開發到生產環境的一致性問題。api
容器同比虛擬機更加透明,這有助於監測和管理。尤爲是容器進程的生命週期由基礎設施管理,而不是由容器內的進程對外隱藏時更是如此。最後,每一個應用程序用容器封裝,管理容器部署就等同於管理應用程序部署。網絡
在Kubernets必須使用pod管理容器,每一個pod能夠包含一個或多個容器。架構
Pod是一組緊密關聯的容器集合,它們共享PID、IPC、Network和UTS namspace,是kubernets調度的基礎單位。Pod的設計理念是支持多個容器在一個Pod中共享網絡和文件系統,能夠經過進程間通訊和文件共享這種簡單高效的方式組合完成服務。app
在Kubernets中,全部對象都是使用manifest(yaml或json)來定義,好比一個簡單的nginx服務能夠定義爲nginx.yaml,它包含一個鏡像爲nginx的容器:
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
Node 是Pod真正運行的主機,能夠物理機,也能夠是虛擬機。爲了管理Pod,每一個Node節點上至少要運行container runtime(好比docker或者rkt)、kubelet和kube-proxy服務。
Namespace是對一組資源和對象的抽象集合,好比能夠用來將系統內部的對象劃分爲不一樣的項目組或用戶組。常見的pods,services,replication controllers和deployments等都是屬於某一個namespace(默認是default),而node,persistentVolumes等則不屬於任何namespace。
Service是應用服務的抽象,經過labels爲應用提供負載均衡和服務發現。匹配labels的Pod IP和端口列表組成endpoints,由kube-proxy負載將服務IP負載均衡到這些endpoints上。
每一個Service都會自動分配一個cluster IP(僅在集羣內部能夠訪問的虛擬地址)和DNS名,其餘容器能夠經過該地址或DNS來訪問服務,而不須要了解後端容器的運行。
apiVersion: v1 kind: Service metadata: name: nginx spec: ports: - port: 8078 # the port that this service should serve on name: http # the container on each pod to connect to, can be a name # (e.g. 'www') or a number (e.g. 80) targetPort: 80 protocol: TCP selector: app: nginx
Label是識別Kubernetes對象的標籤,以key/value的方式附加到對象上(key最長不能超過63字節,value能夠爲空,也能夠是不超過253字節的字符串)。
Label不提供惟一性,而且實際上常常是不少對象(如Pods)都使用相同的label來標誌具體的應用。
Label定義好後其餘對象可使用Label Selector來選擇一組相同的label的對象(好比ReplicaSet和Service用label來選擇一組Pod)。Label Selector支持如下幾種方式:
Annotations是key/value形式附加於對象的註解。不一樣於labels用於標誌和選擇對象,Annotations則是用來記錄一些附加信息,用來輔助應用部署、安裝策略以及調度策略等。好比deployment使用annotations來記錄rolling update的狀態。