kubernete

什么是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)用程序配置以及敏感信息,比如密鑰、令牌和密鑰等,可以在不重建容器鏡像情況下部署和更新配置,無須在聲明式配置中暴露敏感信息

資源

資源結(jié)構(gòu)

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容