什么是kubernete
Kubernetes是一個(gè)可以移植、可擴(kuò)展的開源平臺(tái),使用 聲明式的配置 并依據(jù)配置信息自動(dòng)地執(zhí)行容器化應(yīng)用程序的管理。在所有的容器編排工具中(類似的還有 docker swarm / mesos等),Kubernetes的生態(tài)系統(tǒng)更大、增長(zhǎng)更快,有更多的支持、服務(wù)和工具可供用戶選擇。
Kubernetes的名字起源于希臘語,含義是 舵手、領(lǐng)航員、向?qū)?/code>。Google于2014年將Brog系統(tǒng)開源為Kubernetes。Kubernetes構(gòu)建在Google Brog 十五年運(yùn)行大規(guī)模分布式系統(tǒng)的經(jīng)驗(yàn) (opens new window)基礎(chǔ)之上,并結(jié)合了開源社區(qū)最好的想法和實(shí)踐。
Kubernetes的功能
Kubernetes用戶可以通過編寫一個(gè)yaml或者json格式的配置文件,也可以通過工具/代碼生成或直接請(qǐng)求Kubernetes API創(chuàng)建應(yīng)用,該配置文件中包含了用戶想要應(yīng)用程序保持的狀態(tài),不論整個(gè)Kubernetes集群中的個(gè)別主機(jī)發(fā)生什么問題,都不會(huì)影響應(yīng)用程序的狀態(tài),你還可以通過改變?cè)撆渲梦募蛘?qǐng)求Kubernetes API來改變應(yīng)用程序的狀態(tài)。
服務(wù)編排
kubernetes 允許聲明式配置,自動(dòng)編排服務(wù),存儲(chǔ)自動(dòng)掛載等等自動(dòng)部署和回滾、修復(fù)
自動(dòng)按期望狀態(tài)自動(dòng)部署容器,當(dāng)版本升級(jí)出錯(cuò)也能實(shí)現(xiàn)按期望回滾,自動(dòng)修復(fù)啟動(dòng)失敗的容器,替換或者kill掉不響應(yīng)用戶定義的運(yùn)行狀態(tài)檢查的容器。服務(wù)發(fā)現(xiàn)和負(fù)載均衡
提供service,ingress 的組件,實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡密鑰與配置管理
可以把部署和配置分離,單獨(dú)管理應(yīng)用程序配置以及敏感信息,比如密鑰、令牌和密鑰等,可以在不重建容器鏡像情況下部署和更新配置,無須在聲明式配置中暴露敏感信息
資源

