深入剖析Kubernetes

Docker容器

进程

核心技术

Namespace做隔离,Cgroups做限制,rootfs做文件系统

Kubernets

操作系统

Pod

容器设计模式,一组共享了某些资源的容器,Pod里的所有容器,共享同一个Network Namespace,并且可以声明共享同一个Volume

Pod的三个重要字段

Metadata

Spec

pod.status.phase

Pod对象在Kubernetes中的生命周期
  1. Pending:Pod的YAML文件已经提交给了Kubernetes,API对象已经创建并保存在Etcd中,但是,Pod中有些容器未顺利创建
  2. Running:Pod调度成功,已经和具体Node绑定,包含的容器都创建成功,并且至少有一个正在运行中
  3. Succeeded:Pod中所有容器正常运行完毕,并且已经退出,如一次性任务
  4. Failed:Pod至少有一个容器以不正常的状态退出
  5. Unknown:Pod的状态不能持续地被kubelet(负责维护节点上的Pod并确保容器健康运行)汇报给kube-apiserver(负责处理接受请求工作),可能主存节点通信异常
  6. Evicted:于系统内存或硬盘资源不足,可df-h查看docker存储所在目录的资源使用情况,如果百分比大于85%,就要及时清理下资源
  7. CrashLoopBackOff:容器曾经启动,但又异常退出
  8. Error:Pod启动过程中发生错误
基础配置
# 版本号
apiVersion: v1
# 资源类型,如Pod
kind: Pod
# 元数据
metadata:
  # Pod名称
  name: nginx-demo1
  # Pod所属的命名空间
  namespace: string
  # 自定义标签
  labels:
    app: nginx
  # 自定义注释列表
  annotations:
    -name: string
Pod级别配置

调度、网络、存储、安全等

nodeSelector:是一个供用户将Pod与Node进行绑定的字段

nodeName:一旦Pod该字段赋值,Kubernetes项目就会认为该Pod已经经过了调度,调度的结果就是赋值的节点名字

hostAliases:定义Pod的hosts文件(比如/etc/hosts)里的内容

shareProcessNamespace:判断pod中的容器是否会共用一个pid namespace,多个容器共享同一进程命名空间

init Container和container: InitContainer相比于Container优先启动,并且按顺序逐一启动,而直到他们都启动并且退出了,用户容器才会启动

...
spec:
  # Pod只能运行在携带了“disktype:ssd”标签的节点上,否则将调度失败
  nodeSelector:
    disktype: ssd
  # 指定pod节点运行在哪个具体node上
  nodeName: node2
  # 修改/etc/hosts内容,这种方式可以避免Pod删除重建自动覆盖修改内容
  # 10.1.2.3 foo.remote
  # 10.1.2.3 bar.remote
  hostAliases:
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  - shareProcessNamespace: true
...
容器级别配置

imagePullPolicy:镜像拉取策略

  1. 默认是Always,即每创建Pod都拉取一次镜像
  2. Nerver,表示Pod永远不会主动拉取镜像
  3. IfNotPresent,表示只有宿主机不存在镜像才拉取

LivenessProbe:容器健康检查,用探针来检查容器是否健康,如果不健康的话会重启容器

