《K8S權威指南》讀書筆記-入門篇

一. k8s介紹

1. 是什麼

  • kubernetes:古希臘「舵手」的意思(指引鯨魚-docker)
  • Production-Grade Container Orchestration:生產級別的容器編排系統
  • is an open-source system for automating deployment, scaling, and management of containerized applications:用於自動部署,擴展和管理容器化應用程序的開源系統

2. 發展歷程

  • google內部使用十年之久的大規模機器管理系統-Borg,k8s是其餘開源版本。
  • 2014年6月 谷歌在舊金山的發佈會爲這款新的開源工具揭牌
  • 2015年4月:google發佈論文,高調宣傳k8s
  • 2015年7月:發佈1.0版本
  • 2015-2016:1.0-1.5,主要發佈了五個版本
  • 2017年: 相繼推出 1.六、1.七、1.八、1.9,圍繞穩定性、性能和平臺的 cloud availability 作了改進
  • 2018年3月27日,v1.10 發佈。此版本持續加強了 Kubernetes
  • 2018年6月28 日,v1.11 發佈。此版本加強了網絡功能、可擴展性與靈活性。Kubernetes 1.11 功能的更新爲任何基礎架構、雲或內部部署都能嵌入到 Kubernetes 系統中增添了更多可能性的成熟性、可擴展性以及可插拔性,並在存儲、安全、網絡加強了其穩定性
  • 2018年9月28日,v1.12 發佈。此版本新增了兩個備受期待的功能,Kubelet TLS Bootstrap 和對 Azure 虛擬機規模集支持(並已達到 GA 階段)。同時該版本在安全性和 Azure 等關鍵功能上做出了改進;
  • 2018年12月4日,v1.13發佈。此版本的三個主要特性已逐漸過渡到 GA。此版本中的顯着特徵包括:使用 kubeadm 簡化集羣管理、Container Storage Interface(CSI)、以 CoreDNS 做爲默認 DNS
  • 大約每100天更新一次,現在已經是 V 1.15.0版本(2019.7.17)

3. 特色

  • 一切以服務爲中心
  • 自動化:自我擴展、自我診斷
  • 底層不只僅依賴docker,還支持Rocket
  • 不侷限於語言,對現有代碼、框架沒有任何侵入

4. 功能

  • 基於容器的、一站式的分佈式平臺和分佈式解決方案前端

  • 主要功能是生產環境的容器編排,包括:node

    • 滾動升級
    • 在線擴縮容
    • 資源自動調度
    • 資源配額管理
    • 服務註冊、服務發現
    • 負載均衡
    • 故障發現和自我修復

5. 爲何要用k8s

  • 容器逐漸替代宿主機,k8s是業界普遍承認和看好的容器分佈式解決方案
  • 輕裝上陣開發業務系統,k8s幫咱們作了不少底層的事
  • 全面擁抱微服務
  • 平滑的在公有云、私有云、混合雲等環節遷移
  • 超強的橫向擴展能力

二. 安裝和用法

安裝

參考個人另外一篇文章:Centos7安裝k8s集羣1.15.0版本linux

基本用法

  • k8s主要經過命令行工具kubectl執行各類命令
  • kubectl解析命令行,並生成http請求發送給k8s中master節點的apiserver
  • kubectl不必定要安裝在k8s集羣中,可單獨安裝在任何機器,而後配置k8s的config文件,就能夠和該k8s交互
  • kubectl經常使用命令,參考:

三. k8s簡單的demo

四. 基本概念

1. Container

  • Container(容器)是一種便攜式、輕量級的操做系統級虛擬化技術
  • 它使用 namespace 隔離不一樣的軟件運行環境
  • 經過鏡像自包含軟件的運行環境,從而使得容器能夠很方便的在任何地方運行
  • 容器體積小且啓動快,所以能夠在每一個容器鏡像中打包一個應用程序

2. Pod

  • Kubernetes 使用 Pod 來管理容器
  • 每一個 Pod 能夠包含一個或多個緊密關聯的容器
  • 共享 PID、IPC、Network 和 UTS namespace
  • 是 Kubernetes 調度的基本單位
  • 更多信息參考後面的資源對象部分

pod

3. Node

  • Node 是 Pod 真正運行的主機,能夠是物理機,也能夠是虛擬機
  • 每一個 Node 節點上至少要運行 container runtime(好比 docker 或者 rkt)
  • 集羣工做節點,負責真正啓動容器
  • Node向Master註冊,並按期彙報自身信息
  • 包括的組件有:
    • kubelet:pod生命週期管理:建立、刪除、啓停、擴縮容
    • kube-proxy:service通信與負載均衡
    • Docker引擎:容器建立與管理

4. Master

  • 集羣控制節點,負責集羣管理和控制
  • 包括的組件有:
    • kube-apiserver:全部資源增刪改查的惟一入口
    • controller-manager:資源對象的自動化控制,保持"實際狀態「處於」指望狀態「
    • kube-scheduler:負責資源的調度