Deployment負(fù)責(zé)控制Pod的生命周期、保證服務(wù)有一定數(shù)量的Pod在運(yùn)行。Deployment定義了Pod內(nèi)容,包括Pod數(shù)量、更新方式、使用的鏡像,資源限制等等。
Pod是Kubernetes部署實(shí)例時(shí)的最小單元。一個(gè)Pod里面可以包含一個(gè)或者多個(gè)容器。
Service是一個(gè)抽象概念,定義了邏輯集合下訪問Pod組的策略。通過使用Service,我們就可以不用關(guān)心這個(gè)服務(wù)下面的Pod的增加和減少、故障重啟等,只需通過Service就能夠訪問到對(duì)應(yīng)服務(wù)的容器。
控制器
Pod(容器組)是 Kubernetes 中最小的調(diào)度單元,您可以通過 kubectl 直接創(chuàng)建一個(gè) Pod。Pod 本身并不能自愈(self-healing)。如果一個(gè) Pod 所在的 Node (節(jié)點(diǎn))出現(xiàn)故障,或者調(diào)度程序自身出現(xiàn)故障,Pod 將被刪除;同理,當(dāng)因?yàn)楣?jié)點(diǎn)資源不夠或節(jié)點(diǎn)維護(hù)而驅(qū)逐 Pod 時(shí),Pod 也將被刪除。
Kubernetes 通過引入 Controller(控制器)的概念來管理 Pod 實(shí)例。在 Kubernetes 中,您應(yīng)該始終通過創(chuàng)建 Controller 來創(chuàng)建 Pod,而不是直接創(chuàng)建 Pod??刂破骺梢蕴峁┤缦绿匦裕?/p>
- 水平擴(kuò)展(運(yùn)行 Pod 的多個(gè)副本)
- rollout(版本更新)
- self-healing(故障恢復(fù)) 例如:當(dāng)一個(gè)節(jié)點(diǎn)出現(xiàn)故障,控制器可以自動(dòng)地在另一個(gè)節(jié)點(diǎn)調(diào)度一個(gè)配置完全一樣的 Pod,以替換故障節(jié)點(diǎn)上的 Pod。
Pod
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: hello
image: busybox
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
restartPolicy: OnFailure
Deployment
Deployment是最常用的用于部署無狀態(tài)服務(wù)的方式。Deployment 控制器使得您能夠以聲明的方式更新 Pod(容器組)和 ReplicaSet(副本集)。
apiVersion: apps/v1 #與k8s集群版本有關(guān),使用 kubectl api-versions 即可查看當(dāng)前集群支持的版本
kind: Deployment #該配置的類型,我們使用的是 Deployment
metadata: #譯名為元數(shù)據(jù),即 Deployment 的一些基本屬性和信息
name: nginx-deployment #Deployment 的名稱
labels: #標(biāo)簽,可以靈活定位一個(gè)或多個(gè)資源,其中key和value均可自定義,可以定義多組,目前不需要理解
app: nginx #為該Deployment設(shè)置key為app,value為nginx的標(biāo)簽
spec: #這是關(guān)于該Deployment的描述,可以理解為你期待該Deployment在k8s中如何使用
replicas: 1 #使用該Deployment創(chuàng)建一個(gè)應(yīng)用程序?qū)嵗? selector: #標(biāo)簽選擇器,與上面的標(biāo)簽共同作用,目前不需要理解
matchLabels: #選擇包含標(biāo)簽app:nginx的資源
app: nginx
template: #這是選擇或創(chuàng)建的Pod的模板
metadata: #Pod的元數(shù)據(jù)
labels: #Pod的標(biāo)簽,上面的selector即選擇包含標(biāo)簽app:nginx的Pod
app: nginx
spec: #期望Pod實(shí)現(xiàn)的功能(即在pod中部署)
containers: #生成container,與docker中的container是同一種
- name: nginx #container的名稱
image: nginx:1.7.9 #使用鏡像nginx:1.7.9創(chuàng)建container,該container默認(rèn)80端口可訪問
ReplicaSet
Kubernetes 中,ReplicaSet 用來維護(hù)一個(gè)數(shù)量穩(wěn)定的 Pod 副本集合,可以保證某種定義一樣的 Pod 始終有指定數(shù)量的副本數(shù)在運(yùn)行。
ReplicaSet 確保任何時(shí)間都有指定數(shù)量的 Pod 副本在運(yùn)行。 然而,Deployment 是一個(gè)更高級(jí)的概念,它管理 ReplicaSet,并向 Pod 提供聲明式的更新以及許多其他有用的功能。 因此,我們建議使用 Deployment 而不是直接使用 ReplicaSet, 除非你需要自定義更新業(yè)務(wù)流程或根本不需要更新。
這實(shí)際上意味著,你可能永遠(yuǎn)不需要操作 ReplicaSet 對(duì)象:而是使用 Deployment,并在 spec 部分定義你的應(yīng)用。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# 按你的實(shí)際情況修改副本數(shù)
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
StatefulSet
StatefulSet顧名思義,用于管理 Stateful(有狀態(tài))的應(yīng)用程序。
StatefulSet 管理 Pod 時(shí),確保其 Pod 有一個(gè)按順序增長(zhǎng)的 ID。
StatefulSet 對(duì)于需要滿足以下一個(gè)或多個(gè)需求的應(yīng)用程序很有價(jià)值:
- 穩(wěn)定的、唯一的網(wǎng)絡(luò)標(biāo)識(shí)符。
- 穩(wěn)定的、持久的存儲(chǔ)。
- 有序的、優(yōu)雅的部署和擴(kuò)縮。
- 有序的、自動(dòng)的滾動(dòng)更新。
DaemonSet
DaemonSet控制器確保所有(或一部分)的節(jié)點(diǎn)都運(yùn)行了一個(gè)指定的 Pod 副本。
每當(dāng)向集群中添加一個(gè)節(jié)點(diǎn)時(shí),指定的 Pod 副本也將添加到該節(jié)點(diǎn)上
當(dāng)節(jié)點(diǎn)從集群中移除時(shí),Pod 也就被垃圾回收了
刪除一個(gè) DaemonSet 可以清理所有由其創(chuàng)建的 Pod
DaemonSet 的一些典型用法:
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行集群守護(hù)進(jìn)程
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行日志收集守護(hù)進(jìn)程
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行監(jiān)控守護(hù)進(jìn)程
job
Kubernetes中的 Job 對(duì)象將創(chuàng)建一個(gè)或多個(gè) Pod,并確保指定數(shù)量的 Pod 可以成功執(zhí)行到進(jìn)程正常結(jié)束:
當(dāng) Job 創(chuàng)建的 Pod 執(zhí)行成功并正常結(jié)束時(shí),Job 將記錄成功結(jié)束的 Pod 數(shù)量
當(dāng)成功結(jié)束的 Pod 達(dá)到指定的數(shù)量時(shí),Job 將完成執(zhí)行
刪除 Job 對(duì)象時(shí),將清理掉由 Job 創(chuàng)建的 Pod
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
cronjob
CronJob 按照預(yù)定的時(shí)間計(jì)劃(schedule)創(chuàng)建 Job。一個(gè) CronJob 對(duì)象類似于 crontab (cron table) 文件中的一行記錄。該對(duì)象根據(jù) Cron
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure