一、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,維持副本期望數目
- k8s 集群控制節點,對集群進行調度管理,接受集群外用戶去集群操作請求;Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 數據庫)和Controller Manager所組成
- worker節點
- 集群工作節點,運行用戶業務應用容器;Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;
- Kubelet:直接跟容器引擎交互實現容器的生命周期管理,和master進行交互,對當前的節點進行管理(相當於就是master派往node管理的代表)
- Kube-proxy:負責寫入規則至IPTABLES、IPVS實現服務映射訪問的,反向代理和負載均衡
- 集群工作節點,運行用戶業務應用容器;Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;
- 其他插件
- COREDNS:可以為集群中的SVC創建一個域名IP的對應關系解析
- DASHBOARD:給 K8S 集群提供一個 B/S 結構訪問體系
- INGRESS CONTROLLER:官方只能實現四層代理,INGRESS 可以實現七層代理
- FEDERATION:提供一個可以跨集群中心多K8S統一管理功能
- PROMETHEUS:提供K8S集群的監控能力
- ELK:提供 K8S 集群日志統一分析介入平台
- master節點
二、k8s安裝
1、安裝要求
- 一台或多台機器,操作系統CentOS7.x-86_x64(內核4以上最好)(至少三台,一個master,兩個node)
- 硬件配置:2GB 或更多 RAM,2 個 CPU 或更多 CPU,硬盤 30GB 或更多
- 集群中所有機器之間網絡互通
- 可以訪問外網,需要拉取鏡像(不能訪問外網,可設置軟路由,建私有倉庫等)
- 禁止 swap 分區
2、安裝方式
- 目前生產部署 Kubernetes 集群主要有兩種方式
- kubeadm
- Kubeadm 是一個 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用於快速部署 Kubernetes 集群
- 官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
- 二進制包
- 從 github 下載發行版的二進制包,手動部署每個組件,組成 Kubernetes 集群
- kubeadm
- 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 )
- StatefulSet 是為了解決有狀態服務的問題(對應 Deployments 和 ReplicaSets 是為無狀態服務而設計),其應用場景包括
- 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( 把外部環境中的信息輸出給容器 )
- 工作負載型資源 ( workload )
- 集群級資源
- 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
