1. 程式人生 > 實用技巧 >1.k8s概述、安裝、名詞解釋、資源清單

1.k8s概述、安裝、名詞解釋、資源清單

一、k8s概述

1、簡介

  • Kubernetes是一個開源的,用於管理雲平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制,由於k和s之間有8個字母,所以簡稱k8s
  • 傳統的應用部署方式是通過外掛或指令碼來安裝應用。這樣做的缺點是應用的執行、配置、管理、所有生存週期將與當前作業系統繫結,這樣做並不利於應用的升級更新/回滾等操作,當然也可以通過建立虛擬機器的方式來實現某些功能,但是虛擬機器非常重,並不利於可移植性
  • 新的方式是通過部署容器方式實現,每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程序不會相互影響,能區分計算資源。相對於虛擬機器,容器能快速部署,由於容器與底層設施、機器檔案系統解耦的,所以它能在不同雲、不同版本作業系統間進行遷移
  • Kubernetes 是 Google 開源的一個容器編排引擎,它支援自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程式時,通常要部署該應用的多個例項以便對應用請求進行負載均衡
  • 在 Kubernetes 中,我們可以建立多個容器,每個容器裡面執行一個應用例項,然後通過內建的負載均衡策略,實現對這一組應用例項的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理
  • kubernetes的前身是Borg,Borg是叢集的管理器,在它的系統中,執行著眾多叢集,而每個叢集可由成千上萬的伺服器聯接組成,Borg每時每刻都在處理來自眾多應用程式所提交的成百上千的Job, 對這些Job進行接收、排程、啟動、停止、重啟和監控。正如Borg論文中所說,Borg提供了3大好處
    • 隱藏資源管理和錯誤處理,使用者僅需要關注應用的開發
    • 服務高可用、高可靠
    • 可將負載執行在由成千上萬的機器聯合而成的叢集中

2、特點

  • Kubernetes一個核心的特點就是能夠自主的管理容器來保證雲平臺中的容器按照使用者的期望狀態執行著(比如使用者想讓apache一直執行,使用者不需要關心怎麼去做,Kubernetes會自動去監控,然後去重啟,新建,總之,讓apache一直提供服務),管理員可以載入一個微型服務,讓規劃器來找到合適的位置,同時,Kubernetes也系統提升工具以及人性化方面,讓使用者能夠方便的部署自己的應用(就像canary deployments)
  • 自動裝箱
    • 基於容器對應用執行環境的資源配置要求自動部署應用容器
  • 自我修復( 自愈能力)
    • 當容器失敗時,會對容器進行重啟當所部署的 Node 節點有問題時,會對容器進行重新部署和重新排程當容器未通過監控檢查時,會關閉此容器直到容器正常執行時,才會對外提供服務
  • 水平擴充套件
    • 通過簡單的命令、使用者 UI 介面或基於 CPU 等資源使用情況,對應用容器進行規模擴大或規模剪裁
  • 服務發現
    • 使用者不需使用額外的服務發現機制,就能夠基於 Kubernetes 自身能力實現服務發現和負載均衡
  • 滾動更新
    • 可以根據應用的變化,對應用容器執行的應用,進行一次性或批量式更新
  • 版本回退
    • 可以根據應用部署情況,對應用容器執行的應用,進行歷史版本即時回退
  • 金鑰和配置管理
    • 在不需要重新構建映象的情況下,可以部署和更新金鑰和應用配置,類似熱部署
  • 儲存編排
    • 自動實現儲存系統掛載及應用,特別對有狀態應用實現資料持久化非常重要儲存系統可以來自於本地目錄、網路儲存(NFS、Gluster、Ceph 等)、公共雲端儲存服務
  • 批處理
    • 提供一次性任務,定時任務;滿足批量資料處理和分析的場景

