基礎知識

k8s全局架構:


image

容器運行時接口(CRI:container runtime interface)):這個接口定義了容器運行時的各項核心操作,比如:啟動一個容器需要的所有參數捺宗。

容器網絡接口(CNI: Container Networking Interface)

容器存儲接口(CSI:Container Storage Interface)

Oci (Open Container Initiative):容器運行時標準 (runtime spec)和 容器鏡像標準(image spec)

由 Master 和 Node 兩種節(jié)點組成褐墅,而這兩種角色分別對應著控制節(jié)點和計算節(jié)點

控制節(jié)點,即 Master 節(jié)點 :

  • 負責 API 服務的 kube-apiserver
  • 負責調度的 kube-scheduler
  • 負責容器編排的 kube-controller-manager厢钧。
    整個集群的持久化數據皿哨,則由 kube-apiserver 處理后保存在 Etcd 中长酗。

計算節(jié)點:

最核心的部分,則是一個叫作 kubelet 的組件智玻。
kubelet 主要負責同容器運行時(比如 Docker 項目)打交道遂唧。而這個交互所依賴的,是一個稱作 CRI 的遠程調用接口吊奢。

Kubernetes 項目并不關心你部署的是什么容器運行時盖彭、使用的什么技術實現,只要你的這個容器運行時能夠運行標準的容器鏡像页滚,它就可以通過實現 CRI 接入到 Kubernetes 項目當中召边。

而具體的容器運行時,比如 Docker 項目裹驰,則一般通過 OCI 這個容器運行時規(guī)范同底層的 Linux 操作系統(tǒng)進行交互隧熙,即:把 CRI 請求翻譯成對 Linux 操作系統(tǒng)的調用(操作 Linux Namespace 和 Cgroups 等)

此外,kubelet 還通過 gRPC 協(xié)議同一個叫作 Device Plugin 的插件進行交互幻林。這個插件贱鼻,是 Kubernetes 項目用來管理 GPU 等宿主機物理設備的主要組件,也是基于 Kubernetes 項目進行機器學習訓練滋将、高性能作業(yè)支持等工作必須關注的功能。

而 kubelet 的另一個重要功能症昏,則是調用網絡插件和存儲插件為容器配置網絡和持久化存儲随闽。這兩個插件與 kubelet 進行交互的接口,分別是 CNI和 CSI肝谭。

kubelet 完全就是為了實現 Kubernetes 項目對容器的管理能力而重新實現的一個組件掘宪。

Kubernetes 項目就沒有像同時期的各種“容器云”項目那樣,把 Docker 作為整個架構的核心攘烛,而僅僅把它作為最底層的一個容器運行時實現魏滚。

任務關系

觀點: 運行在大規(guī)模集群中的各種任務之間,實際上存在著各種各樣的關系坟漱。這些關系的處理鼠次,才是作業(yè)編排和管理系統(tǒng)最困難的地方。

比如芋齿,一個 Web 應用與數據庫之間的訪問關系腥寇,一個負載均衡器和它的后端服務之間的代理關系,一個門戶應用與授權組件之間的調用關系觅捆。

更進一步地說赦役,同屬于一個服務單位的不同功能之間,也完全可能存在這樣的關系栅炒。比如掂摔,一個 Web 應用與日志搜集組件之間的文件交換關系术羔。

  • 虛機處理方式: 部署在一起
  • 容器處理方式: 那些原先擁擠在同一個虛擬機里的各個應用、組件乙漓、守護進程级历,都可以被分別做成鏡像,然后運行在一個個專屬的容器中簇秒。它們之間互不干涉鱼喉,擁有各自的資源配額,可以被調度在整個集群里的任何一臺機器上趋观。

Kubernetes 項目最主要的設計思想是扛禽,從更宏觀的角度,以統(tǒng)一的方式來定義任務之間的各種關系皱坛,并且為將來支持更多種類的關系留有余地编曼。

針對頻繁交互和訪問:在 Kubernetes 項目中,這些容器則會被劃分為一個“Pod”剩辟,Pod 里的容器共享同一個 Network Namespace掐场、同一組數據卷,從而達到高效率交換信息的目的贩猎。

Web 應用與數據庫之間的訪問訪問關系熊户,Kubernetes 項目則提供了一種叫作“Service”的服務。

對于一個容器來說吭服,它的 IP 地址等信息不是固定的嚷堡,那么 Web 應用又怎么找到數據庫容器的 Pod 呢?

Kubernetes 項目的做法是給 Pod 綁定一個 Service 服務艇棕,而 Service 服務聲明的 IP 地址等信息是“終生不變”的蝌戒。這個 Service 服務的主要作用,就是作為 Pod 的代理入口(Portal)沼琉,從而代替 Pod 對外暴露一個固定的網絡地址北苟。

這樣,對于 Web 應用的 Pod 來說打瘪,它需要關心的就是數據庫 Pod 的 Service 信息友鼻。不難想象,Service 后端真正代理的 Pod 的 IP 地址闺骚、端口等信息的自動更新桃移、維護,則是 Kubernetes 項目的職責葛碧。

像這樣借杰,圍繞著容器和 Pod 不斷向真實的技術場景擴展,我們就能夠摸索出一幅如下所示的 Kubernetes 項目核心功能的“全景圖”进泼。

image
  • 按照這幅圖的線索蔗衡,我們從容器這個最基礎的概念出發(fā)纤虽,首先遇到了容器間“緊密協(xié)作”關系的難題,于是就擴展到了 Pod绞惦;
  • 有了 Pod 之后逼纸,我們希望能一次啟動多個應用的實例,這樣就需要 Deployment 這個 Pod 的多實例管理器济蝉;
  • 而有了這樣一組相同的 Pod 后杰刽,我們又需要通過一個固定的 IP 地址和端口以負載均衡的方式訪問它,于是就有了 Service王滤。
  • 訪問時需要授權信息贺嫂,則需要Secret 的對象,它是一個保存在 Etcd 里的鍵值對數據雁乡,這樣第喳,Kubernetes 就會在你指定的 Pod(比如,Web 應用的 Pod)啟動時踱稍,自動把 Secret 里的數據以 Volume 的方式掛載到容器里曲饱。

除了應用與應用之間的關系外,應用運行的形態(tài)是影響“如何容器化這個應用”的第二個重要因素珠月。

為此扩淀,Kubernetes 定義了新的、基于 Pod 改進后的對象啤挎。

  • Job驻谆,用來描述一次性運行的 Pod(比如,大數據任務)侵浸;
  • DaemonSet,用來描述每個宿主機上必須且只能運行一個副本的守護進程服務氛谜;
  • CronJob掏觉,則用于描述定時任務等等。

首先值漫,通過一個“編排對象”澳腹,比如 Pod、Job杨何、CronJob 等酱塔,來描述你試圖管理的應用;

然后危虱,再為它定義一些“服務對象”羊娃,比如 Service、Secret埃跷、Horizontal Pod Autoscaler(自動水平擴展器)等蕊玷。這些對象邮利,會負責具體的平臺級功能。

這種使用方法垃帅,就是所謂的“聲明式 API”延届。這種 API 對應的“編排對象”和“服務對象”,都是 Kubernetes 項目中的 API 對象(API Object)贸诚。這就是 Kubernetes 最核心的設計理念.

Kubernetes 項目的本質方庭,是為用戶提供一個具有普遍意義的容器編排工具,它真正的價值酱固,乃在于提供了一套基于容器構建分布式系統(tǒng)的基礎依賴械念。

把一個容器,按照某種規(guī)則媒怯,放置在某個最佳節(jié)點上運行起來订讼。這種功能,我們稱為“調度”扇苞。

而 Kubernetes 項目所擅長的欺殿,是按照用戶的意愿和整個系統(tǒng)的規(guī)則,完全自動化地處理好容器之間的各種關系鳖敷。這種功能脖苏,就是我們經常聽到的一個概念:編排。

Kubernetes 項目如何啟動一個容器化任務呢?

定義yaml 文件

Kubernetes 一鍵部署利器之 kubeadm

通過這樣兩條指令完成一個 Kubernetes 集群的部署:

# 創(chuàng)建一個Master節(jié)點
$ kubeadm init

# 將一個Node節(jié)點加入到當前集群中
$ kubeadm join <Master節(jié)點的IP和端口>

centos 上安裝 kubelet kubeadm kubectl

# 配置源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安裝
yum install -y kubelet kubeadm kubectl

Master 節(jié)點是不允許運行用戶 Pod 的定踱。而 Kubernetes 做到這一點棍潘,依靠的是 Kubernetes 的 Taint/Toleration 機制。

而容器的持久化存儲崖媚,就是用來保存容器存儲狀態(tài)的重要手段:存儲插件會在容器里掛載一個基于網絡或者其他機制的遠程數據卷亦歉,使得在容器里創(chuàng)建的文件,實際上是保存在遠程存儲服務器上畅哑,或者以分布式的方式保存在多個節(jié)點上肴楷,而與當前宿主機沒有任何綁定關系。這樣荠呐,無論你在其他哪個宿主機上啟動新的容器拧略,都可以請求掛載指定的持久化存儲卷昔园,從而訪問到數據卷里保存的內容臭家。這就是“持久化”的含義种蘸。

由于 Kubernetes 本身的松耦合設計,絕大多數存儲項目媚创,比如 Ceph渗钉、GlusterFS、NFS 等钞钙,都可以為 Kubernetes 提供持久化存儲能力

yaml : 編寫配置文件

用 YAML 文件的方式晌姚,即:把容器的定義粤剧、參數、配置挥唠,統(tǒng)統(tǒng)記錄在一個 YAML 文件中抵恋,然后用這樣一句指令把它運行起來:

 kubectl create -f 我的配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-vol
      volumes:
      - name: nginx-vol
        emptyDir: {}

( 前面帶有 - 為數組) YAML只有兩種結構類型需要知道: lists(可以理解為數組 前面帶有 - 與父元素之間存在縮進 ), maps(可以理解為js中的對象)

