8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod
作者:Happy老師
鏈接:https://blog.51cto.com/happylab/2500457寫在前面
前面的系列文章已介紹kubernetes架構,安裝,升級和快速入門,讀者通過文章的實操已對kubernetes已有初步的認識和理解,從本章開始逐步介紹kubernetes中的基礎概念概念和核心概念,基礎概念包括:namespace,labels,annotations,pods,volumes等;核心概念包含kubernetes中各種controller,包含以下幾種:
應用副本控制器:ReplicaSets,Deployments,DaemonSets,StatefulSets;
批處理任務控制器: Jobs和CronJob
存儲控制器: PersistentVoloume,PersistentVolumeClaim,StorageClass;
服務負載均衡: Service,Ingress,NetworkPolicy和DNS名稱解析;
配置和密鑰: ConfigMaps和Secrets
本文從最基礎的概念pod開始講解,后續逐步介紹應用部署,存儲,負載均衡等相關的控制器,kubernetes內部由多個不同的控制器組成,每個控制器完成不同的功能。
1. 深入學習pod
1.1 Container和Pod概念
容器是一種便攜式,輕量級別的容器虛擬化技術,使用linux cggroup技術實現各種資源的隔離,如cpu,memory,pid,mount,IPC等,相比于虛擬化技術如KVM,容器技術更加輕量級,它的產生主要解決環境的環境發布的問題,目前主流的容器技術是docker,說到容器,一般都等同于docker。
要運行容器首先需要有鏡像,應用和應用依賴的環境運行在容器中,在kubernetes中不會直接運行container,而是運行pod,一個pod里面包含多個container,container之間共享相同的namespace,network,storage等。鏡像存儲在私有鏡像或者公有鏡像中,運行時通過docker image pull的方式拉取到本地運行,images的拉取策略包含有兩種:
ImagePullPolicy為Always,不管本地是否有直接下載
ImagePullPolicy為IfNotPresent,默認鏡像拉取得策略,本地不存在再拉取
Pods是kubernetes中最小的調度單位,Pods內運行一個或者多個container,container之間共享pod的網絡ip資源,存儲volume資源,計算等資源,方便pod內部的container之間能夠實現快速的訪問和交互。
如上圖所示,Pod的使用方式通常包含兩種:
Pod中運行一個容器,最經常使用的模式,container封裝在pod中調度,兩者幾乎等同,但k8s不直接管理容器
Pod中運行多個容器,多個容器封裝在pod中一起調度,適用于容器之間有數據交互和調用的場景,如app+redis,pod內部共享相同的網絡命名空間,存儲命名空間,進程命名空間等。
1.2 如何創建pod
kubernetes交互的方式通常分為四種:
命令行,kubectl和kubernetes交互,完成資源的管理,命令行入門簡單,但只能支持部分資源創建
API,通過resfulAPI以http的方式和kubernetes交互,適用于基于API做二次開發
SDK,提供各種語言原生的SDK,實現各種語言編程接入
YAML,通過易于理解的YAML文件格式,描述資源的定義,功能最豐富,最終轉換為json格式
kubernetes中通過定義生申明式的方式定義資源,即通過在yaml文件中定義所需的資源,kubernetes通過controller-manager按照yaml文件中定義的資源去生成所需的資源(match the current state to desired state)。通常在kubernetes中通過yaml文件的方式定義資源,然后通過kubectl create -f 文件.yaml的方式應用配置,如下演示創建一個nginx應用的操作。
1、編寫yaml文件,定義一個pod資源
[root@node-1 demo]# cat nginx.yamlapiVersion: v1
kind: Pod
metadata:
name: nginx-demo
labels:
name: nginx-demo
spec:
containers:
- name: nginx-demo
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- name: nginx-port-80
protocol: TCP
containerPort: 80
關于配置文件,說明如下:
apiVersion api使用的版本,kubectl api-versions可查看到當前系統能支持的版本列表
kind 指定資源類型,表示為Pod的資源類型
metadata 指定Pod的元數據,metadata.name指定名稱,metadata.labels指定Pod的所屬的標簽
spec 指定Pod的模版屬性,spec.containers配置容器的信息,spec.containers.name指定名字,spec.containers.image指定容器鏡像的名稱,spec.containers.imagePullPolicy是鏡像的下載方式,IfNotPresent表示當鏡像不存在時下載,spec.containers.ports.name指定port的名稱,spec.containers.ports.protocol協議類型為TCP,spec.containers.ports.containerPort為容器端口。
2、創建pod應用
[root@node-1 demo]# kubectl apply -f nginx.yamlpod/nginx-demo created
3、訪問應用
獲取容器的IP地址[root@node-1 demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-7b86696648-8bq7h 1/1 Running 0 8h 10.244.1.11 node-2 <none> <none>
demo-7b86696648-8qp46 1/1 Running 0 8h 10.244.1.10 node-2 <none> <none>
demo-7b86696648-d6hfw 1/1 Running 0 8h 10.244.1.12 node-2 <none> <none>
nginx-demo 1/1 Running 0 50s 10.244.2.11 node-3 <none> <none>
訪問站點內容:
[root@node-1 demo]# curl http://10.244.2.11
<html><head><title>Welcome to nginx!title><style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;
}style>head><body><h1>Welcome to nginx!h1><p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.orga>.<br/>
Commercial support is available at<a href="http://nginx.com/">nginx.coma>.p><p><em>Thank you for using nginx.em>p>body>html>
前面我們我們學習過kubernetes支持滾動升級RollingUpdate,彈性擴容replicas等特性,如何給Pod做滾動升級保障業務不中斷,如何提高Pod的副本個數保障高可用呢?答案是:不支持。Pod是單個,無法支持一些高級特性,高級特性需要通過高級的副本控制器如ReplicaSets,Deployments,StatefulSets,DaemonSets等才能支持。Pod在實際應用中很少用,除了測試和運行一些簡單的功能外,實際使用建議使用Deployments代替,Pod的定義以Template的方式嵌入在副本控制器中。
1.3. 如何編寫yaml文件
前面我們提到過kubernetse是申明式的方式部署應用,應用的部署都定義在yaml文件中來實現,如何來編寫應用的yaml文件呢,下面我來分享兩個實際使用的技巧:
1、通過定義模版快速生成,kubectl create apps -o yaml --dry-run的方式生成,--dry-run僅僅是試運行,并不實際在k8s集群中運行,通過指定-o yaml輸出yaml格式文件,生成后給基于模版修改即可,如下:
[root@node-1 demo]# kubectl create deployment demo --image=nginx:latest --dry-run -o yamlapiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: demo
name: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: demo
spec:
containers:
- image: nginx:latest
name: nginx
resources: {}
status: {}
2、explain命令,explain命令堪稱是語法查詢器,可以查到每個字段的含義,使用說明和使用方式,如想要查看Pod的spec中containers其他支持的字段,可以通過kubectl explain Pod.spec.containers的方式查詢,如下:
[root@node-1 demo]# kubectl explain Pods.spec.containersKIND: Pod
VERSION: v1
RESOURCE: containers
DESCRIPTION:
List of containers belonging to the pod. Containers cannot currently be
added or removed. There must be at least one container in a Pod. Cannot be
updated.
A single application container that you want to run within a pod.
FIELDS:
args #命令參數
Arguments to the entrypoint. The docker image's CMD is used if this is not
provided. Variable references $(VAR_NAME) are expanded using the
container's environment. If a variable cannot be resolved, the reference in
the input string will be unchanged. The $(VAR_NAME) syntax can be escaped
with a double $$, ie: $$(VAR_NAME). Escaped references will never be
expanded, regardless of whether the variable exists or not. Cannot be
updated. More info:
https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
image #鏡像定義
Docker image name. More info:
https://kubernetes.io/docs/concepts/containers/images This field is
optional to allow higher level config management to default or override
container images in workload controllers like Deployments and StatefulSets.
ports #端口定義
List of ports to expose from the container. Exposing a port here gives the
system additional information about the network connections a container
uses, but is primarily informational. Not specifying a port here DOES NOT
prevent that port from being exposed. Any port which is listening on thedefault "0.0.0.0" address inside a container will be accessible from the
network. Cannot be updated.
readinessProbe #可用健康檢查
Periodic probe of container service readiness. Container will be removedfrom service endpoints if the probe fails. Cannot be updated. More info:
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
resources #資源設置
Compute Resources required by this container. Cannot be updated. More info:
https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
...省略部分輸出...
volumeMounts #掛載存儲
Pod volumes to mount into the container's filesystem. Cannot be updated.
workingDir
Container's working directory. If not specified, the container runtime's
default will be used, which might be configured in the container image.
Cannot be updated.
關于explain內容解釋說明
表示后面接一個字符串
表示后面是一個列表的對象,列表需要以-開始,且可以寫多個
表示一個對象,對象內部包含多個屬性
如繼續上面的內容,如果需要查看resource資源定義,可以通過explain pods.spec.containers.resource來查看具體的使用方法。
通過上面兩個工具的介紹,平時在日常工作中找到編寫yaml文件部署應用的地圖,建議手工多寫幾次,注意語法鎖進,多寫幾次就熟悉了。Pod中設計到有很多的特性,如資源分配,健康檢查,存儲掛載等(參考附錄文章),后續我們做詳細介紹,Pod將以Template的方式嵌入到副本控制器如Deployments中。
附錄
容器鏡像介紹:https://kubernetes.io/docs/concepts/containers/images/
Pod介紹:https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/
Resource限定內存資源:https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/
Resource限定CPU資源:https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/
Pod掛載存儲:https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/
Pod配置健康檢查:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
往期文章
Kubernetes部署篇
Kubernetes 1.18.2集群部署 (單Master)+docker—kubeadm方式
Kubernetes 1.18.2集群部署 (多Master)+docker—kubeadm方式
Kubernetes 1.18.2集群部署 (多Master)+docker—二進制方式
Kubernetes 1.18.2集群部署 (單Master)+docker—shell腳本方式
Kubernetes 1.19.0集群部署 (多Master)+docker—kubeadm方式
Kubernetes 1.19.0集群部署 (多Master)+docker—二進制方式
Kubernetes 一條命令快速部署 Kubernetes 高可用集群—sealos
Kubernetes 一條命令快速部署 Kubernetes 高可用集群—kubei
Kubernetes Harbor v2.0.0私有鏡像倉庫部署
Kubernetes Harbor v2.0.2高可用私有鏡像倉庫部署
Kubernetes kubectx/kubens切換context和namespace
Kubernetes?kubeadm更新一個10年有效期的證書
Kubernetes kubeadm初始化kubernetes集群延長證書過期時間
Kubernetes kubeadm升級集群
Kubernetes kubeadm基礎使用
Kubernetes基礎篇
Kubernetes 是什么?
Kubernetes 基礎概念
Kubernetes 從零開始了解
Kubernetes 快速了解Kubernetes
Kubernetes kubectl命令
Kubernetes kubectl常用命令
Kubernetes kubectl常用命令大全
Kubernetes 創建、更新應用
Kubernetes 資源清單
Kubernetes Pod狀態和生命周期管理
Kubernetes Pod?Controller
Kubernetes ReplicaSet Controller
Kubernetes Deployment Controller
Kubernetes DamonSet Controller
Kubernetes Job、CronJob?Controller
Kubernetes HPA Controller
Kubernetes HPA Controller 使用詳解
Kubernetes KEDA基于Kubernetes事件驅動的自動縮放
Kubernetes 服務發現—Service
Kubernetes 內部服務發現—Coredns
Kubernetes 外部服務發現—Traefik ingress
Kubernetes 外部服務發現—Nginx Ingress Controller
Kubernetes 存儲卷—Volumes
Kubernetes?存儲卷—部署NFS服務器,供給靜態pv和動態pv
Kubernetes 存儲卷—PV和PVC的狀態變化
Kubernetes 特殊存儲卷—Secret和ConfigMap
Kubernetes StatefulSet Controller
Kubernetes 認證、授權和準入控制
Kubernetes dashboard認證訪問-更新
Kubernetes 網絡模型和網絡策略
Kubernetes 網絡原理解析
Kubernetes 網絡插件-flannel
Kubernetes 網絡插件-calico
Kubernetes Pod資源調度
Kubernetes 資源指標和集群監控
Kubernetes 容器云平臺技術落地方案
Kubernetes v1.19.0 正式發布
Kubernetes Ratel自動生成yaml文件
Kubernetes 部署策略詳解
Kubernetes 集群規模應該有多大?
Kubernetes 集群備份/恢復velero實戰
Kubernetes 集群備份/恢復etcd數據實戰
Kubernetes基礎篇—Kubernetes?原理剖析與實戰應用
Kubernetes 如何深入掌握 Kubernetes
Kubernetes 如何火起來的
Kubernetes 架構為什么是這樣的
Kubernetes 集群搭建
Kubernetes 是如何搞定“不可變基礎設施”的
Kubernetes Pod:最小調度單元的使用進階及實踐
Kubernetes 無狀態應用:剖析K8S業務副本及水平擴展底層原理
Kubernetes 有狀態應用:K8S如何通過 StatefulSet 支持有狀態應用
Kubernetes 配置管理:K8S管理業務配置方式有哪些
Kubernetes 存儲類型:如何挑選合適的存儲插件
Kubernetes 存儲管理:怎樣對業務數據進行持久化存儲
Kubernetes基礎篇—Kubernetes 入門到實戰
Kubernetes 入門到實戰(一)俯瞰kubernetes全貌
Kubernetes 入門到實戰(二)kubeadm部署kubernetes集群
Kubernetes 入門到實戰(三)kubernetes快速入門
Kubernetes 入門到實戰(四)kubernetes dashboard圖形界面
Kubernetes應用部署篇
Kubernetes 部署WordPress博客
Kubernetes 部署Nginx+php-fpm+MySQL并運行Discuz
Kubernetes 使用StatefulSet部署MySQL高可用集群
Kubernetes 使用StatefulSet部署MongoDB高可用集群
Kubernetes 包管理工具—Helm2.13安裝和使用
Kubernetes Helm2部署gitlab私有代碼倉庫
Kubernetes Helm2部署MySQL數據庫
Kubernetes 包管理工具—Helm3.3安裝和使用
Kubernetes Helm3部署MySQL數據庫
Kubernetes Helm3部署kubernetes-dashboard
Kubernetes Helm3部署nginx-ingress ?NodePort方式
Kubernetes Helm3部署nginx-ingress ?LoadBalancer方式
Kubernetes監控篇
Kubernetes 部署Prometheus+Grafana+Alertmanager監控告警系統
Kubernetes Prometheus監控Nginx
Kubernetes Prometheus監控MySQL
Kubernetes Prometheus監控tomcat
Kubernetes 部署kube-prometheus監控告警系統
Kubernetes kube-prometheus中添加自定義監控項-監控etcd
Kubernetes kube-prometheus監控指標targets
Kubernetes kube-prometheus配置kubernetes-cadvisor服務自動發現
Kubernetes kube-prometheus Configuration信息
Kubernetes kube-prometheus中添加自定義監控項-監控MySQL
Kubernetes Grafana匿名登錄/密碼登錄Kubernetes
Kubernetes Grafana遷移(導出導入)dashboard
Kubernetes Grafana數據持久化
Kubernetes日志篇
Kubernetes 使用Elastic Stack構建Kubernetes全棧監控
Kubernetes 日志架構
Kubernetes 使用 Loki 進行日志監控和報警
Kubernetes故障排除篇
Kubernetes 刪除namespace時卡在Terminating狀態
Kubernetes deploy,rs,sts Mismatch 的處理
Kubernetes master機器文件系統故障恢復過程
Kubernetes 如何修改容器時間而不改變宿主機時間?
Kubernetes面試問題篇
Kubernetes IT運維面試問題總結-簡述Etcd、Kubernetes、Lvs、HAProxy等
Kubernetes 50個必須了解的Kubernetes面試問題
Kubernetes 面試題匯總1
Kubernetes 面試題匯總2
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis延迟队列 如何确保成功消费_千
- 下一篇: 一元二次方程abc决定什么_你知道什么是