image.png

1. kubernetes架构

1.1. etcd

键值对数据库 存储k8s集群的所有重要信息(持久化)

1.2. master节点组件

1.2.1. apiserver

所有服务访问统一入口

1.2.2. controller manager

维持副本期望数目

1.2.3. scheduler

负责接收任务,选择合适的节点进行分配任务

1.3. node节点组件

1.3.1. kubelet

直接跟容器引擎交互实现容器的生命周期管理

1.3.2. kube-proxy

负载写入规则,写入iptables或ipvs实现服务映射访问的

1.3.3. container runtime

主流容器为docker

1.4 插件

1.4.1. coredns

可以为集群中的svc创建一个域名IP的对应关系解析

1.5.1. dashboard

给k8s提供一个B/S结构访问体系

1.5.2. ingress controller

官方只能实现四层代理, ingress可以实现七层代理

1.5.3. fedetation

提供一个可以跨集群中心多k8s统一管理功能

1.5.4. prometheus

提供一个k8s集群的监控能力

1.5.5. elk

提供k8s集群日志统一分析介入平台

1.5.6. flannel

让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址.而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network), 通过这个覆盖网络,将数据包原封不动地传递到目标容器内
image.png
etcd之flannel说明:

  • 存储管理flannel可分配的IP地址及资源
  • 监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由表

2. kubernets概念

2.1. pod类型

2.1.1. 自主式Pod

2.1.2. 控制器管理的pod

2.3. 网络通讯模式

image.png

  1. 同一个Pod内的多个容器之间: lo
    • 同一个Pod共享同一个网络命名空间,共享同一个Linux协议栈
  2. 各Pod之间的通讯: overlay network
    • Pod1与Pod2不在用一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问
    • Pod1与Pod2在同一台机器,由docker0网桥直接转发请求至Pod2,不需要经过Flannel
  3. pod与service之间的通讯: 各节点的iptables规则

  4. pod到外网

    • Pod向外网发送请求,查找路由表,转发数据包到宿主机的玩咖,宿主网卡完成路由选择后,ipables执行masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求
  5. 外网访问Pod: service, 一般通过NodePort进行映射

2.4. 端口映射

2.4.1. HostPort

image.png

2.4.2. NodePort

image.png

3. kubernetes资源

k8s所有的内容都抽象为资源,可称为对象

3.1. 集群资源分类

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

3.2. yaml文件必须存在的属性

参数名 字段类型 说明
version String K8s API版本,目前基本是v1 可以用kubectl api-versions查看
kind String yyaml文件定义的资源类型和角色,比如pod、role
metadata Object 元数据对象,
metadata.name String 元数据对象的名字,比如Pod的名字
metadata.namespace String 元数据对象的命名空间
spec Object 详细定义对象
sepc.containers[] list spec对象容器列表定义,是个列表
spec.containers[].name String 这里定义容器的名字
spec.containers[].image String 定义用到的镜像名称
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx-pod
  5. namespace: default
  6. labels:
  7. app: myapp
  8. verseion: v1
  9. spec:
  10. containers:
  11. - name: nginx-ds
  12. image: nginx:latest

3.3. yaml文件主要属性(可不写,有默认值)

参数名 字段类型 说明
spec.containers[].imagePullPolicy string 定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选
(1). Always: 每次都尝试重新拉取镜像
(2). Never: 表示仅是用本地镜像
(2). IfNotPresent: 如果本地有镜像就是用本地镜像,没有就拉取在线镜像
如没设置该值则默认为Always
spec.containers[].command[] List 指定容器启动命令,因为是数组可以指定多个,不指定则是用打包时候使用的启动命令
spec.containers[].args[] List 指定容器启动命令参数,因为是数组可以指定多个
spec.containers[].workingDir string 指定容器的工作目录
spec.containers[].volumeMounts[] List 指定容器内部的存储卷配置
spec.containers[].volumeMounts[].name String 指定可以被容器挂载的存储卷名称
spec.containers[].volumeMounts[].mountPath String 指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnly String 设置存储卷路径的读写模式,true或者false,默认为读写模式
spec.containers[].ports[] List 指定容器需要用到的端口列表
spec.containers[].ports[].name String 指定端口名称
spec.containers[].ports.containerPort String 指定容器需要监听的端口号
spec.containers[].hostPort String 指定容器所在主机需要监听的端口号,默认跟上面containersPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机端口)
spec.containers[].protocol String 指定端口协议,支持TCP和UDP,默认值为TCP
spec.containers[].env[] List 指定容器运行前需要设置的环境变量
spec.containers[].env[].name String 指定环境变量名称
spec.containers[].env[].values String 指定环境变量值
spec.containers[].resouces Object 指定资源限制和资源请求的值(设置资源上限)
spec.containers[].resouces.limits Object 设置容器运行时候资源的运行上限
spec.containers[].resouces.limits.cpu String 指定CPU的限制,单位为core数,将用于docker run —cpu-shares参数
spec.containers[].resouces.limits.memory String 指定memory内存的限制,单位为MIB、GiB
spec.containers[].resouces.requests Object 指定容器启动和调度时的限制设置
spec.containers[].resouces.requests.cpu String CPU请求,单位为core数,容器启动时候初始化可用数量
spec.containers[].resouces.requests.memory String 内存请求,单位为MIB、GiB,容器启动的初始化可用数量

3.4. yaml文件额外参数

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