k8s學習(一):k8s入門概念

參考:
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、根據指令做到任務的自動統一調度

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,node可以運行一個或多個pod,一個pod可以運行一個容器或者多個容器,並且同一個Pod的容器可以共用Pod裏的存儲資源,node中通過Kubelet管理node的資源使用和Pod的生命週期(啓動、關閉和監控)每個pod有獨一的ip地址,當有多個pod提供相同的服務的時候,就需要有負載均衡的能力,從而這裏就涉及到一個概念就是service,專門用來提供服務的。服務主要是用來提供外界訪問的接口,service可以關聯一組pod,這些pod的ip地址各不相同,而service相當於一個複雜均衡的vip,用來指向各個pod,當pod的ip地址發生改變之後,也能做到自動進行負載均衡,在關聯的時候,service和pod之間主要通過label來關聯,也就是標籤,例如圖中的A,B就是標籤,每個deployment通過標籤可以知道它所管理哪些pod
  • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章