3、架構

  • 說明

    • master節點
      • k8s 叢集控制節點,對叢集進行排程管理,接受叢集外使用者去叢集操作請求;Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 資料庫)和Controller Manager所組成
        • API Server:叢集的入口,外界通過kubectl等工具,進行對叢集的操作
        • Schedule:排程器,對叢集的資源進行排程,給pod分配節點等
        • ETCD:儲存叢集的配置資訊,也可以配置成叢集,一個可信賴的分散式鍵值儲存服務,它能夠為整個分散式叢集儲存一些關鍵資料,協助分散式叢集的正常運,推薦在Kubernetes叢集中使用Etcd v3,v2版本已在 Kubernetes v1.11中棄用
        • Controller MangerServer:叢集控制器,對pod進行控制,包含Replication Controller(RC)或者Replica Set(RS),RS已經代替了RC,維持副本期望數目
    • worker節點
      • 叢集工作節點,執行使用者業務應用容器;Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;
        • Kubelet:直接跟容器引擎互動實現容器的生命週期管理,和master進行互動,對當前的節點進行管理(相當於就是master派往node管理的代表)
        • Kube-proxy:負責寫入規則至IPTABLES、IPVS實現服務對映訪問的,反向代理和負載均衡
    • 其他外掛
      • COREDNS:可以為叢集中的SVC建立一個域名IP的對應關係解析
      • DASHBOARD:給 K8S 叢集提供一個 B/S 結構訪問體系
      • INGRESS CONTROLLER:官方只能實現四層代理,INGRESS 可以實現七層代理
      • FEDERATION:提供一個可以跨叢集中心多K8S統一管理功能
      • PROMETHEUS:提供K8S叢集的監控能力
      • ELK:提供 K8S 叢集日誌統一分析介入平臺

二、k8s安裝

1、安裝要求

  • 一臺或多臺機器,作業系統CentOS7.x-86_x64(核心4以上最好)(至少三臺,一個master,兩個node)
  • 硬體配置:2GB 或更多 RAM,2 個 CPU 或更多 CPU,硬碟 30GB 或更多
  • 叢集中所有機器之間網路互通
  • 可以訪問外網,需要拉取映象(不能訪問外網,可設定軟路由,建私有倉庫等)
  • 禁止 swap 分割槽

2、安裝方式

  • 目前生產部署 Kubernetes 叢集主要有兩種方式
  • Kubeadm 降低部署門檻,但遮蔽了很多細節,遇到問題很難排查。如果想更容易可控,推薦使用二進位制包部署 Kubernetes 叢集,雖然手動部署麻煩點,期間可以學習很多工作原理,也利於後期維護