(1)Metadata

這個字段就是 API 對象的“標識”,即元數據宝磨,它也是我們從 Kubernetes 里找到這個對象的主要依據弧关。這其中最主要使用到的字段是 Labels

  • Labels 就是一組 key-value 格式的標簽,上述Deployment 會把所有正在運行的、攜帶“app: nginx”標簽的 Pod 識別為被管理的對象唤锉,并確保這些 Pod 的總數嚴格等于兩個世囊。

  • Annotations:和lables同級,主要提供一些內部信息窿祥,針對k8s組件本身株憾,而不是用戶,大多晒衩,由k8s運行的時候自動加在這個Api對象上嗤瞎。

(2)Spec:

屬于這個對象獨有的定義,用來描述它所要表達的功能

而當應用本身發(fā)生變化時听系,開發(fā)人員和運維人員可以依靠容器鏡像來進行同步贝奇;當應用部署參數發(fā)生變化時,這些 YAML 文件就是他們相互溝通和信任的媒介靠胜。

使用 kubectl apply 命令掉瞳,來統(tǒng)一進行 Kubernetes 對象的創(chuàng)建和更新操作,具體做法如下所示:
kubectl apply -f nginx-deployment.yaml

emptyDir

等同于我們之前講過的 Docker 的隱式 Volume 參數浪漠,即:不顯式聲明宿主機目錄的 Volume陕习。所以,Kubernetes 也會在宿主機上創(chuàng)建一個臨時目錄址愿,這個目錄將來就會被綁定掛載到容器所聲明的 Volume 目錄上该镣。

Kubernetes 的 emptyDir 類型,只是把 Kubernetes 創(chuàng)建的臨時目錄作為 Volume 的宿主機目錄必盖,交給了 Docker拌牲。這么做的原因俱饿,是 Kubernetes 不想依賴 Docker 自己創(chuàng)建的那個 _data 目錄歌粥。

小結

  • Kubernetes ,是用一個 YAML 文件來描述你所要部署的 API 對象拍埠。然后失驶,統(tǒng)一使用 kubectl apply 命令完成對這個對象的創(chuàng)建和更新操作。
  • Kubernetes 里“最小”的 API 對象是 Pod枣购。Pod 可以等價為一個應用嬉探,所以擦耀,Pod 可以由多個緊密協(xié)作的容器組成。
  • 在 Kubernetes 中涩堤,我們經常會看到它通過一種 API 對象來管理另一種 API 對象眷蜓,比如 Deployment 和 Pod 之間的關系;而由于 Pod 是“最小”的對象胎围,所以它往往都是被其他對象控制的吁系。這種組合方式,正是 Kubernetes 進行容器編排的重要模式白魂。
  • 而像這樣的 Kubernetes API 對象汽纤,往往由 Metadata 和 Spec 兩部分組成,其中 Metadata 里的 Labels 字段是 Kubernetes 過濾對象的主要手段福荸。
  • 在這些字段里面蕴坪,容器想要使用的數據卷,也就是 Volume敬锐,正是 Pod 的 Spec 字段的一部分背传。而 Pod 里的每個容器,則需要顯式的聲明自己要掛載哪個 Volume滞造。
# 顯式的 Volume 定義
 ...   
    volumes:
      - name: nginx-vol
        hostPath: 
          path: /var/data

備注: 摘自極客時間 學習筆記

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末续室,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子谒养,更是在濱河造成了極大的恐慌挺狰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买窟,死亡現場離奇詭異丰泊,居然都是意外死亡,警方通過查閱死者的電腦和手機始绍,發(fā)現死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門瞳购,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亏推,你說我怎么就攤上這事学赛。” “怎么了吞杭?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵盏浇,是天一觀的道長。 經常有香客問我芽狗,道長绢掰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮滴劲,結果婚禮上攻晒,老公的妹妹穿的比我還像新娘。我一直安慰自己班挖,他們只是感情好鲁捏,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萧芙,像睡著了一般碴萧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上末购,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天破喻,我揣著相機與錄音,去河邊找鬼盟榴。 笑死曹质,一個胖子當著我的面吹牛,可吹牛的內容都是我干的擎场。 我是一名探鬼主播羽德,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迅办!你這毒婦竟也來了宅静?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤站欺,失蹤者是張志新(化名)和其女友劉穎姨夹,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體矾策,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡磷账,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了贾虽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃糟。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蓬豁,靈堂內的尸體忽然破棺而出绰咽,到底是詐尸還是另有隱情,我是刑警寧澤地粪,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布取募,位于F島的核電站,受9級特大地震影響驶忌,放射性物質發(fā)生泄漏矛辕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一付魔、第九天 我趴在偏房一處隱蔽的房頂上張望聊品。 院中可真熱鬧,春花似錦几苍、人聲如沸翻屈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伸眶。三九已至,卻和暖如春刽宪,著一層夾襖步出監(jiān)牢的瞬間厘贼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工圣拄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘴秸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓庇谆,卻偏偏與公主長得像岳掐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饭耳,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355