首页 > 技术文章 > 1.k8s概述、安装、名词解释、资源清单

xiaokantianse 2020-12-24 15:25 原文

一、k8s概述

1、简介

  • Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制,由于k和s之间有8个字母,所以简称k8s
  • 传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性
  • 新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移
  • Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡
  • 在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理
  • kubernetes的前身是Borg,Borg是集群的管理器,在它的系统中,运行着众多集群,而每个集群可由成千上万的服务器联接组成,Borg每时每刻都在处理来自众多应用程序所提交的成百上千的Job, 对这些Job进行接收、调度、启动、停止、重启和监控。正如Borg论文中所说,Borg提供了3大好处
    • 隐藏资源管理和错误处理,用户仅需要关注应用的开发
    • 服务高可用、高可靠
    • 可将负载运行在由成千上万的机器联合而成的集群中

2、特点

  • Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用(就像canary deployments)
  • 自动装箱
    • 基于容器对应用运行环境的资源配置要求自动部署应用容器
  • 自我修复( 自愈能力)
    • 当容器失败时,会对容器进行重启当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
  • 水平扩展
    • 通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
  • 服务发现
    • 用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
  • 滚动更新
    • 可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
  • 版本回退
    • 可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
  • 密钥和配置管理
    • 在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
  • 存储编排
    • 自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
  • 批处理
    • 提供一次性任务,定时任务;满足批量数据处理和分析的场景

3、架构

  • 说明

    • master节点
      • k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和Controller Manager所组成
        • API Server:集群的入口,外界通过kubectl等工具,进行对集群的操作
        • Schedule:调度器,对集群的资源进行调度,给pod分配节点等
        • ETCD:保存集群的配置信息,也可以配置成集群,一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运,推荐在Kubernetes集群中使用Etcd v3,v2版本已在 Kubernetes v1.11中弃用
        • Controller MangerServer:集群控制器,对pod进行控制,包含Replication Controller(RC)或者Replica Set(RS),RS已经代替了RC,维持副本期望数目
    • worker节点
      • 集群工作节点,运行用户业务应用容器;Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;
        • Kubelet:直接跟容器引擎交互实现容器的生命周期管理,和master进行交互,对当前的节点进行管理(相当于就是master派往node管理的代表)
        • Kube-proxy:负责写入规则至IPTABLES、IPVS实现服务映射访问的,反向代理和负载均衡
    • 其他插件
      • COREDNS:可以为集群中的SVC创建一个域名IP的对应关系解析
      • DASHBOARD:给 K8S 集群提供一个 B/S 结构访问体系
      • INGRESS CONTROLLER:官方只能实现四层代理,INGRESS 可以实现七层代理
      • FEDERATION:提供一个可以跨集群中心多K8S统一管理功能
      • PROMETHEUS:提供K8S集群的监控能力
      • ELK:提供 K8S 集群日志统一分析介入平台

二、k8s安装

1、安装要求

  • 一台或多台机器,操作系统CentOS7.x-86_x64(内核4以上最好)(至少三台,一个master,两个node)
  • 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像(不能访问外网,可设置软路由,建私有仓库等)
  • 禁止 swap 分区

2、安装方式

  • 目前生产部署 Kubernetes 集群主要有两种方式
  • Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护