...
# Pod中容器的详细定义
spec:
  nodeSelector:
    node: compute
  containers:
  - name: nginx-demo1
    # 副本数量
    replicas: 3
    #容器的镜像名称
    image: nginx:1.8
    # 镜像拉取策略
    imagePullPolicy: [Always | Never | IfNotPresent]
    # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
    command: [string]
    # 容器的启动命令参数列表
    args:
      - /bin/sh
      - -c
      - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    # 探针
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      # 启动5s后进行检查
      initialDelaySeconds: 5
      # 每5s检查一次
      periodSeconds: 5
    # 容器的工作目录
    workingDir: string
    # 容器级别的安全上下文,作用于当前容器
    securityContext:
      # 打开/删除某个内核权限
      capabilities:
        add:
        # 添加可执行iptables命令的权限
        - NET_ADMIN
    # 资源限制和请求的设置
    resources:
      # 资源限制的设置
      limits:
        # cpu的限制,单位为core数
        cpu: string
        # 内存限制,单位可以为Mib/Gib
        memory: string
      # 资源请求的设置
      requests:
        # cpu请求,容器启动的初始可用数量
        cpu: string
        # 内存请求,容器启动的初始可用内存
        memory: string
    # Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
    restartPolicy: [Always | Never | OnFailure]
    # 生命周期
    lifecycle: 
      # 容器启动后,立刻执行一个指定的操作
      postStart: 
        exec: 
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"] 
      # 容器被杀死之前,执行操作,同步命令,会阻塞当前容器的杀死流程
      preStop: 
        exec: 
          command: ["/usr/sbin/nginx","-s","quit"]
    # 需要暴露的端口号
    ports:
    # 端口号名称
    - name: web
      # 容器需要监听的端口号
      containerPort: 80
      # 容器所在主机需要监听的端口号,默认与Container相同
      hostPort: int
      # 端口协议,支持TCP和UDP,默认TCP
      protocol: string
    # 容器运行前需设置的环境变量列表
    env:
    # 环境变量名称/值
    - name: string
      value: string
    # 挂载到容器内部的存储卷配置
    volumeMounts:
    # 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
    - name: test
      # 存储卷在容器内mount的绝对路径,应少于512字符
      mountPath: /var/share/nginx/html
      # 是否为只读模式
      readOnly: boolean
    # 在该pod上定义共享存储卷列表
    volumes:
      # 共享存储卷名称 (volumes类型有很多种)
      - name: test
        # 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
        emptyDir: {}
      - name: test1
        # 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
        hostPath:
          path: /var/data
      - name: test2
        # 类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
        secret:
          scretname: string  
          items:     
          - key: string
            path: string
      - name: test3
        # 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
        configMap:
          name: string
          items:
          - key: string
            path: string
...
volumes(数据存储)

容器共享存储卷,实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储

kubelet创建Pod时,会先创建一个基础容器pause,Pod里面所有的容器共享一个网络名称空间和文件系统。挂载卷的工作就是由基础容器pause来完成的

volumnes比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留

基本存储之EmptyDir、HostPath、NFS
  • EmptyDir
    • EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一 个空目录
    • EmptyDir是在Pod分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录, 当Pod销毁时,EmptyDir中的数据也会被永久删除(EmptyDir与Pod生命周期一致,不适合做数据持久化存储)
    • 用途
      • 临时存储空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留
      • 多容器共享目录,同一个Pod中的不同容器之间共享数据
  • HostPath
    • HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据可以依旧存在于Node主机上
  • NFS
    • HostPath可以解决数据持久化的问题,但是一旦Node节点故障了,Pod如果转移到了别的节点,又会出现问题了,此时需要准备单独的网络存储系统
    • NFS是一个网络文件存储系统,可以搭建一台NFS服务器, 然后将Pod中的存储直接连接到NFS系统上,复杂
高级存储之PV、PVC

创建PV资源,通过PVC申请使用PV资源,将PVC与PV进行绑定,最后Pod通过引用PVC来使用PV资源

  • PV
    • 持久化卷,是对底层的共享存储的一种抽象,一般情况下PV由管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接
    • PV是存储资源的抽象,PV资源是属于集群资源,跨namespace(不受命名空间隔离)
  • PVC
    • 持久卷声明,是用户对于存储需求的一种声明,是用户向kubernetes系统发出的一种资源需求申请
    • PVC是对PV资源的申请,用来声明对存储空间、访问模式、存储类别需求信息。PVC会受到namespace隔离与PV不同
    • PV一旦绑定到某个PVC上,就会被这个PVC独占,不能再与其他PVC进行绑定了
  • PV和PVC的什么周期
    • PVC和PV是一 一对应的, PV和PVC之间的相互作用遵循以下生命周期
    • 资源供应:管理员手动创建底层存储和PV,状态处于Available
    • 资源绑定:用户创建PVC, kubernetes负责根据PVC的声明去寻找PV,并绑定,状态为Bound
      • 在用户定义好PVC之后,系统将根据PVC对存储资源的请求在已存在的PV中选择一个满足条件的
        • 一旦找到,就将该PV与用户定义的PVC进行绑定,用户的应用就可以使用这个PVC了
        • 如果找不到,PVC则会无限期处于Pending状态, 直到等到系统管理员创建了一个符合其要求的PV
    • 资源使用:用户可在pod中像volume一样使用pvc
      • 当存储资源使用完毕后,用户可以删除PVC,与该PVC绑定的PV将会被标记为”已释放(Released)“,但还不能立刻与其他PVC进行绑定。通过之前PVC写入的数据可能还被留在存储设备上,只有在清除之后该PV才能再次使用
    • 资源释放:用户删除pvc来释放pv
    • 资源回收:kubernetes根据pv设置的回收策略进行资源的回收,只有PV的存储空间完成回收(处于Available状态),才能供新的PVC绑定和使用
