• Pod入门与实战


    1 pod介绍

    a 定义
    Pod是K8s运行的基本单位。
    Pod与容器关系:
    Pod ===虚拟机
    容器 === 进程

    关系也是一对多的关系。
    2 Pod与容器关系
    两种用法:1 一个Pod一个容器; 2 一个Pod多个容器(高级用法)
    一些Pod有init容器和应用容器。在应用程序容器启动前,运行初始化容器。
    在这里插入图片描述

    2 pod与资源

    2.1 网络

    Pod是有IP地址的,每个Pod都会被分配一个唯一IP地址(IP地址靠网络插件calico,flannel,weave等分配);
    Pod中的容器共享网络名称空间(包括IP地址和网络断开)。
    Pod内部通信Pod内部的容器相互间用localhost通信;
    Pod外的容器通信Pod中的容器通过calico与其它结点pod通信。

    2.2 存储

    Pod中容器可共享卷,也可以单独数据卷;
    常见的存储卷:PVC,Ceph,glusterfs,NFS等

    2.3 cpu

    Pod与cpu关系后续详解,例如cpu亲和性等

    3 pod的工作方式

    Pod的工作方式主要分为两种,一种命令行方式,一种yaml方式;工业生成中命令行一般不采用,而是采用yaml的方式。yaml方式又分为两种一种自助式,一种控制器方式;常见的是采用yaml并采用控制器方式。

    3.1 命令行方式

    kubectl run tomcat --image=xianchao/tomcat-8.5-jre8:v1 --image-pull-policy=‘IfNotPresent’ --port=8080 一般不采用

    3.2 yaml方式

    4 yaml的两种方式

    4.1 自主式方式

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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,都是控制器管理的。

    4.2 控制器方式

    常见的控制器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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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始终维持在指定副本数量

    5 pod原理

    5.1 创建框架图

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

    5.2 创建具体流程

    创建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。

    6 资源清单编写技巧

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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

    7 总结

    主要介绍pod定义,容器的关系;pod相关的网络,存储,亲和性资源相关;pod常见的工作方式;yaml的工作方式;pod创建原理与流程;一个简单的资源清单编写。

  • 相关阅读:
    python数据库连接池的正确用法
    以智能化为舵手,引领现代计算机系统架构新航向
    Android学习笔记 39. 网络加载框架Retrofit中的转换器和适配器
    如何保护数据安全?企业该从部署SSL证书开始
    八、【React拓展】错误边界
    【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
    【Python自学笔记】报错No module Named Wandb
    C语言中文网 - Shell脚本 - 7
    MySQL 排名函数 RANK, DENSE_RANK, ROW_NUMBER
    快速熟悉Docker的一些基本操作流程
  • 原文地址:https://blog.csdn.net/u011744843/article/details/126191694