2.1、kubeadm安裝

  • 準備環境,三臺機器,一個master,兩個node

    • 角色 ip
      master 192.168.47.150
      node1 192.168.47.161
      node2 192.168.47.162
    • # 以下命令所有節點執行
      # 關閉防火牆
      systemctl stop firewalld
      systemctl disable firewalld
      
      # 關閉selinux
      sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
      setenforce 0  # 臨時
      
      # 關閉swap
      swapoff -a  # 臨時
      sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久
      
      # 根據規劃設定主機名
      hostnamectl set-hostname <hostname>
      
      # 在master新增hosts
      cat >> /etc/hosts << EOF
      192.168.47.150 k8smaster
      192.168.47.161 k8snode1
      192.168.47.162 k8snode2
      EOF
      
      # 將橋接的IPv4流量傳遞到iptables的鏈
      cat > /etc/sysctl.d/k8s.conf << EOF
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF
      sysctl --system  # 生效
      
      # 時間同步
      # yum install chrony -y centos 8 chrony替換了ntpdate 
      # yum install ntpdate -y
      # chrony time.windows.com
      # ntpdate time.windows.com
      # 設定系統時區為 中國/上海
      timedatectl set-timezone Asia/Shanghai
      # 將當前的 UTC 時間寫入硬體時鐘
      timedatectl set-local-rtc 0
      # 重啟依賴於系統時間的服務
      systemctl restart rsyslog
      systemctl restart crond
      
  • 所有節點安裝Docker/kubeadm/kubelet

    • # 安裝docker 並開機自啟
      $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
      $ yum -y install docker-ce-18.06.1.ce-3.el7
      $ systemctl enable docker && systemctl start docker
      $ docker --version
      Docker version 18.06.1-ce, build e68fc7a
      # 設定映象加速器
      $ cat > /etc/docker/daemon.json << EOF
      {
        "registry-mirrors": ["https://自己的地址.mirror.aliyuncs.com"]
      }
      EOF
      
    • # 新增阿里雲YUM軟體源
      $ cat > /etc/yum.repos.d/kubernetes.repo << EOF
      [kubernetes]
      name=Kubernetes
      baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
      enabled=1
      gpgcheck=0
      repo_gpgcheck=0
      gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      EOF
      
    • # 安裝kubeadm,kubelet和kubectl 並開機自啟
      # 由於版本更新頻繁,這裡指定版本號部署
      $ yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
      $ systemctl enable kubelet
      
  • 部署Kubernetes Master

    • # 在主節點執行 由於預設拉取映象地址k8s.gcr.io國內無法訪問,這裡指定阿里雲映象倉庫地址
      $ kubeadm init \
        --apiserver-advertise-address=192.168.47.150 \
        --image-repository registry.aliyuncs.com/google_containers \
        --kubernetes-version v1.18.0 \
        --service-cidr=10.96.0.0/12 \
        --pod-network-cidr=10.244.0.0/16
      
    • # 使用kubectl工具 主節點初始化完成之後,介面上會有該命令,直接複製執行即可
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
  • 部署Kubernetes node

    • # 向叢集新增新節點,執行在kubeadm init輸出的kubeadm join命令(主節點初始化完成之後,介面上會有該命令,直接複製在node上執行即可)
      $ kubeadm join 192.168.1.11:6443 --token esce21.q6hetwm8si29qxwn \
          --discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
      
    • # 預設token有效期為24小時,當過期之後,該token就不可用了。這時就需要重新建立token
      kubeadm token create --print-join-command
      
  • 部署CNI網路外掛

    • # 預設映象地址無法訪問,sed命令修改為docker hub映象倉庫 如果下載不到,則使用本地檔案
      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      
      kubectl get pods -n kube-system
      NAME                          READY   STATUS    RESTARTS   AGE
      kube-flannel-ds-amd64-2pc95   1/1     Running   0          72s
      
  • 測試kubernetes叢集

    • # 建立一個pod 並將該服務暴露出去供外接訪問
      $ kubectl create deployment nginx --image=nginx
      $ kubectl expose deployment nginx --port=80 --type=NodePort
      $ kubectl get pod,svc
      
    • 訪問地址:http://任意node的ip:暴露的埠

2.2、二進位制包安裝

  • 由於二進位制包安裝比較複雜,有興趣可以自行查閱相關文件(其中的證書資訊需要自建,也就是叢集內部訪問是https,kubelet和api server的互動就需要證書,否則是不能互動的)

三、概念簡述

1、Pod

1.1、概述

  • Pod 是 k8s 系統中可以建立和管理的最小單元,是資源物件模型中由使用者建立或部署的最小資源物件模型,也是在 k8s 上執行容器化應用的資源物件,其他的資源物件都是用來支撐或者擴充套件 Pod 物件功能的,比如控制器物件是用來管控 Pod 物件的,Service 或者Ingress 資源物件是用來暴露 Pod 引用物件的,PersistentVolume 資源物件是用來為 Pod提供儲存等等,k8s 不會直接處理容器,而是 Pod,Pod 是由一個或多個container 組成
  • Pod 是 Kubernetes 的最重要概念,每一個 Pod 都有一個特殊的被稱為”根容器“的 Pause容器。Pause 容器對應的鏡 像屬於 Kubernetes 平臺的一部分,除了 Pause 容器,每個 Pod還包含一個或多個緊密相關的使用者業務容器

1.2、組成

  • Pod的組成:Pause(用於Pod內的容器共享網路和共享儲存,是由k8s自動建立的,可以看作一個邏輯的主機),main container 提供服務,一個Pod內可以有多個容器,同一個Pod內可以直接使用localhost:埠直接訪問(pod實際是不存在的,是一個抽象的意義)

