k8s學(xué)習(xí)(一):k8s入門概念

參考:
https://zhuanlan.zhihu.com/p/43266412
https://zhuanlan.zhihu.com/p/292081941

k8s的作用和解決什么問題

由于docker并不具備分布式集群部署,自動(dòng)擴(kuò)容縮容,負(fù)載均衡的能力,并且沒有解決故障自愈和集群內(nèi)服務(wù)間的通信問題。k8s的出現(xiàn)就很好的彌補(bǔ)了docker的這些缺點(diǎn),并且k8s自身也有非常出色的容器技術(shù),不一定非得使用docker配合k8s,在最新的k8s版本中已經(jīng)移除對docker容器的支持。簡而言之k8s就是容器技術(shù)的分布式架構(gòu)系統(tǒng)

作用:
  • 自動(dòng)化服務(wù)
    • 1、自動(dòng)快速的垂直擴(kuò)容縮容和水平擴(kuò)容縮容、更新部署:
      • a、垂直擴(kuò)容和縮容:服務(wù)器能夠輕易的增加和刪除
      • b、水平擴(kuò)容和縮容:容器能輕松增加和移除
    • 2、自動(dòng)為擴(kuò)容的pod實(shí)例提供負(fù)載均衡
    • 3、自動(dòng)的提供健康檢查和自愈能力
    • 4、根據(jù)指令做到任務(wù)的自動(dòng)統(tǒng)一調(diào)度

k8s架構(gòu)

K8S是屬于主從設(shè)備模型(Master-Slave架構(gòu)),即有Master節(jié)點(diǎn)負(fù)責(zé)核心的調(diào)度、管理和運(yùn)維,Slave節(jié)點(diǎn)則在執(zhí)行用戶的程序。但是在K8S中,主節(jié)點(diǎn)一般被稱為Master Node或者Head Node或Master Node,而從節(jié)點(diǎn)則被稱為Worker Node或者Node。Master Node和Worker Node組成了K8S集群,同一個(gè)集群可能存在多個(gè)Master Node和Worker Node

Master Node
  • ETCD:K8S的存儲(chǔ)服務(wù)。ETCD保存了集群中Master Node和Worker Node中各個(gè)組件的狀態(tài),同時(shí)也存儲(chǔ)了K8S的關(guān)鍵配置和用戶配置,k8s架構(gòu)所有需要持久化的數(shù)據(jù)都會(huì)存儲(chǔ)在ETCD中。K8S中僅API Server才具備讀寫權(quán)限,其他組件必須通過API Server的接口才能讀寫數(shù)據(jù);
  • Controller Manager:Worker Node的監(jiān)控器,Controller Manager有很多不同類型的Controller,主要負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測、自動(dòng)擴(kuò)展、滾動(dòng)更新等;
  • Scheduler:負(fù)責(zé)資源的調(diào)度,按照預(yù)定的調(diào)度策略將 Pod 調(diào)度到相應(yīng)的Node節(jié)點(diǎn)上;
  • API Server:API Server負(fù)責(zé)接收K8S所有請求,是k8s資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問控制、API 注冊和發(fā)現(xiàn)等機(jī)制。API Server根據(jù)的具體請求,去通知其他組件干活。
Worker Node
  • Kubelet。Worker Node的監(jiān)視器。每個(gè)節(jié)點(diǎn)上都運(yùn)行一個(gè) kubelet 服務(wù)進(jìn)程,默認(rèn)監(jiān)聽 10250 端口,接收并執(zhí)行 master 發(fā)來的指令,管理 Pod 及 Pod 中的容器。每個(gè) kubelet 進(jìn)程會(huì)在 API Server 上注冊節(jié)點(diǎn)自身信息,定期向 master 節(jié)點(diǎn)匯報(bào)節(jié)點(diǎn)的資源使用情況,并監(jiān)控節(jié)點(diǎn)和容器的資源,維護(hù)node節(jié)點(diǎn)上Pod的生命周期。
  • Kube-Proxy:K8S的網(wǎng)絡(luò)代理。Kube-Proxy負(fù)責(zé)Node在K8S的網(wǎng)絡(luò)通訊、以及對外部網(wǎng)絡(luò)流量的負(fù)載均衡。
  • Container Runtime:Worker Node的運(yùn)行環(huán)境。容器運(yùn)行時(shí)(Container Runtime)是 Kubernetes 最重要的組件之一,負(fù)責(zé)真正管理鏡像和容器的生命周期。Kubelet 通過 Container Runtime Interface (CRI) 與容器運(yùn)行時(shí)交互,以管理鏡像和容器。
其他組件:

kube-dns:負(fù)責(zé)為整個(gè)集群提供 DNS 服務(wù)
Ingress Controller:為服務(wù)提供外網(wǎng)入口
Heapster:提供資源監(jiān)控
Dashboard:提供 GUI
Federation:提供跨可用區(qū)的集群
Fluentd-elasticsearch:提供集群日志采集、存儲(chǔ)與查詢

K8S重要概念

k8s架構(gòu)由master和node組成,node可以運(yùn)行一個(gè)或多個(gè)pod,pod可以運(yùn)行一個(gè)或者多個(gè)容器,master通過deployment管理和控制Pod,Kubelet管理node的資源和Pod生命周期,定期向master匯報(bào)node的資源使用情況

