kubernetes是基於容器技術的分佈式架構領先方案,是一個完備的分佈式系統支撐平臺。php
kubernetes帶來的好處:1)全面擁抱微服務;2)統能夠隨時隨地總體「搬遷」到公有云上;3)Kubernetes系統架構具有了超強的橫向擴容能力。node
在Kubernetes中,Node、Pod、Replication Controller、Service等概念均可以看做一種資源對象,經過Kubernetes提供的Kubectl工具或者API調用進行操做,並保存在etcd中。git
master上運行etcd server,API server,controller Manager,scheduler等進程,每一個kubernetes集羣須要有一個master節點來負責整個集羣的管理和控制。redis
node做爲工做負載節點,運行如下一組關鍵進程。算法
kubelet:負責pod對應的容器建立,啓停等任務,同時與master節點密切協做,實現集羣管理的基本功能。docker
kube-proxy:實現kubernetes Service的通訊與負載均衡機制的重要組件。apache
Docker Engine:Docker引擎,負責本機的容器建立和管理工做。api
查看集羣中多少個node:kubectl get nodestomcat
查看某個Node的詳細信息:kubectl describe node <node_name>網絡
Pod是Kubernetes的最基本操做單元,包含一個活多個緊密相關的容器,相似於豌豆莢的概念。一個Pod能夠被一個容器化的環境看做應用層的「邏輯宿主機」(Logical Host)。一個Pod中的多個容器應用一般是緊耦合的。Pod在Node上被建立、啓動或者銷燬。
apiVersion: v1 kind: Pod metadata: name: redis-slave labels: name: redis-slave spec: containers: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379 resources: requests: 該資源的最小申請量,系統必須知足要求 memory:"64Mi" cpu:"250m" limits: 資源最大容許使用量,超過將重啓 memory:"128Mi" cpu:"500m"
Label以key/value鍵值對的形式附加到各類對象上,如Pod、Service、RC、Node等。Label定義了這些對象的可識別屬性,用來對它們進行管理和選擇。Label能夠在建立時附加到對象上,也能夠在對象建立後經過API進行管理。
基於等式的Label Selector使用等式類的表達式來進行選擇:
基於集合的Label Selector使用集合操做的表達式來進行選擇:
將多個Label Selector進行組合
name=redis-slave,env!=production
name not in (php-frontend),env!=production
總結:使用label能夠給對象建立多組標籤,Lable和label Selector共同構成了Kubernetes系統中最核心的應用模型,使得被管理對象可以被精細的分組管理,同時實現了整個集羣的高可用性。
RC定義了一個指望的場景,即聲明某種Pod的副本數量在任意時刻都符合某個預期值,因此RC的定義包括以下幾個部分:
1)pod期待的副本數
2)用於刷選目標Pod的label Selector
3)當pod的副本數量小於預期數量的時候,用於建立新pod的pod模板。
apiVersion: v1 kind: ReplicationController metadata: name: redis-slave labels: redis-slave name: redis-slave spec: replicas: 2 selector: name: redis-slave 標籤name=redis-slave的pod存在2個副本 template: metadata: labels: name: redis-slave spec: container: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379
deployment在內部使用Replica Set來實現目的,不管從Deployment的做用與目的,它的YAM定義,仍是從它的具體命令行操做來看,咱們均可以把它看作RC的一次升級。
HPA(pod橫向自動擴容)
經過追蹤分析RC控制的全部目標pod的負載變化狀況,來肯定是否須要針對性的調整目標pod的副本數,這是HPA的實現原理。
下面是HPA定義的案例:
apiVersion:autoscaling/v1 kind:HorizontalPodAutoscaler metadata: name:php-apache namespace:default spec: maxReplicas:10 minReplicas:1 scaleTargetRef: kind:Deployment name:php-apache targetCPUUtilizationPercentage:90 #根據上面的定義,咱們知道這個HPA控制的目標對象爲Deployment裏一個名叫php-apache的Pod副本,這個副本的CPUUtilizationPercentage值超過90%就會觸發自動擴容行爲,伸縮的副本數介於1-10之間。 #經過kubectl create建立HPA資源對象 或者 kubectl autoscale deployment php-apache --cpu-percent=90 --min=1 --max=10
一個Service能夠看做一組提供相同服務的Pod的對外訪問接口。Service做用於哪些Pod是經過Label Selector來定義的。
Pod的IP地址是Docker Daemon根據docker0網橋的IP地址段進行分配的,但Service的Cluster IP地址是Kubernetes系統中的虛擬IP地址,由系統動態分配。Service的Cluster IP地址相對於Pod的IP地址來講相對穩定,Service被建立時即被分配一個IP地址,在銷燬該Service以前,這個IP地址都不會再變化了。而Pod在Kubernetes集羣中生命週期較短,可能被ReplicationContrller銷燬、再次建立,新建立的Pod將會分配一個新的IP地址。
部署一個負載均衡器,爲這組pod開啓一個對外服務端口如8000端口,而且將pod的endpoint列表加入8000端口的轉發列表中,客戶端就能夠經過負載均衡器的對外IP地址+服務端口來訪問此服務,而客戶端的請求最後會被轉發到哪一個pod,則由負載均衡器算法決定。
外部訪問service
Node IP:Node節點的IP地址 Pod IP:Pod的IP地址 Cluster IP:Service的IP地址
Kubernetes支持兩種對外提供服務的Service的type定義:NodePort和LoadBalancer。
apiVersion: v1 kind: Service metadata: name: frontend labels: name: frontend spec: type: NodePort * ports: - port: 80 nodePort: 30001 * selector: name: frontend
若是雲服務商支持外接負載均衡器,則能夠經過spec.type=LoadBalaner定義Service,同時須要制定負載均衡器的IP地址。使用這種類型須要指定Service的nodePort和clusterIP。例如:
apiVersion: v1 kind: Service metadata: { "kind" "Service", "apiVersion": "v1", "metadata": { "name": "my-service" }, "spec": { "type": "LoadBalaner", "clusterIP": "10.0.171.239", "selector": { "app": "MyApp" }, "ports": [ { "protocol": "TCP", "port": 80, "targetPort": 9376, "nodePort": 30061 } ], }, "status": { "loadBalancer": { "ingress": [ { "ip": "146.148.47.155" } ] } } }
Volume是Pod中可以被多個容器訪問的共享目錄。當容器終止或者重啓時,Volume中的數據也不會丟失。另外,Kubernetes支持多種類型的Volume,而且一個Pod能夠同時使用任意多個Volume。Kubernetes提供了很是豐富的Volume類型,下面逐一進行說明。
#舉例來講,咱們要給以前的tomcat pod增長一個名字爲dataVol的volume,而且Mount到容器的/mydata-data目錄,則只要對pod的定義文件作以下修改: template: metadata: labels: app:app-demo tier:frontend spec: volumes: -name:datavol emptyDir:{} containers: -name:tomcat-demo image:tomcat volumeMount: - mountPath:/mydata-data name:datavol
使用宿主主機的/data目錄定義hostPath類型的volume: volumes: -name:"persistent-storage" hostPah: path:"/data"
Namespace(命名空間)是Kubernetes系統中的另外一個很是重要的概念,經過將系統內部的對象「分配」到不一樣的Namespace中,造成邏輯上分組的不一樣項目、小組或用戶組,便於不一樣的分組在共享使用整個集羣的資源的同時還能被分別管理。
Kubernetes集羣在啓動後,會建立一個名爲「default」的Namespace,經過Kubectl能夠查看到。
使用Namespace來組織Kubernetes的各類對象,能夠實現對用戶的分組,即「多租戶」管理。對不一樣的租戶還能夠進行單獨的資源配額設置和管理,使得整個集羣的資源配置很是靈活、方便。
kubectl get namespaces --查看命名空間 在yaml中定義名爲development的namespace: apiVersion:v1 kind:Namespace metadata: name:development 將一個名爲busybox的pod放入到development命名空間中: apiVersion:v1 kind:Pod metadata: name:busybox namespace:development spec: containers: .............. ............ 在對應的命名空間中查找pod: kubectl get pods --namespace=development
Annotation與Label相似,也使用key/value鍵值對的形式進行定義。Label具備嚴格的命名規則,它定義的是Kubernetes對象的元數據(Metadata),而且用於Label Selector。Annotation則是用戶任意定義的「附加」信息,以便於外部工具進行查找。
用Annotation來記錄的信息包括:
Kubernetes集羣由兩類節點組成:Master和Node。在Master上運行etcd、API Server、Controller Manager和Scheduler四個組件,其中後三個組件構成了Kubernetes的總控中心,負責對集羣中全部資源進行管理和調度。在每一個Node上運行Kubelet、Proxy和Docker Daemon三個組件,負責對本節點上的Pod的生命週期進行管理,以及實現服務代理的功能。另外在全部節點上均可以運行Kubectl命令行工具,它提供了Kubernetes的集羣管理工具集。