1.3、Pod特性

  • 每個 Pod 都是應用的一個例項,有專用的 IP

  • 一個 Pod 可以有多個容器,彼此間共享網路和儲存資源,每個 Pod 中有一個 Pause 容器儲存所有的容器狀態, 通過管理 pause 容器,達到管理 pod 中所有容器的效果

  • 同一個 Pod 中的容器總會被排程到相同 Node 節點,不同節點間 Pod 的通訊基於虛擬二層網路技術實現

  • 資源共享

    • 一個 Pod 裡的多個容器可以共享儲存和網路,可以看作一個邏輯的主機。共享的如namespace,cgroups 或者其他的隔離資源
    • 多個容器共享同一 network namespace,由此在一個 Pod 裡的多個容器共享 Pod 的 IP 和埠 namespace,所以一個 Pod 內的多個容器之間可以通過 localhost 來進行通訊,所需要注意的是不同容器要注意不要有埠衝突即可。不同的 Pod 有不同的 IP,不同 Pod 內的多個容器之前通訊,不可以使用 IPC(如果沒有特殊指定的話)通訊,通常情況下使用 Pod的 IP 進行通訊
    • 一個 Pod 裡的多個容器可以共享儲存卷,這個儲存卷會被定義為 Pod 的一部分,並且可以掛載到該 Pod 裡的所有容器的檔案系統上
  • 生命週期短暫

    • Pod 屬於生命週期比較短暫的元件,比如,當 Pod 所在節點發生故障,那麼該節點上的 Pod會被排程到其他節點,但需要注意的是,被重新排程的 Pod 是一個全新的 Pod,跟之前的Pod 沒有半毛錢關係
  • 平坦的網路

    • K8s 叢集中的所有 Pod 都在同一個共享網路地址空間中,也就是說每個 Pod 都可以通過其他 Pod 的 IP 地址來實現訪問

1.4、Pod分類

  • 自主式
    • 自主式 Pod 是由 kubelet 進行管理的僅存在於特定 Node 上的 Pod,它們不能通過 API Server進行管理,無法與 ReplicationController、Deployment 或 DaemonSet 進行關聯,並且kubelet 也無法對它們進行健康檢查
    • 通俗點說就是沒有控制器管理的Pod,退出了也就結束了,也沒有人管
  • 控制器管理的Pod
    • 控制器管理的Pod一旦被建立,就會被放入到 etcd 中儲存,隨後會被 Kubernetes Master 排程到某個具體的 Node 上並進行繫結,隨後該 Pod 對應的 Node 上的 kubelet 程序例項化成一組相關的 Docker 容器並啟動起來。在預設情 況下,當 Pod 裡某個容器停止時,Kubernetes 會自動檢測到這個問題並且重新啟動這個 Pod 裡某所有容器, 如果 Pod 所在的 Node 宕機,則會將這個 Node 上的所有 Pod 重新排程到其它節點上
    • 通俗點說就是被控制器管理的Pod,退出了會有控制器管理,重新啟動,維持副本所期望的數目

2、控制器

  • 控制器用來控制Pod的數量,對Pod進行控制可管理

2.1、控制器分類

  • Deployment
    • ReplicationController 用來確保容器應用的副本數始終保持在使用者定義的副本數,即如果有容器異常退出,會自動建立新的 Pod 來替代;而如果異常多出來的容器也會自動回收。在新版本的 Kubernetes 中建議使用 ReplicaSet 來取代 ReplicationControlle
    • ReplicaSet 跟 ReplicationController 沒有本質的不同,只是名字不一樣,並且ReplicaSet 支援集合式的 selector
    • 雖然 ReplicaSet 可以獨立使用,但一般還是建議使用 Deployment 來自動管理ReplicaSet ,這樣就無需擔心跟其他機制的不相容問題(比如 ReplicaSet 不支援rolling-update 但 Deployment 支援)
    • 建立了Deployment也就會建立相應的RS或RC(底層通過RS或RC控制副本數量),同時還提供了滾動更新和版本回退等功能(其實還是通過不同的RS或RC實現的)
    • Deployment 為 Pod 和 ReplicaSet 提供了一個 宣告式定義 (declarative) 方法,用來替代以前的 ReplicationController 來方便的管理應用。典型的應用場景包括
      • 定義 Deployment 來建立 Pod 和 ReplicaSet
      • 滾動升級和回滾應用
      • 擴容和縮容
      • 暫停和繼續 Deployment
  • HPA
    • Horizontal Pod Autoscaling 僅適用於 Deployment 和 ReplicaSet ,在 V1 版本中僅支援根據 Pod的 CPU 利用率擴所容,在 v1alpha 版本中,支援根據記憶體和使用者自定義的 metric 擴縮容
  • StatefullSet
    • StatefulSet 是為了解決有狀態服務的問題(對應 Deployments 和 ReplicaSets 是為無狀態服務而設計),其應用場景包括
      • 穩定的持久化儲存,即 Pod 重新排程後還是能訪問到相同的持久化資料,基於 PVC 來實現
      • 穩定的網路標誌,即 Pod 重新排程後其 PodName 和 HostName 不變,基於 Headless Service(即沒有 Cluster IP 的 Service )來實現
      • 有序部署,有序擴充套件,即 Pod 是有順序的,在部署或者擴充套件的時候要依據定義的順序依次依次進行(即從 0 到 N-1 ,在下一個 Pod 執行之前所有之前的 Pod 必須都是 Running 和 Ready 狀態),基於 init containers 來實現
      • 有序收縮,有序刪除(即從 N-1 到 0 0 )
  • Job ,CronJob
    • Job 負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個 Pod
    • Cron Job 管理基於時間的 Job
      • 在給定時間點只執行一次
      • 週期性地在給定時間點執行