五. 資源對象

概述

  • k8s中大部分概念,如Node,Pod,Service均可以看作一種資源對象
  • 資源的描述:yaml文件或json文件
  • 資源的操做:對象能夠經過kubectl(或者api)執行增、刪、改、查
  • 資源的存儲:信息在etcd中持久化
  • 重要的資源:Pod,Service

k8s經過對比資源的「實際狀態」和etcd中的「指望狀態」,實現自動化控制nginx

  • 經常使用資源概述圖

1. Pod

1.1 概述

  • Pod是k8s中最重要最基本的資源
  • pod是在容器以外又封裝的一層概念
  • pod是容器調度的基本單元(不是docker容器)
  • 每一個pod包含一個特殊的根容器:Pause容器,和一個或多個業務容器
  • 每一個pod有惟一的ip,pod內的容器可經過localhost通信

爲何要新增pod這個概念?spring

  1. 一組容器做爲一個單元,很難判斷總體狀態,以及對總體進行管控。新增業務無關的pause容器,用於管控總體
  2. 簡化了關聯容器通訊和共享的問題

1.2 pod整個生命週期的狀態:

  • Pending:已經建立pod,pod正在建立,大部分是在拉取鏡像
  • Running:pod內容器都已經建立,至少一個處於運行狀態
  • Succeeded:pod內容器執行成功並退出,不會再重啓
  • Failed:pod內容器都已退出,至少有一個處於失敗狀態
  • Unknown:沒法獲取pod信息,好比網絡不通

1.3 kubelet重啓pod的策略

  • Always:容器實效時,kubelet重啓該容器
  • OnFailure:容器終止運行且退出碼不爲0,kubelet重啓該容器
  • Nerver:不管如何都不重啓

1.4 kublet重啓pod的時間機制

  • 以2的指數倍秒增加,最大重啓時間間隔爲5min
  • 成功重啓10min後重置該時間

1.5 pod調度控制

  • k8s中經過RC,Deployment等資源控制pod全自動調度(後面會介紹)

2. Label

  • Label是key=value的鍵值對
  • Label由用戶自由指定,數量也不定
  • Label可被添加到任意資源上
  • 經過指定不一樣的label,對資源進行多維度管理
  • Label的重要使用場景:
    • controller經過篩選Pod的label,實現pod的數量一直是預期的
    • proxy經過篩選Pod的label,實現請求路由轉發和負載均衡
    • scheduler經過篩選Node的label,實現pod定向調度
    • istio經過篩選namespace的label,實現sidecar自動注入

3. Replication Controller

  • 已經不推薦使用了,用Deployment代替
  • 實現pod的自動建立和數量控制
  • 用於定義pod的指望場景,包括:
    • 副本數
    • 模板
    • Label選擇器:用於篩選目標
  • RC請求發送後,底層由Controller-Manager組件完成pod自動運維

4. Replica Sets

  • RC的升級版本
  • 支持集合的Label選擇,不只僅是等式Label選擇

5. Deployment

  • RC的再次升級版本,爲了更好的解決Pod編排
  • 能夠隨時知道Pod的部署進度
  • Deployment的使用場景包括:
    • 建立Deployment來生成Replia Set對象,並完成pod建立
    • 檢查pod數量是否達到預期
    • 更新Deployment,建立新的pod

6. HPA

  • Pod的橫向自動擴容
  • 經過自動追蹤Pod的負載狀況,自動調整pod數量
  • 負載判斷指標包括:
    • 內置的cpu使用量
    • 自定義指標

7. Service

  • pod異常時,可能會被調度到另外一臺機器,致使pod的ip改變,使用ip訪問服務不可靠

7.1概述

  • k8s裏最核心的資源之一,相似微服務架構中的「微服務」
  • 前端應用經過入口地址訪問服務,服務經過label對接到後端的pod
  • kube-proxy負責把service請求轉發到後端,並作負載均衡
  • service整個生命週期內,ClusterIp不會變,對外提供的服務地址也就不會變
  • service經過label找到pod,即便pod的ip變了

7.2 服務發現

  • 最開始k8s採用linux系統環境變量,實現服務發現
  • 後來採用kube-dns插件實現服務發現
  • 新版本已經用CoreDNS代替kube-dns

7.3 外部系統訪問service

先區分不一樣ip:docker

  • NodeIp:Node節點的Ip地址,k8s節點的真實ip地址
  • PodIP:pod的ip地址,docker網橋分配的地址
  • ClusterIP:服務ip地址,虛擬出來的ip,屬於內部ip,外部沒法直接訪問

clusterIp沒法被k8s集羣外部訪問,用戶如何訪問呢?數據庫

  • 方法一:指定service的port類型爲NodePort。k8s在每一個Node上開啓一個tcp端口,外部經過Node的ip地址,加這個端口就能夠訪問
  • 方法二:方法一沒法作到負載均衡,k8s提供了相應接口。公有云廠商能夠去實現。而後type改成LoadBalancer