2.1、kubeadm安装

  • 准备环境,三台机器,一个master,两个node

    • 角色 ip
      master 192.168.47.150
      node1 192.168.47.161
      node2 192.168.47.162
    • # 以下命令所有节点执行
      # 关闭防火墙
      systemctl stop firewalld
      systemctl disable firewalld
      
      # 关闭selinux
      sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
      setenforce 0  # 临时
      
      # 关闭swap
      swapoff -a  # 临时
      sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久
      
      # 根据规划设置主机名
      hostnamectl set-hostname <hostname>
      
      # 在master添加hosts
      cat >> /etc/hosts << EOF
      192.168.47.150 k8smaster
      192.168.47.161 k8snode1
      192.168.47.162 k8snode2
      EOF
      
      # 将桥接的IPv4流量传递到iptables的链
      cat > /etc/sysctl.d/k8s.conf << EOF
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF
      sysctl --system  # 生效
      
      # 时间同步
      # yum install chrony -y centos 8 chrony替换了ntpdate 
      # yum install ntpdate -y
      # chrony time.windows.com
      # ntpdate time.windows.com
      # 设置系统时区为 中国/上海
      timedatectl set-timezone Asia/Shanghai
      # 将当前的 UTC 时间写入硬件时钟
      timedatectl set-local-rtc 0
      # 重启依赖于系统时间的服务
      systemctl restart rsyslog
      systemctl restart crond
      
  • 所有节点安装Docker/kubeadm/kubelet

    • # 安装docker 并开机自启
      $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
      $ yum -y install docker-ce-18.06.1.ce-3.el7
      $ systemctl enable docker && systemctl start docker
      $ docker --version
      Docker version 18.06.1-ce, build e68fc7a
      # 设置镜像加速器
      $ cat > /etc/docker/daemon.json << EOF
      {
        "registry-mirrors": ["https://自己的地址.mirror.aliyuncs.com"]
      }
      EOF
      
    • # 添加阿里云YUM软件源
      $ cat > /etc/yum.repos.d/kubernetes.repo << EOF
      [kubernetes]
      name=Kubernetes
      baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
      enabled=1
      gpgcheck=0
      repo_gpgcheck=0
      gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      EOF
      
    • # 安装kubeadm,kubelet和kubectl 并开机自启
      # 由于版本更新频繁,这里指定版本号部署
      $ yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
      $ systemctl enable kubelet
      
  • 部署Kubernetes Master

    • # 在主节点运行 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
      $ kubeadm init \
        --apiserver-advertise-address=192.168.47.150 \
        --image-repository registry.aliyuncs.com/google_containers \
        --kubernetes-version v1.18.0 \
        --service-cidr=10.96.0.0/12 \
        --pod-network-cidr=10.244.0.0/16
      
    • # 使用kubectl工具 主节点初始化完成之后,界面上会有该命令,直接复制执行即可
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
  • 部署Kubernetes node

    • # 向集群添加新节点,执行在kubeadm init输出的kubeadm join命令(主节点初始化完成之后,界面上会有该命令,直接复制在node上执行即可)
      $ kubeadm join 192.168.1.11:6443 --token esce21.q6hetwm8si29qxwn \
          --discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
      
    • # 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token
      kubeadm token create --print-join-command
      
  • 部署CNI网络插件

    • # 默认镜像地址无法访问,sed命令修改为docker hub镜像仓库 如果下载不到,则使用本地文件
      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      
      kubectl get pods -n kube-system
      NAME                          READY   STATUS    RESTARTS   AGE
      kube-flannel-ds-amd64-2pc95   1/1     Running   0          72s
      
  • 测试kubernetes集群

    • # 创建一个pod 并将该服务暴露出去供外接访问
      $ kubectl create deployment nginx --image=nginx
      $ kubectl expose deployment nginx --port=80 --type=NodePort
      $ kubectl get pod,svc
      
    • 访问地址:http://任意node的ip:暴露的端口

2.2、二进制包安装

  • 由于二进制包安装比较复杂,有兴趣可以自行查阅相关文档(其中的证书信息需要自建,也就是集群内部访问是https,kubelet和api server的交互就需要证书,否则是不能交互的)

三、概念简述

1、Pod

1.1、概述

  • Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod提供存储等等,k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个container 组成
  • Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod还包含一个或多个紧密相关的用户业务容器

1.2、组成

  • Pod的组成:Pause(用于Pod内的容器共享网络和共享存储,是由k8s自动创建的,可以看作一个逻辑的主机),main container 提供服务,一个Pod内可以有多个容器,同一个Pod内可以直接使用localhost:端口直接访问(pod实际是不存在的,是一个抽象的意义)

1.3、Pod特性

  • 每个 Pod 都是应用的一个实例,有专用的 IP

  • 一个 Pod 可以有多个容器,彼此间共享网络和存储资源,每个 Pod 中有一个 Pause 容器保存所有的容器状态, 通过管理 pause 容器,达到管理 pod 中所有容器的效果

  • 同一个 Pod 中的容器总会被调度到相同 Node 节点,不同节点间 Pod 的通信基于虚拟二层网络技术实现

  • 资源共享

    • 一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如namespace,cgroups 或者其他的隔离资源
    • 多个容器共享同一 network namespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之前通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod的 IP 进行通信
    • 一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可以挂载到该 Pod 里的所有容器的文件系统上
  • 生命周期短暂

    • Pod 属于生命周期比较短暂的组件,比如,当 Pod 所在节点发生故障,那么该节点上的 Pod会被调度到其他节点,但需要注意的是,被重新调度的 Pod 是一个全新的 Pod,跟之前的Pod 没有半毛钱关系
  • 平坦的网络

    • K8s 集群中的所有 Pod 都在同一个共享网络地址空间中,也就是说每个 Pod 都可以通过其他 Pod 的 IP 地址来实现访问

1.4、Pod分类

  • 自主式
    • 自主式 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且kubelet 也无法对它们进行健康检查
    • 通俗点说就是没有控制器管理的Pod,退出了也就结束了,也没有人管
  • 控制器管理的Pod
    • 控制器管理的Pod一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机,则会将这个 Node 上的所有 Pod 重新调度到其它节点上
    • 通俗点说就是被控制器管理的Pod,退出了会有控制器管理,重新启动,维持副本所期望的数目

2、控制器

  • 控制器用来控制Pod的数量,对Pod进行控制可管理

2.1、控制器分类

  • Deployment
    • ReplicationController 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代;而如果异常多出来的容器也会自动回收。在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationControlle
    • ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且ReplicaSet 支持集合式的 selector
    • 虽然 ReplicaSet 可以独立使用,但一般还是建议使用 Deployment 来自动管理ReplicaSet ,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持rolling-update 但 Deployment 支持)
    • 创建了Deployment也就会创建相应的RS或RC(底层通过RS或RC控制副本数量),同时还提供了滚动更新和版本回退等功能(其实还是通过不同的RS或RC实现的)
    • Deployment 为 Pod 和 ReplicaSet 提供了一个 声明式定义 (declarative) 方法,用来替代以前的 ReplicationController 来方便的管理应用。典型的应用场景包括
      • 定义 Deployment 来创建 Pod 和 ReplicaSet
      • 滚动升级和回滚应用
      • 扩容和缩容
      • 暂停和继续 Deployment
  • HPA
    • Horizontal Pod Autoscaling 仅适用于 Deployment 和 ReplicaSet ,在 V1 版本中仅支持根据 Pod的 CPU 利用率扩所容,在 v1alpha 版本中,支持根据内存和用户自定义的 metric 扩缩容
  • StatefullSet
    • StatefulSet 是为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets 是为无状态服务而设计),其应用场景包括
      • 稳定的持久化存储,即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现
      • 稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service(即没有 Cluster IP 的 Service )来实现
      • 有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从 0 到 N-1 ,在下一个 Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现
      • 有序收缩,有序删除(即从 N-1 到 0 0 )
  • Job ,CronJob
    • Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod
    • Cron Job 管理基于时间的 Job
      • 在给定时间点只运行一次
      • 周期性地在给定时间点运行

3、Service

  • Service 是 Kubernetes 最核心概念,通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上
  • 相当于为一组功能相同的Pod提供一个供外界访问的地址,对这些Pod进行代理(因为Pod如果删除,RC为了保持副本数目,会重新拉起一个新Pod,而新的Pod和原来的Pod完全不一样,Ip地址更是不相同,所以不能直接使用Ip访问Pod),并且还可以起到负载均衡的作用,也是通过Pod的lables进行代理
  • 分类
    • ClusterIP:集群内部使用
    • NodePort:对外访问应用使用
    • LoadBalancer:对外访问应用使用,公有云

