8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod
作者:Happy老師
鏈接:https://blog.51cto.com/happylab/2500457寫在前面
前面的系列文章已介紹kubernetes架構(gòu),安裝,升級(jí)和快速入門,讀者通過文章的實(shí)操已對(duì)kubernetes已有初步的認(rèn)識(shí)和理解,從本章開始逐步介紹kubernetes中的基礎(chǔ)概念概念和核心概念,基礎(chǔ)概念包括:namespace,labels,annotations,pods,volumes等;核心概念包含kubernetes中各種controller,包含以下幾種:
應(yīng)用副本控制器:ReplicaSets,Deployments,DaemonSets,StatefulSets;
批處理任務(wù)控制器: Jobs和CronJob
存儲(chǔ)控制器: PersistentVoloume,PersistentVolumeClaim,StorageClass;
服務(wù)負(fù)載均衡: Service,Ingress,NetworkPolicy和DNS名稱解析;
配置和密鑰: ConfigMaps和Secrets
本文從最基礎(chǔ)的概念pod開始講解,后續(xù)逐步介紹應(yīng)用部署,存儲(chǔ),負(fù)載均衡等相關(guān)的控制器,kubernetes內(nèi)部由多個(gè)不同的控制器組成,每個(gè)控制器完成不同的功能。
1. 深入學(xué)習(xí)pod
1.1 Container和Pod概念
容器是一種便攜式,輕量級(jí)別的容器虛擬化技術(shù),使用linux cggroup技術(shù)實(shí)現(xiàn)各種資源的隔離,如cpu,memory,pid,mount,IPC等,相比于虛擬化技術(shù)如KVM,容器技術(shù)更加輕量級(jí),它的產(chǎn)生主要解決環(huán)境的環(huán)境發(fā)布的問題,目前主流的容器技術(shù)是docker,說到容器,一般都等同于docker。
要運(yùn)行容器首先需要有鏡像,應(yīng)用和應(yīng)用依賴的環(huán)境運(yùn)行在容器中,在kubernetes中不會(huì)直接運(yùn)行container,而是運(yùn)行pod,一個(gè)pod里面包含多個(gè)container,container之間共享相同的namespace,network,storage等。鏡像存儲(chǔ)在私有鏡像或者公有鏡像中,運(yùn)行時(shí)通過docker image pull的方式拉取到本地運(yùn)行,images的拉取策略包含有兩種:
ImagePullPolicy為Always,不管本地是否有直接下載
ImagePullPolicy為IfNotPresent,默認(rèn)鏡像拉取得策略,本地不存在再拉取
Pods是kubernetes中最小的調(diào)度單位,Pods內(nèi)運(yùn)行一個(gè)或者多個(gè)container,container之間共享pod的網(wǎng)絡(luò)ip資源,存儲(chǔ)volume資源,計(jì)算等資源,方便pod內(nèi)部的container之間能夠?qū)崿F(xiàn)快速的訪問和交互。
如上圖所示,Pod的使用方式通常包含兩種:
Pod中運(yùn)行一個(gè)容器,最經(jīng)常使用的模式,container封裝在pod中調(diào)度,兩者幾乎等同,但k8s不直接管理容器
Pod中運(yùn)行多個(gè)容器,多個(gè)容器封裝在pod中一起調(diào)度,適用于容器之間有數(shù)據(jù)交互和調(diào)用的場(chǎng)景,如app+redis,pod內(nèi)部共享相同的網(wǎng)絡(luò)命名空間,存儲(chǔ)命名空間,進(jìn)程命名空間等。
1.2 如何創(chuàng)建pod
kubernetes交互的方式通常分為四種:
命令行,kubectl和kubernetes交互,完成資源的管理,命令行入門簡(jiǎn)單,但只能支持部分資源創(chuàng)建
API,通過resfulAPI以http的方式和kubernetes交互,適用于基于API做二次開發(fā)
SDK,提供各種語言原生的SDK,實(shí)現(xiàn)各種語言編程接入
YAML,通過易于理解的YAML文件格式,描述資源的定義,功能最豐富,最終轉(zhuǎn)換為json格式
kubernetes中通過定義生申明式的方式定義資源,即通過在yaml文件中定義所需的資源,kubernetes通過controller-manager按照yaml文件中定義的資源去生成所需的資源(match the current state to desired state)。通常在kubernetes中通過yaml文件的方式定義資源,然后通過kubectl create -f 文件.yaml的方式應(yīng)用配置,如下演示創(chuàng)建一個(gè)nginx應(yīng)用的操作。
1、編寫yaml文件,定義一個(gè)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
關(guān)于配置文件,說明如下:
apiVersion api使用的版本,kubectl api-versions可查看到當(dāng)前系統(tǒng)能支持的版本列表
kind 指定資源類型,表示為Pod的資源類型
metadata 指定Pod的元數(shù)據(jù),metadata.name指定名稱,metadata.labels指定Pod的所屬的標(biāo)簽
spec 指定Pod的模版屬性,spec.containers配置容器的信息,spec.containers.name指定名字,spec.containers.image指定容器鏡像的名稱,spec.containers.imagePullPolicy是鏡像的下載方式,IfNotPresent表示當(dāng)鏡像不存在時(shí)下載,spec.containers.ports.name指定port的名稱,spec.containers.ports.protocol協(xié)議類型為TCP,spec.containers.ports.containerPort為容器端口。
2、創(chuàng)建pod應(yīng)用
[root@node-1 demo]# kubectl apply -f nginx.yamlpod/nginx-demo created
3、訪問應(yīng)用
獲取容器的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>
訪問站點(diǎn)內(nèi)容:
[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>
前面我們我們學(xué)習(xí)過kubernetes支持滾動(dòng)升級(jí)RollingUpdate,彈性擴(kuò)容replicas等特性,如何給Pod做滾動(dòng)升級(jí)保障業(yè)務(wù)不中斷,如何提高Pod的副本個(gè)數(shù)保障高可用呢?答案是:不支持。Pod是單個(gè),無法支持一些高級(jí)特性,高級(jí)特性需要通過高級(jí)的副本控制器如ReplicaSets,Deployments,StatefulSets,DaemonSets等才能支持。Pod在實(shí)際應(yīng)用中很少用,除了測(cè)試和運(yùn)行一些簡(jiǎn)單的功能外,實(shí)際使用建議使用Deployments代替,Pod的定義以Template的方式嵌入在副本控制器中。
1.3. 如何編寫yaml文件
前面我們提到過kubernetse是申明式的方式部署應(yīng)用,應(yīng)用的部署都定義在yaml文件中來實(shí)現(xiàn),如何來編寫應(yīng)用的yaml文件呢,下面我來分享兩個(gè)實(shí)際使用的技巧:
1、通過定義模版快速生成,kubectl create apps -o yaml --dry-run的方式生成,--dry-run僅僅是試運(yùn)行,并不實(shí)際在k8s集群中運(yùn)行,通過指定-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命令堪稱是語法查詢器,可以查到每個(gè)字段的含義,使用說明和使用方式,如想要查看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 #命令參數(shù)
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 #資源設(shè)置
Compute Resources required by this container. Cannot be updated. More info:
https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
...省略部分輸出...
volumeMounts #掛載存儲(chǔ)
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.
關(guān)于explain內(nèi)容解釋說明
表示后面接一個(gè)字符串
表示后面是一個(gè)列表的對(duì)象,列表需要以-開始,且可以寫多個(gè)
表示一個(gè)對(duì)象,對(duì)象內(nèi)部包含多個(gè)屬性
如繼續(xù)上面的內(nèi)容,如果需要查看resource資源定義,可以通過explain pods.spec.containers.resource來查看具體的使用方法。
通過上面兩個(gè)工具的介紹,平時(shí)在日常工作中找到編寫yaml文件部署應(yīng)用的地圖,建議手工多寫幾次,注意語法鎖進(jìn),多寫幾次就熟悉了。Pod中設(shè)計(jì)到有很多的特性,如資源分配,健康檢查,存儲(chǔ)掛載等(參考附錄文章),后續(xù)我們做詳細(xì)介紹,Pod將以Template的方式嵌入到副本控制器如Deployments中。
附錄
容器鏡像介紹:https://kubernetes.io/docs/concepts/containers/images/
Pod介紹:https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/
Resource限定內(nèi)存資源: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掛載存儲(chǔ):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—二進(jìn)制方式
Kubernetes 1.18.2集群部署 (單Master)+docker—shell腳本方式
Kubernetes 1.19.0集群部署 (多Master)+docker—kubeadm方式
Kubernetes 1.19.0集群部署 (多Master)+docker—二進(jìn)制方式
Kubernetes 一條命令快速部署 Kubernetes 高可用集群—sealos
Kubernetes 一條命令快速部署 Kubernetes 高可用集群—kubei
Kubernetes Harbor v2.0.0私有鏡像倉庫部署
Kubernetes Harbor v2.0.2高可用私有鏡像倉庫部署
Kubernetes kubectx/kubens切換context和namespace
Kubernetes?kubeadm更新一個(gè)10年有效期的證書
Kubernetes kubeadm初始化kubernetes集群延長(zhǎng)證書過期時(shí)間
Kubernetes kubeadm升級(jí)集群
Kubernetes kubeadm基礎(chǔ)使用
Kubernetes基礎(chǔ)篇
Kubernetes 是什么?
Kubernetes 基礎(chǔ)概念
Kubernetes 從零開始了解
Kubernetes 快速了解Kubernetes
Kubernetes kubectl命令
Kubernetes kubectl常用命令
Kubernetes kubectl常用命令大全
Kubernetes 創(chuàng)建、更新應(yīng)用
Kubernetes 資源清單
Kubernetes Pod狀態(tài)和生命周期管理
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事件驅(qū)動(dòng)的自動(dòng)縮放
Kubernetes 服務(wù)發(fā)現(xiàn)—Service
Kubernetes 內(nèi)部服務(wù)發(fā)現(xiàn)—Coredns
Kubernetes 外部服務(wù)發(fā)現(xiàn)—Traefik ingress
Kubernetes 外部服務(wù)發(fā)現(xiàn)—Nginx Ingress Controller
Kubernetes 存儲(chǔ)卷—Volumes
Kubernetes?存儲(chǔ)卷—部署NFS服務(wù)器,供給靜態(tài)pv和動(dòng)態(tài)pv
Kubernetes 存儲(chǔ)卷—PV和PVC的狀態(tài)變化
Kubernetes 特殊存儲(chǔ)卷—Secret和ConfigMap
Kubernetes StatefulSet Controller
Kubernetes 認(rèn)證、授權(quán)和準(zhǔn)入控制
Kubernetes dashboard認(rèn)證訪問-更新
Kubernetes 網(wǎng)絡(luò)模型和網(wǎng)絡(luò)策略
Kubernetes 網(wǎng)絡(luò)原理解析
Kubernetes 網(wǎng)絡(luò)插件-flannel
Kubernetes 網(wǎng)絡(luò)插件-calico
Kubernetes Pod資源調(diào)度
Kubernetes 資源指標(biāo)和集群監(jiān)控
Kubernetes 容器云平臺(tái)技術(shù)落地方案
Kubernetes v1.19.0 正式發(fā)布
Kubernetes Ratel自動(dòng)生成yaml文件
Kubernetes 部署策略詳解
Kubernetes 集群規(guī)模應(yīng)該有多大?
Kubernetes 集群備份/恢復(fù)velero實(shí)戰(zhàn)
Kubernetes 集群備份/恢復(fù)etcd數(shù)據(jù)實(shí)戰(zhàn)
Kubernetes基礎(chǔ)篇—Kubernetes?原理剖析與實(shí)戰(zhàn)應(yīng)用
Kubernetes 如何深入掌握 Kubernetes
Kubernetes 如何火起來的
Kubernetes 架構(gòu)為什么是這樣的
Kubernetes 集群搭建
Kubernetes 是如何搞定“不可變基礎(chǔ)設(shè)施”的
Kubernetes Pod:最小調(diào)度單元的使用進(jìn)階及實(shí)踐
Kubernetes 無狀態(tài)應(yīng)用:剖析K8S業(yè)務(wù)副本及水平擴(kuò)展底層原理
Kubernetes 有狀態(tài)應(yīng)用:K8S如何通過 StatefulSet 支持有狀態(tài)應(yīng)用
Kubernetes 配置管理:K8S管理業(yè)務(wù)配置方式有哪些
Kubernetes 存儲(chǔ)類型:如何挑選合適的存儲(chǔ)插件
Kubernetes 存儲(chǔ)管理:怎樣對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行持久化存儲(chǔ)
Kubernetes基礎(chǔ)篇—Kubernetes 入門到實(shí)戰(zhàn)
Kubernetes 入門到實(shí)戰(zhàn)(一)俯瞰kubernetes全貌
Kubernetes 入門到實(shí)戰(zhàn)(二)kubeadm部署kubernetes集群
Kubernetes 入門到實(shí)戰(zhàn)(三)kubernetes快速入門
Kubernetes 入門到實(shí)戰(zhàn)(四)kubernetes dashboard圖形界面
Kubernetes應(yīng)用部署篇
Kubernetes 部署WordPress博客
Kubernetes 部署Nginx+php-fpm+MySQL并運(yùn)行Discuz
Kubernetes 使用StatefulSet部署MySQL高可用集群
Kubernetes 使用StatefulSet部署MongoDB高可用集群
Kubernetes 包管理工具—Helm2.13安裝和使用
Kubernetes Helm2部署gitlab私有代碼倉庫
Kubernetes Helm2部署MySQL數(shù)據(jù)庫
Kubernetes 包管理工具—Helm3.3安裝和使用
Kubernetes Helm3部署MySQL數(shù)據(jù)庫
Kubernetes Helm3部署kubernetes-dashboard
Kubernetes Helm3部署nginx-ingress ?NodePort方式
Kubernetes Helm3部署nginx-ingress ?LoadBalancer方式
Kubernetes監(jiān)控篇
Kubernetes 部署Prometheus+Grafana+Alertmanager監(jiān)控告警系統(tǒng)
Kubernetes Prometheus監(jiān)控Nginx
Kubernetes Prometheus監(jiān)控MySQL
Kubernetes Prometheus監(jiān)控tomcat
Kubernetes 部署kube-prometheus監(jiān)控告警系統(tǒng)
Kubernetes kube-prometheus中添加自定義監(jiān)控項(xiàng)-監(jiān)控etcd
Kubernetes kube-prometheus監(jiān)控指標(biāo)targets
Kubernetes kube-prometheus配置kubernetes-cadvisor服務(wù)自動(dòng)發(fā)現(xiàn)
Kubernetes kube-prometheus Configuration信息
Kubernetes kube-prometheus中添加自定義監(jiān)控項(xiàng)-監(jiān)控MySQL
Kubernetes Grafana匿名登錄/密碼登錄Kubernetes
Kubernetes Grafana遷移(導(dǎo)出導(dǎo)入)dashboard
Kubernetes Grafana數(shù)據(jù)持久化
Kubernetes日志篇
Kubernetes 使用Elastic Stack構(gòu)建Kubernetes全棧監(jiān)控
Kubernetes 日志架構(gòu)
Kubernetes 使用 Loki 進(jìn)行日志監(jiān)控和報(bào)警
Kubernetes故障排除篇
Kubernetes 刪除namespace時(shí)卡在Terminating狀態(tài)
Kubernetes deploy,rs,sts Mismatch 的處理
Kubernetes master機(jī)器文件系統(tǒng)故障恢復(fù)過程
Kubernetes 如何修改容器時(shí)間而不改變宿主機(jī)時(shí)間?
Kubernetes面試問題篇
Kubernetes IT運(yùn)維面試問題總結(jié)-簡(jiǎn)述Etcd、Kubernetes、Lvs、HAProxy等
Kubernetes 50個(gè)必須了解的Kubernetes面試問題
Kubernetes 面試題匯總1
Kubernetes 面試題匯總2
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis延迟队列 如何确保成功消费_千
- 下一篇: 一元二次方程abc决定什么_你知道什么是