3、Service

  • Service 是 Kubernetes 最核心概念,通過建立 Service,可以為一組具有相同功能的容器應用提供一個統一的入口地址,並且將請求負載分發到後端的各個容器應用上
  • 相當於為一組功能相同的Pod提供一個供外界訪問的地址,對這些Pod進行代理(因為Pod如果刪除,RC為了保持副本數目,會重新拉起一個新Pod,而新的Pod和原來的Pod完全不一樣,Ip地址更是不相同,所以不能直接使用Ip訪問Pod),並且還可以起到負載均衡的作用,也是通過Pod的lables進行代理
  • 分類
    • ClusterIP:叢集內部使用
    • NodePort:對外訪問應用使用
    • LoadBalancer:對外訪問應用使用,公有云

四、網路通訊方式

  • Kubernetes 的網路模型假定了所有 Pod 都在一個可以直接連通的扁平的網路空間中,這在GCE ( Google Compute Engine )裡面是現成的網路模型, Kubernetes 假定這個網路已經存在。而在私有云裡搭建 Kubernetes 叢集,就不能假定這個網路已經存在了。我們需要自己實現這個網路假設,將不同節點上的 Docker 容器之間的互相訪問先打通,然後執行 Kubernetes

  • 同一個 Pod 內的多個容器之間: localhost
    各 Pod 之間的通訊: Overlay Network
    Pod 與 Service 之間的通訊:各節點的 Iptables 規則

  • Flannel 是 CoreOS 團隊針對 Kubernetes 設計的一個網路規劃服務,簡單來說,它的功能是讓叢集中的不同節點主機建立的 Docker 容器都具有全叢集唯一的虛擬 IP 地址。而且它還能在這些 IP 地址之間建立一個覆蓋網路( Overlay Network ),通過這個覆蓋網路,將資料包原封不動地傳遞到目標容器內

  • ETCD 之 Flannel 提供說明

    • 儲存管理 Flannel 可分配的 IP
    • 監控 ETCD 中每個 Pod 的實際地址,並在記憶體中建立維護 Pod
  • 不同情況的通訊

    • 同一個 Pod 內部通訊:同一個 Pod 共享同一個網路名稱空間,共享同一個 Linux 協議
    • Pod1 至 Pod2
      • Pod1 與 Pod2 不在同一臺主機, Pod 的地址是與 docker0 在同一個網段的,但 docker0 網段與宿主機網絡卡是兩個完全不同的 IP 網段,並且不同 Node 之間的通訊只能通過宿主機的物理網絡卡進行。將 Pod 的 IP 和所在 Node 的 IP 關聯起來,通過這個關聯讓 Pod 可以互相訪問
      • Pod1 與 Pod2 在同一臺機器,由 Docker0 網橋直接轉發請求至 Pod2 ,不需要經過 Flannel
    • Pod 至 Service 的網路
      • 目前基於效能考慮,全部為 iptables 維護和轉發
    • Pod 到外網
      • Pod 向外網傳送請求,查詢路由表 , 轉發資料包到宿主機的網絡卡,宿主網絡卡完成路由選擇後, iptables 執行 Masquerade ,把源 IP 更改為宿主網絡卡的 IP ,然後向外網伺服器傳送請求
    • 外網訪問 Pod
      • Service

