03-pod入门知识讲解

一,k8s核心资源pod介绍

1,pod是什么

K8s 官方文档:https://kubernetes.io/ 
K8s 中文官方文档: https://kubernetes.io/zh/ 
K8s Github 地址:https://github.com/kubernetes/kubernetes

pod是什么?
官方文档:https://kubernetes.io/docs/concepts/workloads/pods/

Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。

image

Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。

白话解释:
可以把pod看成是一个“豌豆荚”,里面有很多“豆子”(容器)。一个豌豆荚里的豆子,它们吸收着共同的营养成分、肥料、水分等,Pod和容器的关系也是一样,Pod里面的容器共享pod的网络、存储等。

image

pod相当于一个逻辑主机--比方说我们想要部署一个tomcat应用,如果不用容器,我们可能会部署到物理机、虚拟机或者云主机上,那么出现k8s之后,我们就可以定义一个pod资源,在pod里定义一个把tomcat容器,所以pod充当的是一个逻辑主机的角色。

2,pod工作方式

在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建Pod(不常用)。

所谓的自主式Pod,就是直接定义一个Pod资源,如下:

[root@xiaobomaster1 ~]# vim 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: xiaobo/tomcat-8.5-jre8:v1
    imagePullPolicy: IfNotPresent
    
#导入镜像:
把xiaobo-tomcat.tar.gz上传到xiaobonode1节点,手动解压:
[root@xiaobonode1 ~]# docker load -i xiaobo-tomcat.tar.gz  

#更新资源清单文件
[root@xiaobomaster1 ~]# kubectl apply -f pod-tomcat.yaml 

#查看pod是否创建成功
[root@xiaobomaster1 ~]# kubectl get pods -o wide -l app=tomcat 
NAME          READY   STATUS       IP              NODE            
tomcat-test  1/1     Running   10.244.121.45   xiaobonode1   

但是自主式Pod是存在一个问题的,假如我们不小心删除了pod:
[root@xiaobomaster1 ~]# kubectl delete pods tomcat-test

#查看pod是否还在
[root@xiaobomaster1 ~]# kubectl get pods -l app=tomcat 

#结果是空,说明pod已经被删除了

通过上面可以看到,如果直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,所以今后我们接触的Pod,都是控制器管理的。
#控制器管理的Pod
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。如,通过Deployment管理Pod

#解压镜像:
把xiaobo-nginx.tar.gz上传到xiaobonode1节点
[root@xiaobonode1 ~]# docker load -i xiaobo-nginx.tar.gz #创建一个资源清单文件
[root@xiaobomaster1 ~]# vim nginx-deploy.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: xiaobo/nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

#更新资源清单文件
[root@xiaobomaster1 ~]# kubectl apply -f nginx-deploy.yaml

#查看Deployment
[root@xiaobomaster1 ~]# kubectl get deploy -l app=nginx-deploy 
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-test   2/2   2            2           16s

#查看Replicaset
[root@xiaobomaster1 ~]# kubectl get rs -l app=nginx

#查看pod
[root@xiaobomaster1 ~]# kubectl get pods -o wide -l app=nginx

#删除nginx-test-75c685fdb7-9s95h这个pod
[root@xiaobomaster1 ~]# kubectl delete pods nginx-test-75c685fdb7-9s95h
[root@xiaobomaster1 ~]# kubectl get pods -o wide -l app=nginx

#发现重新创建一个新的pod是nginx-test-75c685fdb7-pr8gh
通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量

二,如何创建一个pod资源

K8s创建Pod流程

image

Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。例如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个container的pod。

创建pod流程:

image

master节点:kubectl -> kube-api -> kubelet -> CRI容器环境初始化

第一步:
客户端提交创建Pod的请求,可以通过调用APIServer的RestAPI接口,也可以通过kubectl命令行工具。如kubectl apply -f filename.yaml(资源清单文件)

第二步:
apiserver接收到pod创建请求后,会将yaml中的属性信息(metadata)写入etcd。

第三步:
apiserver触发watch机制准备创建pod,信息转发给调度器scheduler,调度器使用调度算法选择node,调度器将node信息给apiserver,apiserver将绑定的node信息写入etcd,调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。

scheduler 查看k8s api ,类似于通知机制。首先判断:pod.spec.Node == null?若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node。然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)

ps:同样上述操作的各种信息也要写到etcd数据库中中

第四步:
apiserver又通过watch机制,调用kubelet,指定pod信息,调用Docker API创建并启动pod内的容器。

第五步:
创建完成之后反馈给kubelet, kubelet又将pod的状态信息给apiserver,apiserver又将pod的状态信息写入etcd。

1,资源清单yaml的书写技巧

[root@xiaobomaster1 ~]# vim pod-tomcat.yaml
apiVersion: v1  #api版本
kind: Pod     #创建的资源
metadata:
  name: tomcat-test  #Pod的名字
  namespace: default  #Pod所在的名称空间
  labels:
    app:  tomcat  #Pod具有的标签
spec:
  containers:
  - name:  tomcat-java  #Pod里容器的名字
    ports:
    - containerPort: 8080  #容器暴露的端口
    image: xiaobo/tomcat-8.5-jre8:v1  #容器使用的镜像
    imagePullPolicy: IfNotPresent  #镜像拉取策略

#更新资源清单文件
[root@xiaobomaster1 ~]# kubectl apply -f pod-tomcat.yaml 

#Pod资源清单编写技巧
通过kubectlexplain查看定义Pod资源包含哪些字段。
[root@xiaobomaster1 ~]# kubectl explain pod
[APIVersion定义了对象,代表了一个版本。]
[Kind是字符串类型的值,代表了要创建的资源。服务器可以从客户端提交的请求推断出这个资源。]
[metadata是对象,定义元数据属性信息的]
[spec制定了定义Pod的规格,里面包含容器的信息]
[status表示状态,这个不可以修改,定义pod的时候也不需要定义这个字段]

#查看pod.metadata字段如何定义
[root@xiaobomaster1 ~]# kubectl explain pod.metadata 

2,通过资源清单文件创建第一个Pod

[root@xiaobomaster1 ~]# vim pod-first.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  namespace: default
  labels:
    app: tomcat-pod-first
spec:
  containers:
  - name: tomcat-first
    ports:
    - containerPort: 8080
    image: xiaobo/tomcat-8.5-jre8:v1
    imagePullPolicy: IfNotPresent
  - name: nginx-first
    ports:
    - containerPort: 8080
    image: xiaobo/nginx:v1
    imagePullPolicy: IfNotPresent

#更新资源清单文件
[root@xiaobomaster1 ~]# kubectl apply -f pod-first.yaml 

#查看pod是否创建成功
[root@xiaobomaster1 ~]# kubectl get pods -o wide -l app=tomcat-pod-first      

#查看pod日志
kubectl logs pod-first

#查看pod里指定容器的日志
kubectl logs pod-first  -ctomcat-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创建一个应用程序,如果pod出现故障停掉,那么我们通过pod部署的应用也就会停掉,不安全,还有一种控制器管理的pod,通过控制器创建pod,可以对pod的生命周期做管理,可以定义pod的副本数,如果有一个pod意外停掉,那么会自动起来一个pod替代之前的pod,之后会讲解pod的控制器

3,通过kubectlrun创建Pod

kubectl run tomcat--image=xiaobo/tomcat-8.5-jre8:v1 --image-pull-policy='IfNotPresent' --port=8080
posted @ 2024-12-03 12:37  于景波  阅读(538)  评论(0)    收藏  举报