a 定义
Pod是K8s运行的基本单位。
Pod与容器关系:
Pod ===虚拟机
容器 === 进程
关系也是一对多的关系。
2 Pod与容器关系
两种用法:1 一个Pod一个容器; 2 一个Pod多个容器(高级用法)
一些Pod有init容器和应用容器。在应用程序容器启动前,运行初始化容器。
Pod是有IP地址的,每个Pod都会被分配一个唯一IP地址(IP地址靠网络插件calico,flannel,weave等分配);
Pod中的容器共享网络名称空间(包括IP地址和网络断开)。
Pod内部通信Pod内部的容器相互间用localhost通信;
Pod外的容器通信Pod中的容器通过calico与其它结点pod通信。
Pod中容器可共享卷,也可以单独数据卷;
常见的存储卷:PVC,Ceph,glusterfs,NFS等
Pod与cpu关系后续详解,例如cpu亲和性等
Pod的工作方式主要分为两种,一种命令行方式,一种yaml方式;工业生成中命令行一般不采用,而是采用yaml的方式。yaml方式又分为两种一种自助式,一种控制器方式;常见的是采用yaml并采用控制器方式。
kubectl run tomcat --image=xianchao/tomcat-8.5-jre8:v1 --image-pull-policy=‘IfNotPresent’ --port=8080 一般不采用
a 资源清单编写:pod-tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat-test
namespace: default
labels:
app: tomcat
spec:
containers:
- name: tomcat-java
ports:
- containerPort: 8080
image: xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent
b node结点导入镜像
将xianchao-tomcat.tar.gz上传liaowennode1和liaowennode2结点
执行如下操作:
docker load -i xianchao-tomact.tar.gz
c 更新资源清单:
kubectl apply -f pod-tomcat.yaml
d查看pod是否创建成功
kubectl get pods -o wide -l app=tomcat
wide: 详细信息 -l:标签
自主式pod存在问题,假如我们不小心删除了pod;例如
采用kubectl delete pods tomcat-test
如果直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,所以今后我们接触的Pod,都是控制器管理的。
常见的控制器Replicaset,Deployment,Job,CronJob,DaemonSet,StatefulSet等;常用的大概就Replicaset,Deployment。
a 编写资源清单nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
labels:
app: nginx-deploy
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: xianchao/nginx:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
b 更新资源清单文件
kubectl apply -f nginx-deploy.yaml
c 查看Deployment
kubectl get deploy -l app=nginx-deploy
c 查看Replicaset
kubectl get rs -l app=nginx
d 查看pod
kubectl get pods -o wide -l app=nginx
e 删除nginx-test-75c685fdb7-fwpsq这个pod
kubectl delete pods nginx-test-75c685fdb7-fwpsq
d 查看pod
#发现重新创建一个新的pod是nginx-test-75c685fdb7-wchpx
通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量
k8s创建Pod流程
Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。例如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个container的pod。
创建pod具体过程图:
master节点:kubectl–>kube-api—>kubelet–>CRI容器环境初始化
第一步:
客户端提交创建Pod请求,可以通过调用Api Server的Rest Api接口,也可以通过kubectl命令工具。如kubectl apply -f filename.yaml(资源清单)
第二步:
apiserver接收到pod创建请求后,会将yaml中的属性信息(metadata)写入etcd.
第三步:
apiserver触发watch机制准备创建pod,信息转发给调度器scheduler,调度器使用调度算法选择node,调度器将node信息给apiserver,apiserver将绑定的node信息写入etcd。
第四步:
apiserver又通过watch机制,调用kubelet,指定pod信息,调用Docker API创建并启动pod内的容器
第五步:
创建完成之后反馈给kubelet,kubelet又将pod的状态信息给apiserver,apiserver将pod的状态信息写入etcd。
a 查看定义Pod资源包含字段
命令:kubectl explain
例如 kubectl explain pod(也可以是其它的名字)
kubectl explain pod.metadata
b 编写一个资源清单,第一个pod
apiVersion: v1
kind: Pod
metadata:
name: pod-first
namespace: default
labels:
app: tomcat-pod-first
spec:
containers:
- name: tomcat-first
ports:
- containerPort: 8080
image: xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent
c 导入镜像
将xianchao-tomcat.tar.gz上传到liaowennode1和liaowennode2结点,手动解压,分别
docker load -i xianchao-tomcat.tar.gz
d 更新资源清单
kubectl apply -f pod-frist.yaml
e 查看pod是否创建成功
kubectl get pods -o wide -l app= tomcat-pod-first
查看pod日志
kubectl logs pod-first
查看pod里指定容器的日志
kubectl logs pod-first -c tomcat-first
进入到刚才创建的pod,刚才创建的pod名字是web
kubectl exec -it pod-first – /bin/bash
#假如pod里有多个容器,进入到pod里的指定容器,按如下命令:
kubectl exec -it pod-first -c tomcat-first – /bin/bash
主要介绍pod定义,容器的关系;pod相关的网络,存储,亲和性资源相关;pod常见的工作方式;yaml的工作方式;pod创建原理与流程;一个简单的资源清单编写。