五、資源清單

1、資源型別

  • 名稱空間級別
    • 工作負載型資源 ( workload )
      • Pod 、 ReplicaSet 、 Deployment 、 StatefulSet 、 DaemonSet 、 Job 、CronJob ( ReplicationController 在 v1.11 版本被廢棄)
    • 服務發現及負載均衡型資源 ( ServiceDiscovery LoadBalance )
      • Service 、 Ingress 、 ...
    • 配置與儲存型資源、
      • Volume( 儲存卷 ) 、 CSI( 容器儲存介面, , 可以擴充套件各種各樣的第三方儲存卷 )
    • 特殊型別的儲存卷
      • ConfigMap ( 當配置中心來使用的資源型別 ) 、 Secret( 儲存敏感資料 ) 、DownwardAPI( 把外部環境中的資訊輸出給容器 )
  • 叢集級資源
    • Namespace 、 Node 、 Role 、 ClusterRole 、 RoleBinding 、 ClusterRoleBinding
  • 元資料型資源
    • HPA 、 PodTemplate 、 LimitRange

2、資源清單檔案YAML

  • k8s 叢集中對資源管理和資源物件編排部署都可以通過宣告樣式(YAML)檔案來解決,也就是可以把需要對資源物件操作編輯到 YAML 格式檔案中,我們把這種檔案叫做資源清單檔案,通過 kubectl 命令直接使用資源清單檔案就可以實現對大量的資源物件進行編排部署了
  • YAML :仍是一種標記語言。為了強調這種語言以資料做為中心,而不是以標記語言為重點。YAML 是一個可讀性高,用來表達資料序列的格式

2.1、YAML語法介紹

  • 使用空格做為縮排
  • 縮排的空格數目不重要,只要相同層級的元素左側對齊即可
  • 低版本縮排時不允許使用 Tab 鍵,只允許使用空格
  • 使用#標識註釋,從這個字元一直到行尾,都會被直譯器忽略

2.2、YAML 支援的資料結構

  • 物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)

    • # 物件型別:物件的一組鍵值對,使用冒號結構表示
      name: Steve
      age: 18
      # Yaml 也允許另一種寫法,將所有鍵值對寫成一個行內物件
      hash: { name: Steve, age: 18 }
      
  • 陣列:一組按次序排列的值,又稱為序列(sequence) / 列表 (list)

    • # 陣列型別:一組連詞線開頭的行,構成一個數組
      animal
      - Cat
      - Dog
      # 陣列也可以採用行內表示法
      animal: [Cat, Dog]
      
  • 複合結構:物件和陣列可以結合使用,形成複合結構

    • languages:
      - Ruby
      - Perl
      - Python
      websites:
      YAML: yaml.org
      Ruby: ruby-lang.org
      Python: python.org
      Perl: use.perl.org
      
  • 純量(scalars):單個的、不可再分的值

    • # 字串 布林值 整數 浮點數 Null
      # 時間 日期
      # 數值直接以字面量的形式表示
      number: 12.30
      # 布林值用true和false表示
      isSet: true
      # null用 ~ 表示
      parent: ~
      # 時間採用 ISO8601 格式
      iso8601: 2001-12-14t21:59:43.10-05:00
      # 日期採用複合 iso8601 格式的年、月、日表示
      date: 1976-07-31
      # YAML 允許使用兩個感嘆號,強制轉換資料型別
      e: !!str 123
      f: !!str true
      
  • 字串的注意事項

    • # 字串預設不使用引號表示
      str: 這是一行字串
      # 如果字串之中包含空格或特殊字元,需要放在引號之中
      str: '內容: 字串'
      # 單引號和雙引號都可以使用,雙引號不會對特殊字元轉義
      s1: '內容\n字串'
      s2: "內容\n字串"
      # 單引號之中如果還有單引號,必須連續使用兩個單引號轉義
      str: 'labor''s day'
      # 字串可以寫成多行,從第二行開始,必須有一個單空格縮排。換行符會被轉為 空格
      str: 這是一段
       多行
       字串
      # 多行字串可以使用|保留換行符,也可以使用>摺疊換行
      this: |
      Foo
      Bar
      that: >
      Foo
      Bar
      # + 表示保留文字塊末尾的換行,- 表示刪除字串末尾的換行
      s1: |
       Foo
      s2: |+
       Foo
      s3: |-
       Foo
      