集群調(diào)度的最小單元就是一個(gè)pod,node可以運(yùn)行一個(gè)或多個(gè)pod,一個(gè)pod可以運(yùn)行一個(gè)容器或者多個(gè)容器,并且同一個(gè)Pod的容器可以共用Pod里的存儲(chǔ)資源,node中通過Kubelet管理node的資源使用和Pod的生命周期(啟動(dòng)、關(guān)閉和監(jiān)控)
每個(gè)pod有獨(dú)一的ip地址,當(dāng)有多個(gè)pod提供相同的服務(wù)的時(shí)候,就需要有負(fù)載均衡的能力,從而這里就涉及到一個(gè)概念就是service,專門用來提供服務(wù)的。服務(wù)主要是用來提供外界訪問的接口,service可以關(guān)聯(lián)一組pod,這些pod的ip地址各不相同,而service相當(dāng)于一個(gè)復(fù)雜均衡的vip,用來指向各個(gè)pod,當(dāng)pod的ip地址發(fā)生改變之后,也能做到自動(dòng)進(jìn)行負(fù)載均衡,在關(guān)聯(lián)的時(shí)候,service和pod之間主要通過label來關(guān)聯(lián),也就是標(biāo)簽,例如圖中的A,B就是標(biāo)簽,每個(gè)deployment通過標(biāo)簽可以知道它所管理哪些pod
  • Pod:Pod是可以在 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計(jì)算單元。Pod可以被理解成一群可以共享網(wǎng)絡(luò)、存儲(chǔ)和計(jì)算資源的容器化服務(wù)的集合。同一個(gè)Pod之間的Container可以通過localhost互相訪問,并且可以掛載Pod內(nèi)所有的數(shù)據(jù)卷;但是不同的Pod之間的Container不能用localhost訪問,也不能掛載其他Pod的數(shù)據(jù)卷。每個(gè)Pod中都運(yùn)行著一個(gè)特殊的被稱為Pause的容器,其他容器則為業(yè)務(wù)容器,這些業(yè)務(wù)容器共享Pause容器的網(wǎng)絡(luò)棧和Volume掛載卷,因此它們之間的通信和數(shù)據(jù)交換更為高效,在設(shè)計(jì)時(shí)我們可以充分利用這一特性將一組密切相關(guān)的服務(wù)進(jìn)程放入同一個(gè)Pod中,每當(dāng)啟動(dòng)一個(gè)pod的時(shí)候,pause容器也會(huì)隨之啟動(dòng)
  • Deployment:Deployment的作用是管理和控制Pod和ReplicaSet,管控它們運(yùn)行在用戶期望的狀態(tài)中,確保每時(shí)每刻有用戶要求數(shù)量的Pod在工作。如果一旦發(fā)現(xiàn)某Pod不行了,就從其他的node上啟動(dòng)一個(gè)新的pod替換掉。
  • ReplicaSet :ReplicaSet 的目的是維護(hù)一組Pod在任何時(shí)候都處于穩(wěn)定運(yùn)行的狀態(tài)。 因此,它通常用來保證給定數(shù)量的、完全相同的 Pod 的可用性。ReplicaSet受控制于Deployment
  • Service:Service屏蔽了服務(wù)細(xì)節(jié),統(tǒng)一對外暴露服務(wù)接口。舉個(gè)例子,我們的一個(gè)服務(wù)A,部署了3個(gè)備份,也就是3個(gè)Pod;對于用戶來說,只需要關(guān)注一個(gè)Service的入口就可以,而不需要操心究竟應(yīng)該請求哪一個(gè)Pod。一方面外部用戶不需要感知因?yàn)镻od上服務(wù)的意外崩潰、K8S重新拉起Pod而造成的IP變更,外部用戶也不需要感知因升級、變更服務(wù)帶來的Pod替換而造成的IP變化,另一方面,Service還可以做流量負(fù)載均衡。
  • Ingress:Ingress是整個(gè)K8S集群的接入層,負(fù)責(zé)集群內(nèi)外通訊,類似springcloud的zuul網(wǎng)關(guān)的作用
  • Label:Label是為使Deployment識(shí)別調(diào)度范圍內(nèi)的Pod是哪些,從而使service知道給哪些Pod進(jìn)行負(fù)載均衡。比如我有2個(gè)業(yè)務(wù)A和B,通過標(biāo)簽,DeploymentA和DeploymentB可以識(shí)別調(diào)度的Pod在哪里,Label不僅可以貼到pod上,它還可以貼到任何的資源上,例如:Namespace和node都可以貼標(biāo)簽
  • Namespace:在一個(gè)Kubernetes集群中可以使用namespace創(chuàng)建多個(gè)“虛擬集群”,這些namespace之間可以完全隔離,資源名稱在同一個(gè)命名空間內(nèi)需保持唯一,但是兩個(gè)不同的命名空間可以包含同名的資源。例如service訪問pod時(shí),如果service的命名空間不指定正確,那么就無法通過標(biāo)簽關(guān)聯(lián)到pod。但是可以通過某種方式,讓一個(gè)namespace中的service可以訪問到其他的namespace中的pod。也就是說命名空間不會(huì)隔離不同空間下的Pod 之間的網(wǎng)絡(luò)通訊,除非針對命名空間加了相應(yīng)的安全策略。

通過實(shí)例理解概念:

參考:https://zhuanlan.zhihu.com/p/265997618

以搭建Nginx為例:
創(chuàng)建命名空間

vim nginx-namespace.yaml

apiVersion: v1 #類型為Namespace
kind: Namespace  #類型為Namespace
metadata:
  name: ns-test  #命名空間名稱

#創(chuàng)建
kubectl create -f nginx-namespace.yaml
#查詢
kubectl get namespace

在Namespace下創(chuàng)建資源,通過controller來創(chuàng)建pod。deployment為其中一種controller
deployment創(chuàng)建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

#創(chuàng)建
kubectl create -f nginx-deployment.yaml
#查詢
kubectl get deployment
#或
kubectl get pods -n ns-test

創(chuàng)建service
使用隨機(jī)生產(chǎn)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

創(chuàng)建service
使用本機(jī)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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容