四、网络通讯方式

  • Kubernetes 的网络模型假定了所有 Pod 都在一个可以直接连通的扁平的网络空间中,这在GCE ( Google Compute Engine )里面是现成的网络模型, Kubernetes 假定这个网络已经存在。而在私有云里搭建 Kubernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的 Docker 容器之间的互相访问先打通,然后运行 Kubernetes

  • 同一个 Pod 内的多个容器之间: localhost
    各 Pod 之间的通讯: Overlay Network
    Pod 与 Service 之间的通讯:各节点的 Iptables 规则

  • Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。而且它还能在这些 IP 地址之间建立一个覆盖网络( Overlay Network ),通过这个覆盖网络,将数据包原封不动地传递到目标容器内

  • ETCD 之 Flannel 提供说明

    • 存储管理 Flannel 可分配的 IP
    • 监控 ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Pod
  • 不同情况的通讯

    • 同一个 Pod 内部通讯:同一个 Pod 共享同一个网络命名空间,共享同一个 Linux 协议
    • Pod1 至 Pod2
      • Pod1 与 Pod2 不在同一台主机, Pod 的地址是与 docker0 在同一个网段的,但 docker0 网段与宿主机网卡是两个完全不同的 IP 网段,并且不同 Node 之间的通信只能通过宿主机的物理网卡进行。将 Pod 的 IP 和所在 Node 的 IP 关联起来,通过这个关联让 Pod 可以互相访问
      • Pod1 与 Pod2 在同一台机器,由 Docker0 网桥直接转发请求至 Pod2 ,不需要经过 Flannel
    • Pod 至 Service 的网络
      • 目前基于性能考虑,全部为 iptables 维护和转发
    • Pod 到外网
      • Pod 向外网发送请求,查找路由表 , 转发数据包到宿主机的网卡,宿主网卡完成路由选择后, iptables 执行 Masquerade ,把源 IP 更改为宿主网卡的 IP ,然后向外网服务器发送请求
    • 外网访问 Pod
      • Service

五、资源清单

1、资源类型

  • 名称空间级别
    • 工作负载型资源 ( workload )
      • Pod 、 ReplicaSet 、 Deployment 、 StatefulSet 、 DaemonSet 、 Job 、CronJob ( ReplicationController 在 v1.11 版本被废弃)
    • 服务发现及负载均衡型资源 ( ServiceDiscovery LoadBalance )
      • Service 、 Ingress 、 ...
    • 配置与存储型资源、
      • Volume( 存储卷 ) 、 CSI( 容器存储接口, , 可以扩展各种各样的第三方存储卷 )
    • 特殊类型的存储卷
      • ConfigMap ( 当配置中心来使用的资源类型 ) 、 Secret( 保存敏感数据 ) 、DownwardAPI( 把外部环境中的信息输出给容器 )
  • 集群级资源
    • Namespace 、 Node 、 Role 、 ClusterRole 、 RoleBinding 、 ClusterRoleBinding
  • 元数据型资源
    • HPA 、 PodTemplate 、 LimitRange

2、资源清单文件YAML

  • k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了
  • YAML :仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。YAML 是一个可读性高,用来表达数据序列的格式

2.1、YAML语法介绍

  • 使用空格做为缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 低版本缩进时不允许使用 Tab 键,只允许使用空格
  • 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略

2.2、YAML 支持的数据结构

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

    • # 对象类型:对象的一组键值对,使用冒号结构表示
      name: Steve
      age: 18
      # Yaml 也允许另一种写法,将所有键值对写成一个行内对象
      hash: { name: Steve, age: 18 }
      
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表 (list)

    • # 数组类型:一组连词线开头的行,构成一个数组
      animal
      - Cat
      - Dog
      # 数组也可以采用行内表示法
      animal: [Cat, Dog]
      
  • 复合结构:对象和数组可以结合使用,形成复合结构

    • languages:
      - Ruby
      - Perl
      - Python
      websites:
      YAML: yaml.org
      Ruby: ruby-lang.org
      Python: python.org
      Perl: use.perl.org
      
  • 纯量(scalars):单个的、不可再分的值

    • # 字符串 布尔值 整数 浮点数 Null
      # 时间 日期
      # 数值直接以字面量的形式表示
      number: 12.30
      # 布尔值用true和false表示
      isSet: true
      # null用 ~ 表示
      parent: ~
      # 时间采用 ISO8601 格式
      iso8601: 2001-12-14t21:59:43.10-05:00
      # 日期采用复合 iso8601 格式的年、月、日表示
      date: 1976-07-31
      # YAML 允许使用两个感叹号,强制转换数据类型
      e: !!str 123
      f: !!str true
      
  • 字符串的注意事项

    • # 字符串默认不使用引号表示
      str: 这是一行字符串
      # 如果字符串之中包含空格或特殊字符,需要放在引号之中
      str: '内容: 字符串'
      # 单引号和双引号都可以使用,双引号不会对特殊字符转义
      s1: '内容\n字符串'
      s2: "内容\n字符串"
      # 单引号之中如果还有单引号,必须连续使用两个单引号转义
      str: 'labor''s day'
      # 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为 空格
      str: 这是一段
       多行
       字符串
      # 多行字符串可以使用|保留换行符,也可以使用>折叠换行
      this: |
      Foo
      Bar
      that: >
      Foo
      Bar
      # + 表示保留文字块末尾的换行,- 表示删除字符串末尾的换行
      s1: |
       Foo
      s2: |+
       Foo
      s3: |-
       Foo
      