3、常用欄位說明

  • 必須存在的屬性

    • 引數名 欄位型別 說明
      version String k8s的api版本,目前基本時v1,可以用kubectl api-versions命令查詢
      kind String 指yaml檔案定義的資源型別和角色,比如Pod
      metadata Object 元資料物件,固定值寫metadata
      metadata.name String 元資料物件的名稱,由我們編寫,比如Pod的名字
      metadata.namespace String 元資料物件的名稱空間,由我們自身定義
      spec Object 詳細定義物件,固定值寫spec
      spce.containers[] list spec物件的容器列表
      spce.containers[].name String 定義容器的名稱
      spce.containers[].image String 定義容器的映象
  • 主要物件

    • 引數名 欄位型別 說明
      spce.containers[].name String 定義容器的名稱
      spce.containers[].image String 定義容器的映象
      spce.containers[].imagePullPolicy String 映象的拉取策略
      Always:每次都拉取新的映象
      Never:僅使用本地映象,從不拉取
      IfNotPresent:如果本地有就使用本地映象,沒有則拉取,不寫預設Always
      建議使用IfNotPresent,因為docker中latest不是固定值,經常變
      spce.containers[].command[] list 容器的啟動命令,因為是陣列可以指定多個,不指定則使用映象打包中的命令
      spce.containers[].args[] list 容器啟動命令的引數,因為是陣列可以指定多個
      spce.containers[].workingDir String 容器的工作目錄
      spce.containers[].volumeMounts[] list 容器內部儲存卷位置
      spce.containers[].volumeMounts[].name String 容器掛載的儲存卷名稱
      spce.containers[].volumeMounts[].mountPath String 容器掛載的儲存卷路徑
      spce.containers[].volumeMounts[].readOnly String 容器掛載的儲存卷讀寫模式,true或false,預設true只讀
      spce.containers[].ports[] list 容器用到的埠列表
      spce.containers[].ports[].name String 指定埠名稱
      spce.containers[].ports[].containerPort String 指定容器需要監聽的埠
      spce.containers[].ports[].hostPort String 指定容器所在主機需要監聽的埠號,預設和containerPort相同,注意設定了hostPort同一臺主機無法啟動該容器的形同副本(因為主機的關埠號不能相同,這樣會衝突)
      spce.containers[].ports[].protocol String 指定埠的協議,支援TCP和UDP,預設TCP
      spce.containers[].env[] list 指定容器執行前所需設定的環境變數列表
      spce.containers[].env[].name String 環境變數名稱
      spce.containers[].env[].value String 指定環境變數值
      spce.containers[].resources Object 資源限制和資源請求的值
      spce.containers[].resources.limits Object 容器執行時資源上限(執行容器所能用的最大資源)
      spce.containers[].resources.limits.cpu String CPU的限制,單位為core數,將用於docker run --CPU-shares引數
      spce.containers[].resources.limits.memory String 記憶體限制,單位為MIB、GIB
      spce.containers[].resources.requests Object 容器啟動和排程的限制(執行容器所需最小資源)
      spce.containers[].resources.requests.cpu String CPU的限制,單位為core數
      spce.containers[].resources.requests.memory String 記憶體限制,單位為MIB、GIB
  • 額外引數

    • 引數名 欄位型別 說明
      spec.restartPolicy String Pod的重啟策略
      Always:Pod一旦終止執行,無論容器時如何終止的,kubelet服務都將它重啟,預設
      Onfailure:只有Pod以非零退出嗎終止時,kubelet才會重啟該容器,正常結束退出碼為0
      Never:Pod終止後,kubelet將退出碼報告給master不會重啟
      spec.nodeSelector Object 定義Node的label過濾標籤,以key:value格式指定
      spec.imagePullSecrets Object 定義pull映象時使用的secret名稱,以name:secretkey格式指定
      spec.hostNetwork boolean 定義是否使用主機網路模式,預設false,設定true表示使用宿主機網路
      不使用docker網橋,同時設定了true將無法在同一臺宿主機上啟動第二個副本
  • version說明

    • # 檢視當前k8s支援的version
      kubectl api-versions
      # 檢視某個資源支援的版本 比如Pod
      kubectl explain pod 或者 kubectl explain pod.apiVersion(可在FIELDS選擇欄位中選擇具體欄位,詳細檢視)
      KIND:     Pod
      VERSION:  v1
      
      DESCRIPTION:
           Pod is a collection of containers that can run on a host. This resource is
           created by clients and scheduled onto hosts.
           
      FIELDS:
         apiVersion   <string>
           APIVersion defines the versioned schema of this representation of an
           object. Servers should convert recognized schemas to the latest internal
           value, and may reject unrecognized values. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
      
         kind <string>
           Kind is a string value representing the REST resource this object
           represents. Servers may infer this from the endpoint the client submits
           requests to. Cannot be updated. In CamelCase. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
      
         metadata     <Object>
           Standard object's metadata. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
      
         spec <Object>
           Specification of the desired behavior of the pod. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
      
         status       <Object>
           Most recently observed status of the pod. This data may not be up to date.
           Populated by the system. Read-only. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
      