配置存储之ConfigMap、Secret
configMap
  • ConfigMap是一种比较特殊的存储卷,它的主要作用是以键值对的形式来存储配置信息的,可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改
  • ConfigMap必须在Pod使用它之前创建,Pod只能使用同一个命名空间的ConfigMap
Secret
  • Secret资源主要用于存储和管理一些敏感数据,比如密码,token,密钥,证书等敏感信息。它把 Pod 想要访问的加密数据存放到 etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了
问题
  1. Pod为什么是Kubernets里的原子调度单位?

    涉及到资源调度问题,如果容器为最小单位,一个Pod里面多个容器,可能会出现node资源不够导致容器无法全部部署在同一个node上

  2. Pod里面为什么有多个容器?

    容器之间可能存在以下场景:互相之间文件交换、频繁的远程调用、共享Namespace

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes指南-倪朋飞.pptx 1-唐继元Kubernetes Master High Availability 高级实践.pdf 2、刘淼-基于 DevOps、微服务及k8s的高可用架构探索与实现.pdf ArchSummit北京2016-《网易蜂巢基于万节点Kubernets支撑大规模云应用实践》-刘超.pdf Azure Service Broker_cn - Rita Zhang.pdf google/ HPE李志霄 Kubernetes企业级容器云:加速数字创新-20170407.pdf IBM马达:Kubernetes 中基于策略的资源分配.pdf k8s资料.rar Kubernetes Cookbook-Packt Publishing(2016).pdf Kubernetes Microservices with Docker-Apress2016.pdf Kubernetes on Azure - Gabe Monroy.pdf Kubernetes1.6集群部署完全指南——二进制文件部署开启TLS基于CentOS7.pdf Kubernetes1-4版本新增加功能介绍.pdf Kubernetes监控与日志.pdf kubernetes容器云平台实践-李志伟v1.0.pdf Kubernetes生态系统现状报告.pdf Kubernetes下API网关的微服务实践 长虹集团-李玮演讲PPT.pdf Kubernetes与EcOS的碰撞结合 成都精灵云-张行才演讲PPT.pdf Kubernetes与OpenStack融合支撑企业级微服务架构.pdf Kubernetes在华为全球IT系统中的实践.pdf Kubernetes在企业中的场景运用及管理实践.pdf Kubernetes指南-倪朋飞.pdf Kubernetes指南-倪朋飞.pptx l.txt Lessons+learned+and+challenges+faced+while+running+Kubernetes+at+scale.pdf rkt与Kubernetes的深度融合.pdf rkt与Kubernetes的深度融合.pptx SACC2017FabricOnKubernetesChinese.pdf ThoughtWorks林帆-白话Kubernetes网络.pdf 百度云PaddlePaddle on kubernetes-周倜.pdf 从Borg到Kubernetes-PaaS产品设计-华为-钟成.pdf 改造Kuberntetes打造SAE容器云.pdf 跟谁学-基于容器的持续集成平台建设.pdf 谷歌深度学习在Kubernetes上的实践.pptx 惠普基于Kubernetes容器私有云平台实践.pdf 基于Kubernetes的模板化应用编排.pdf 基于kubernetes容器云平台设计与实践-邓德源.pdf 基于Kubernetes的私有容器云建设实践-易宝支付.pdf 基于Kubernetes构建AI业务生态.pdf 李波:小米生态云应用引擎实践.pdf 魅族容器云平台基于 k8s 的自动化运维实践-曾彬.pdf 欧昌华-基于 Nginx 的负载均衡器在 K8S 中的实践.pdf 彭超:瓜子云的落地.pdf 如何落地TensorFlow on Kubernetes.pdf 如何用OpenStack和Kubernetes快速搭建一个容器和虚拟机组合服务的云平台.pptx 孙杰:大型企业云平台架构演进的实践之路.pdf 微服务道与术-敖小剑.pdf 微软Azure云助力微服务-赵文婧.pdf 颜卫-腾讯云容器服务基于kubernetes的应用编排实践-final-v1.0.pptx 有容云邓绍军-Kubernetes落地实践.pptx 折800如何用Docker&Kubernetes;构建自动化测环境.pdf
Kubernetes 原理剖析与实战应用】 开篇 | 如何深入掌握 Kubernetes云原生基石:初识 Kubernetes 01 | 前世今生:Kubernetes 是如何火起来的? 02 | 高屋建瓴:Kubernetes 的架构为什么是这样的? 03 | 集群搭建:手把手教你玩转 Kubernetes 集群搭建 04 | 核心定义:Kubernetes 是如何搞定“不可变基础设施”的? 「关注公众号【云世】,免费获取全系列课程内容」 05 | K8s Pod:最小调度单元的使用进阶及实践 Kubernetes 进阶:部署高可用的业务 06 | 无状态应用:剖析 Kubernetes 业务副本及水平扩展底层原理 07 | 有状态应用:Kubernetes 如何通过 StatefulSet 支持有状态应用? 08 | 配置管理:Kubernetes 管理业务配置方式有哪些? 09 | 存储类型:如何挑选合适的存储插件? 10 | 存储管理:怎样对业务数据进行持久化存储? 11 | K8s Service:轻松搞定服务发现和负载均衡 12 | Helm Charts:如何在生产环境中释放部署生产力? 守护神:业务的日志与监控 「关注公众号【云世】,免费获取全系列课程内容」 13 | 服务守护进程:如何在 Kubernetes 中运行 DaemonSet 守护进程? 14 | 日志采集:如何在 Kubernetes 中做日志收集与管理? 15 | Prometheus:Kubernetes 怎样实现自动化服务监控告警? 16 | 迎战流量峰值:Kubernetes 怎样控制业务的资源水位? 17 | 案例实战:教你快速搭建 Kubernetes 监控平台 安全无忧:集群的安全性与稳定性 18 | 权限分析:Kubernetes 集群权限管理那些事儿 19 | 资源限制:如何保障你的 Kubernetes 集群资源不会被打爆 20 | 资源优化:Kubernetes 中有 GC(垃圾回收)吗? 21 | 优先级调度:你必须掌握的 Pod 抢占式资源调度 22 | 安全机制:Kubernetes 如何保障集群安全? 23 | 最后的防线:怎样对 Kubernetes 集群进行灾备和恢复? 「关注公众号【云世】,免费获取全系列课程内容」 加餐:问题答疑和优秀留言展示 知其所以然:底层核心原理及可扩展性 24 | 调度引擎:Kubernetes 如何高效调度 Pod? 25 | 稳定基石:带你剖析容器运行时以及 CRI 原理 26 | 网络插件:Kubernetes 搞定网络原来可以如此简单? 27 | K8s CRD:如何根据需求自定义你的 API? 28 | 面向 K8s 编程:如何通过 Operator 扩展 Kubernetes API? 特别放送 「关注公众号【云世】,免费获取全系列课程内容」 29 | Kubernetes 中也有定时任务吗? 30 | Kubectl 命令行工具使用秘笈 结束语 结束语 | Cloud Native is Eating the World:时代在召唤云原生 「关注公众号【云世】,免费获取全系列课程内容」

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值