3、常用字段说明

  • 必须存在的属性

    • 参数名 字段类型 说明
      version String k8s的api版本,目前基本时v1,可以用kubectl api-versions命令查询
      kind String 指yaml文件定义的资源类型和角色,比如Pod
      metadata Object 元数据对象,固定值写metadata
      metadata.name String 元数据对象的名称,由我们编写,比如Pod的名字
      metadata.namespace String 元数据对象的命名空间,由我们自身定义
      spec Object 详细定义对象,固定值写spec
      spce.containers[] list spec对象的容器列表
      spce.containers[].name String 定义容器的名称
      spce.containers[].image String 定义容器的镜像
  • 主要对象

    • 参数名 字段类型 说明
      spce.containers[].name String 定义容器的名称
      spce.containers[].image String 定义容器的镜像
      spce.containers[].imagePullPolicy String 镜像的拉取策略
      Always:每次都拉取新的镜像
      Never:仅使用本地镜像,从不拉取
      IfNotPresent:如果本地有就使用本地镜像,没有则拉取,不写默认Always
      建议使用IfNotPresent,因为docker中latest不是固定值,经常变
      spce.containers[].command[] list 容器的启动命令,因为是数组可以指定多个,不指定则使用镜像打包中的命令
      spce.containers[].args[] list 容器启动命令的参数,因为是数组可以指定多个
      spce.containers[].workingDir String 容器的工作目录
      spce.containers[].volumeMounts[] list 容器内部存储卷位置
      spce.containers[].volumeMounts[].name String 容器挂载的存储卷名称
      spce.containers[].volumeMounts[].mountPath String 容器挂载的存储卷路径
      spce.containers[].volumeMounts[].readOnly String 容器挂载的存储卷读写模式,true或false,默认true只读
      spce.containers[].ports[] list 容器用到的端口列表
      spce.containers[].ports[].name String 指定端口名称
      spce.containers[].ports[].containerPort String 指定容器需要监听的端口
      spce.containers[].ports[].hostPort String 指定容器所在主机需要监听的端口号,默认和containerPort相同,注意设置了hostPort同一台主机无法启动该容器的形同副本(因为主机的关端口号不能相同,这样会冲突)
      spce.containers[].ports[].protocol String 指定端口的协议,支持TCP和UDP,默认TCP
      spce.containers[].env[] list 指定容器运行前所需设置的环境变量列表
      spce.containers[].env[].name String 环境变量名称
      spce.containers[].env[].value String 指定环境变量值
      spce.containers[].resources Object 资源限制和资源请求的值
      spce.containers[].resources.limits Object 容器运行时资源上限(运行容器所能用的最大资源)
      spce.containers[].resources.limits.cpu String CPU的限制,单位为core数,将用于docker run --CPU-shares参数
      spce.containers[].resources.limits.memory String 内存限制,单位为MIB、GIB
      spce.containers[].resources.requests Object 容器启动和调度的限制(运行容器所需最小资源)
      spce.containers[].resources.requests.cpu String CPU的限制,单位为core数
      spce.containers[].resources.requests.memory String 内存限制,单位为MIB、GIB
  • 额外参数

    • 参数名 字段类型 说明
      spec.restartPolicy String Pod的重启策略
      Always:Pod一旦终止运行,无论容器时如何终止的,kubelet服务都将它重启,默认
      Onfailure:只有Pod以非零退出吗终止时,kubelet才会重启该容器,正常结束退出码为0
      Never:Pod终止后,kubelet将退出码报告给master不会重启
      spec.nodeSelector Object 定义Node的label过滤标签,以key:value格式指定
      spec.imagePullSecrets Object 定义pull镜像时使用的secret名称,以name:secretkey格式指定
      spec.hostNetwork boolean 定义是否使用主机网络模式,默认false,设置true表示使用宿主机网络
      不使用docker网桥,同时设置了true将无法在同一台宿主机上启动第二个副本
  • version说明

    • # 查看当前k8s支持的version
      kubectl api-versions
      # 查看某个资源支持的版本 比如Pod
      kubectl explain pod 或者 kubectl explain pod.apiVersion(可在FIELDS选择字段中选择具体字段,详细查看)
      KIND:     Pod
      VERSION:  v1
      
      DESCRIPTION:
           Pod is a collection of containers that can run on a host. This resource is
           created by clients and scheduled onto hosts.
           
      FIELDS:
         apiVersion   <string>
           APIVersion defines the versioned schema of this representation of an
           object. Servers should convert recognized schemas to the latest internal
           value, and may reject unrecognized values. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
      
         kind <string>
           Kind is a string value representing the REST resource this object
           represents. Servers may infer this from the endpoint the client submits
           requests to. Cannot be updated. In CamelCase. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
      
         metadata     <Object>
           Standard object's metadata. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
      
         spec <Object>
           Specification of the desired behavior of the pod. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
      
         status       <Object>
           Most recently observed status of the pod. This data may not be up to date.
           Populated by the system. Read-only. More info:
           https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
      

