參考:
https://zhuanlan.zhihu.com/p/43266412
https://zhuanlan.zhihu.com/p/292081941
k8s的作用和解決什么問題
由于docker并不具備分布式集群部署,自動擴容縮容,負載均衡的能力,并且沒有解決故障自愈和集群內服務間的通信問題。k8s的出現就很好的彌補了docker的這些缺點,并且k8s自身也有非常出色的容器技術,不一定非得使用docker配合k8s,在最新的k8s版本中已經移除對docker容器的支持。簡而言之k8s就是容器技術的分布式架構系統
作用:
-
自動化服務
- 1、自動快速的垂直擴容縮容和水平擴容縮容、更新部署:
- a、垂直擴容和縮容:服務器能夠輕易的增加和刪除
- b、水平擴容和縮容:容器能輕松增加和移除
- 2、自動為擴容的pod實例提供負載均衡
- 3、自動的提供健康檢查和自愈能力
- 4、根據指令做到任務的自動統一調度
- 1、自動快速的垂直擴容縮容和水平擴容縮容、更新部署:
k8s架構
K8S是屬于主從設備模型(Master-Slave架構),即有Master節點負責核心的調度、管理和運維,Slave節點則在執行用戶的程序。但是在K8S中,主節點一般被稱為Master Node或者Head Node或Master Node,而從節點則被稱為Worker Node或者Node。Master Node和Worker Node組成了K8S集群,同一個集群可能存在多個Master Node和Worker Node
Master Node
- ETCD:K8S的存儲服務。ETCD保存了集群中Master Node和Worker Node中各個組件的狀態,同時也存儲了K8S的關鍵配置和用戶配置,k8s架構所有需要持久化的數據都會存儲在ETCD中。K8S中僅API Server才具備讀寫權限,其他組件必須通過API Server的接口才能讀寫數據;
- Controller Manager:Worker Node的監控器,Controller Manager有很多不同類型的Controller,主要負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
- Scheduler:負責資源的調度,按照預定的調度策略將 Pod 調度到相應的Node節點上;
- API Server:API Server負責接收K8S所有請求,是k8s資源操作的唯一入口,并提供認證、授權、訪問控制、API 注冊和發現等機制。API Server根據的具體請求,去通知其他組件干活。
Worker Node
- Kubelet。Worker Node的監視器。每個節點上都運行一個 kubelet 服務進程,默認監聽 10250 端口,接收并執行 master 發來的指令,管理 Pod 及 Pod 中的容器。每個 kubelet 進程會在 API Server 上注冊節點自身信息,定期向 master 節點匯報節點的資源使用情況,并監控節點和容器的資源,維護node節點上Pod的生命周期。
- Kube-Proxy:K8S的網絡代理。Kube-Proxy負責Node在K8S的網絡通訊、以及對外部網絡流量的負載均衡。
- Container Runtime:Worker Node的運行環境。容器運行時(Container Runtime)是 Kubernetes 最重要的組件之一,負責真正管理鏡像和容器的生命周期。Kubelet 通過 Container Runtime Interface (CRI) 與容器運行時交互,以管理鏡像和容器。
其他組件:
kube-dns:負責為整個集群提供 DNS 服務
Ingress Controller:為服務提供外網入口
Heapster:提供資源監控
Dashboard:提供 GUI
Federation:提供跨可用區的集群
Fluentd-elasticsearch:提供集群日志采集、存儲與查詢
K8S重要概念
k8s架構由master和node組成,node可以運行一個或多個pod,pod可以運行一個或者多個容器,master通過deployment管理和控制Pod,Kubelet管理node的資源和Pod生命周期,定期向master匯報node的資源使用情況-
Pod:Pod是可以在 Kubernetes 中創建和管理的、最小的可部署的計算單元。Pod可以被理解成一群可以共享網絡、存儲和計算資源的容器化服務的集合。同一個Pod之間的Container可以通過localhost互相訪問,并且可以掛載Pod內所有的數據卷;但是不同的Pod之間的Container不能用localhost訪問,也不能掛載其他Pod的數據卷。每個Pod中都運行著一個特殊的被稱為Pause的容器,其他容器則為業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,因此它們之間的通信和數據交換更為高效,在設計時我們可以充分利用這一特性將一組密切相關的服務進程放入同一個Pod中,每當啟動一個pod的時候,pause容器也會隨之啟動
- Deployment:Deployment的作用是管理和控制Pod和ReplicaSet,管控它們運行在用戶期望的狀態中,確保每時每刻有用戶要求數量的Pod在工作。如果一旦發現某Pod不行了,就從其他的node上啟動一個新的pod替換掉。
-
ReplicaSet :ReplicaSet 的目的是維護一組Pod在任何時候都處于穩定運行的狀態。 因此,它通常用來保證給定數量的、完全相同的 Pod 的可用性。ReplicaSet受控制于Deployment
- Service:Service屏蔽了服務細節,統一對外暴露服務接口。舉個例子,我們的一個服務A,部署了3個備份,也就是3個Pod;對于用戶來說,只需要關注一個Service的入口就可以,而不需要操心究竟應該請求哪一個Pod。一方面外部用戶不需要感知因為Pod上服務的意外崩潰、K8S重新拉起Pod而造成的IP變更,外部用戶也不需要感知因升級、變更服務帶來的Pod替換而造成的IP變化,另一方面,Service還可以做流量負載均衡。
-
Ingress:Ingress是整個K8S集群的接入層,負責集群內外通訊,類似springcloud的zuul網關的作用
-
Label:Label是為使Deployment識別調度范圍內的Pod是哪些,從而使service知道給哪些Pod進行負載均衡。比如我有2個業務A和B,通過標簽,DeploymentA和DeploymentB可以識別調度的Pod在哪里,Label不僅可以貼到pod上,它還可以貼到任何的資源上,例如:Namespace和node都可以貼標簽
- Namespace:在一個Kubernetes集群中可以使用namespace創建多個“虛擬集群”,這些namespace之間可以完全隔離,資源名稱在同一個命名空間內需保持唯一,但是兩個不同的命名空間可以包含同名的資源。例如service訪問pod時,如果service的命名空間不指定正確,那么就無法通過標簽關聯到pod。但是可以通過某種方式,讓一個namespace中的service可以訪問到其他的namespace中的pod。也就是說命名空間不會隔離不同空間下的Pod 之間的網絡通訊,除非針對命名空間加了相應的安全策略。
通過實例理解概念:
參考:https://zhuanlan.zhihu.com/p/265997618
以搭建Nginx為例:
創建命名空間
vim nginx-namespace.yaml
apiVersion: v1 #類型為Namespace
kind: Namespace #類型為Namespace
metadata:
name: ns-test #命名空間名稱
#創建
kubectl create -f nginx-namespace.yaml
#查詢
kubectl get namespace
在Namespace下創建資源,通過controller來創建pod。deployment為其中一種controller
deployment創建pod
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ns-test
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
#創建
kubectl create -f nginx-deployment.yaml
#查詢
kubectl get deployment
#或
kubectl get pods -n ns-test
創建service
使用隨機生產ip:
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl create -f nginx-service.yaml
//查看生成的ip
kubectl get svc nginx-service -o wide
創建service
使用本機ip:
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 8000
kubectl create -f nginx-service.yaml