7.4 負載均衡

k8s提供兩種負載均衡策略:json

  • RoundRobin:輪詢模式,默認模式
  • SessionAffinity:ip地址會話保持,統一ip的客戶只會訪問同一個pod

7.5 自定義負載均衡

  • 設置service的clusterIP屬性爲None
  • 稱爲Headless Service,無頭服務
  • 使用場景:好比kafka配置的zk,就能夠設置爲無頭服務

7.6 訪問外部服務

  • 首先定義一個不帶標籤選擇器的service(這時沒法選擇後端pod)
  • 而後定義一個和該service同名的kind爲Endpints的資源,subset屬性指定外部的ip地址和端口

8. Ingress

service提供了ip:port的訪問方式,即工做在tcp/ip層,而http服務須要將不一樣的url對應到不一樣的後端服務,service是沒法實現這一功能的。後端

  • Ingress提供http層的負載分發功能
  • Ingress能夠實現不一樣的請求,分發到不一樣的後端服務
  • Ingress定義後,須要結合Ingress Controller,才能造成完整的功能

8.1 Ingress Controller定義

  • 可使用公有云提供的Ingress Controller
  • 也可使用google提供的Ingress Controller,以pod形式運行,功能以下:
    • 監聽apiserver,獲取ingress的定義
    • 基於ingress定義,生成nginx的配置文件的內容
    • 執行nginx -s reload,從新加載配置

8.2 Ingress定義

  • 建立類型爲Ingress的yaml文件
  • 配置spec.rules,指定hostname中url和service的對應關係

9. Volume

  • volume是pod中被多個容器訪問的共享目錄
  • pod啓動或中止時,volume中數據不會丟失
  • 支持多種類型存儲,如:clusterFS,ceph

volme類型包括:

  • emptyDir:k8s在pod上建立的臨時目錄,pod移除時,目錄也被刪除
  • hostPath:在pod上掛載宿主機上的文件和目錄
  • gcePersistentDisk:谷歌公有云存儲
  • awsElasticBlockStore:亞馬遜提供的公有云存儲
  • nfs:須要部署一個nfs server
  • glusterfs:一個開源的分佈式文件系統
  • rbd:linux塊設備共享共享
  • ...

10. Persistent Volume

  • pv是k8s中某個網絡存儲中對應的一個塊存儲
  • pv只能是網絡存儲,不屬於某個node,可是node能夠訪問
  • pv須要單獨定義,不是定義在pod之上
  • pv支持的類型包括:NFS、ClusterFS、Ceph、GCE、RBD等
  • pv的accessModes屬性指定了訪問模式
    • ReadWriteOnce:讀寫,只能被單個Node掛載
    • ReadOnlyMany:只讀,容許被多個Node掛載
    • ReadWriteMany:讀寫,容許被多個Node掛載
  • pod想要使用pv,先要定義一個pvc。pvc指定使用哪一個pv,pod再指定使用哪一個pvc

11. Namespace

  • 命名空間用於實現多租戶的資源隔離
  • 集羣啓動會默認建立default的namespace,不特殊指定的資源都屬於default

12. Annotation

  • 註解與label相似,也使用key-value形式定義
  • 註解沒有嚴格的命名規則
  • 用戶可定義任意的附加信息,供外部查詢

13. ConfigMap

  • 提供統一的集羣配置管理方案
  • 內容爲key:value形式,保存在k8s中。value不只能夠是數值、字符串,還能夠是配置文件等
  • 典型應用:
    • 生成爲容器內的環境變量
    • 設置爲容器啓動命令的啓動參數
    • 以volume形式掛載爲容器的目錄
  • 使用方式:
    • yaml中指定spec.container.env.valueFrom.configMapRef.key
    • yamnl中指定spec.volumes.configMap.name
  • 使用注意:
    • 必須在建立pod前建立好
    • 能夠屬於某個namespace

五. 架構介紹

k8s架構圖api

  • 簡版架構圖

  • 數據流轉圖

k8s架構圖

1. Master節點的組件

apiServer

  • 提供資源操做的惟一入口,提供api註冊、發現、認證、訪問控制等功能

etcd

  • 一個key-value數據庫
  • 保存整個機器的狀態

controller-manager

  • 負責維護機器狀態,好比:自動擴容、故障檢查、滾動更新
  • 實現集羣自動化的關鍵組件

scheduler

  • 負責資源調度
  • 將未分配節點的pod調度到合適的節點上

2. Node節點的組件

kubelet

  • 負責容器生命週期管理,好比:建立、刪除
  • 同時負責Volume,網絡的管理

kube-proxy

  • 負責爲Service提供負載均衡、服務發現

Container Runtime

  • 容器運行環境
  • 默認是Docker,同時還支持其餘容器引擎

參考文獻

相關文章
相關標籤/搜索