docker集羣——K8s簡介

Kubernetes是谷歌開源的容器集羣管理系統,是Google多年大規模容器管理技術Borg的開源版本,主要功能包括:node

  • 基本容器的應用部署、維護和滾動升級;
  • 負載均衡和服務發現;
  • 跨機器和跨地區的集羣調度;
  • 自動伸縮;
  • 無狀態服務和有狀態服務;
  • 普遍的Volume支持;
  • 插件機制保證擴展性。

Kubernetes 提供了不少的功能,它能夠簡化應用程序的工做流,加快開發速度。一般,一個成功的應用編排系統須要有較強的自動化能力,這也是爲何 Kubernetes 被設計做爲構建組件和工具的生態系統平臺,以便更輕鬆地部署、擴展和管理應用程序。python

用戶可使用Label以本身的方式組織管理資源,還可使用Annotation來自定義資源的描述信息,好比爲管理工具提供狀態檢查等。nginx

此外,Kubernetes控制器也是構建在跟開發人員和用戶使用的相同的API之上。用戶還能夠編寫本身的控制器和調度器,也能夠經過各類插件機制擴展系統的功能。docker

這種設計使得能夠方便地在Kubernetes之上構建各類應用系統。json

主要的組件包括:

  • etcd保存整個集羣的狀態;
  • apiserver提供了資源操做的惟一入口,並提供認證受權、訪問控制、API註冊和發現等機制;
  • controller manager負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等;
  • scheduler負責資源的調度,按照預約的調度策略將pod調度到相應的機器上;
  • kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;
  • Container runtime負責鏡像管理以及pod和容器的真正運行(CRI);
  • kube-proxy負責爲Service提供cluster內部的服務發現和負載均衡。

 

Container

Container(容器)是一種便捷式、輕量級的操做系統級虛擬化技術。它使用namespace隔離不一樣的軟件運行環境,並經過鏡像自包含軟件的運行環境,從而使得容器能夠很方便的在任何地方運行。後端

因爲容器體積小且啓動快,所以能夠在每一個容器鏡像中打包一個應用程序。這種一對一的應用鏡像關係擁有不少好處。使用容器,不須要與外部的基礎架構環境綁定,由於每個應用程序都不須要外部依賴,更不須要與外部的基礎架構環境依賴。完美解決了從開發到生產環境的一致性問題。api

容器同比虛擬機更加透明,這有助於監測和管理。尤爲是容器進程的生命週期由基礎設施管理,而不是由容器內的進程對外隱藏時更是如此。最後,每一個應用程序用容器封裝,管理容器部署就等同於管理應用程序部署。網絡

在Kubernets必須使用pod管理容器,每一個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

Node 是Pod真正運行的主機,能夠物理機,也能夠是虛擬機。爲了管理Pod,每一個Node節點上至少要運行container runtime(好比docker或者rkt)、kubelet和kube-proxy服務。

Namespace

Namespace是對一組資源和對象的抽象集合,好比能夠用來將系統內部的對象劃分爲不一樣的項目組或用戶組。常見的pods,services,replication controllers和deployments等都是屬於某一個namespace(默認是default),而node,persistentVolumes等則不屬於任何namespace。

Service

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

Label是識別Kubernetes對象的標籤,以key/value的方式附加到對象上(key最長不能超過63字節,value能夠爲空,也能夠是不超過253字節的字符串)。

Label不提供惟一性,而且實際上常常是不少對象(如Pods)都使用相同的label來標誌具體的應用。

Label定義好後其餘對象可使用Label Selector來選擇一組相同的label的對象(好比ReplicaSet和Service用label來選擇一組Pod)。Label Selector支持如下幾種方式:

  • 等式,如app=ngingx 和 env!=production
  • 集合,如env in(production, qa)
  • 多個label(它們之間AND關係),如app=nginx, env=test

Annotations

Annotations是key/value形式附加於對象的註解。不一樣於labels用於標誌和選擇對象,Annotations則是用來記錄一些附加信息,用來輔助應用部署、安裝策略以及調度策略等。好比deployment使用annotations來記錄rolling update的狀態。

相關文章
相關標籤/搜索