4、资源清单示例

  • apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
      # 命名空间 默认default
      namespace: default
      labels:
        app: myapp
    spec:
      containers:
      # 第一个容器 注意同一个Pod中多个容器暴露的端口不能冲突,因为他们共享网络和存储 比如两个都是nginx,就会启动出错,触发pod的重启策略
      - name: myapp-1
        image: nginx
      # 第二个容器
      # - name: myapp-2
      #  image: nginx
    
  • # 使用yaml启动资源
    kubectl apply -f yaml文件名
    
    # 查看pod的描述 deployment等
    kubectl describe pod(资源类型) pod-demo(资源名)
    
    # 查看pod内容器日志
    kubectl logs pod-demo(pod名) -c myapp-2(容器名,如果Pod中只有一个容器,则不用写-c)
    
    # 删除pod deployment等
    kubectl delete pod(资源类型) pod-demo(资源名)
    
    # 将资源的yaml输出出来
    kubectl get pod(资源类型) pod-demo(资源名) -o yaml
    
  • [root@k8smaster ~]# kubectl describe pod pod-demo
      ......
      Containers:
        myapp-1:
          Container ID:   docker://5f81ea72fdfa7e720d3aba5e448eb26dc36e0be4763654ceb08eb4be75e6455a
          Image:          nginx
          Image ID:       docker-pullable://nginx@sha256:31de7d2fd0e751685e57339d2b4a4aa175aea922e592d36a7078d72db0a45639
          Port:           <none>
          Host Port:      <none>
          State:          Running
            Started:      Tue, 15 Dec 2020 13:47:41 +0800
          Ready:          True
          Restart Count:  0
          Environment:    <none>
          Mounts:
            /var/run/secrets/kubernetes.io/serviceaccount from default-token-99w8n (ro)
        myapp-2:
          Container ID:   docker://d12c9d0833239a987768e64fe1111fcd8d68036549e9e9a514c0a0dbb5bb4853
          Image:          nginx
          Image ID:       docker-pullable://nginx@sha256:31de7d2fd0e751685e57339d2b4a4aa175aea922e592d36a7078d72db0a45639
          Port:           <none>
          Host Port:      <none>
          State:          Waiting
            Reason:       CrashLoopBackOff
          Last State:     Terminated
            Reason:       Error
            Exit Code:    1
            Started:      Tue, 15 Dec 2020 13:49:28 +0800
            Finished:     Tue, 15 Dec 2020 13:49:31 +0800
          Ready:          False
          Restart Count:  3
          Environment:    <none>
          Mounts:
            /var/run/secrets/kubernetes.io/serviceaccount from default-token-99w8n (ro)
      ......
      
      [root@k8smaster ~]# kubectl get pod
      NAME       READY   STATUS             RESTARTS   AGE
      pod-demo   1/2     CrashLoopBackOff   3          2m52s
    

推荐阅读