4、資源清單示例

  • apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
      # 名稱空間 預設default
      namespace: default
      labels:
        app: myapp
    spec:
      containers:
      # 第一個容器 注意同一個Pod中多個容器暴露的埠不能衝突,因為他們共享網路和儲存 比如兩個都是nginx,就會啟動出錯,觸發pod的重啟策略
      - name: myapp-1
        image: nginx
      # 第二個容器
      # - name: myapp-2
      #  image: nginx
    
  • # 使用yaml啟動資源
    kubectl apply -f yaml檔名
    
    # 檢視pod的描述 deployment等
    kubectl describe pod(資源型別) pod-demo(資源名)
    
    # 檢視pod內容器日誌
    kubectl logs pod-demo(pod名) -c myapp-2(容器名,如果Pod中只有一個容器,則不用寫-c)
    
    # 刪除pod deployment等
    kubectl delete pod(資源型別) pod-demo(資源名)
    
    # 將資源的yaml輸出出來
    kubectl get pod(資源型別) pod-demo(資源名) -o yaml
    
  • [root@k8smaster ~]# kubectl describe pod pod-demo
      ......
      Containers:
        myapp-1:
          Container ID:   docker://5f81ea72fdfa7e720d3aba5e448eb26dc36e0be4763654ceb08eb4be75e6455a
          Image:          nginx
          Image ID:       docker-pullable://nginx@sha256:31de7d2fd0e751685e57339d2b4a4aa175aea922e592d36a7078d72db0a45639
          Port:           <none>
          Host Port:      <none>
          State:          Running
            Started:      Tue, 15 Dec 2020 13:47:41 +0800
          Ready:          True
          Restart Count:  0
          Environment:    <none>
          Mounts:
            /var/run/secrets/kubernetes.io/serviceaccount from default-token-99w8n (ro)
        myapp-2:
          Container ID:   docker://d12c9d0833239a987768e64fe1111fcd8d68036549e9e9a514c0a0dbb5bb4853
          Image:          nginx
          Image ID:       docker-pullable://nginx@sha256:31de7d2fd0e751685e57339d2b4a4aa175aea922e592d36a7078d72db0a45639
          Port:           <none>
          Host Port:      <none>
          State:          Waiting
            Reason:       CrashLoopBackOff
          Last State:     Terminated
            Reason:       Error
            Exit Code:    1
            Started:      Tue, 15 Dec 2020 13:49:28 +0800
            Finished:     Tue, 15 Dec 2020 13:49:31 +0800
          Ready:          False
          Restart Count:  3
          Environment:    <none>
          Mounts:
            /var/run/secrets/kubernetes.io/serviceaccount from default-token-99w8n (ro)
      ......
      
      [root@k8smaster ~]# kubectl get pod
      NAME       READY   STATUS             RESTARTS   AGE
      pod-demo   1/2     CrashLoopBackOff   3          2m52s