kubernetes & docker 问题整理

1. 宿主机如何与容器通信

  • Bridge模式,即使用docker0网桥默认
    1. 创建独立的Network Namespace
    2. 创建容器时会虚拟出网卡创建一对虚拟网卡veth pair设备,一端连在容器里(eth0网卡),另一端接在docker0网桥
    3. docker run 通过参数-p 宿主机端口:容器端口进行端口映射。本质上是对iptables做了DNAT规则,实现端口转发功能,可通过iptables -t nat -vnL查看
    4. 同个网桥上的可以直接访问
    5. 不同网桥上,容器A的流量先通过网桥A到宿主机,再通过网桥B到要访问的容器B
    • 优点:隔离性好
    • 缺点:相比较Host模式,网络性能略低(多了层路由转发)
  • Host模式,即使用宿主机网络-net=host
    与宿主机共用一个Network Namespace
    • 优点:网络性能好
    • 缺点:会引入共享网络资源问题,比如端口冲突
  • Container模式
    新创建的容器和已有的容器共享一个Network Namespace,而不是和宿主机共享
  • None模式
    会创建Network Namespace,但是不会进行任何网络配置(即没有网卡、路由、ip等信息),需要手动添加

2. pod创建流程

  1. 客户端提交创建请求,API ServerRESTful APIkubectl
  2. API Server处理用户请求,存储pod数据到etcd
  3. kube-scheduler通过API Server watch API一直监听未绑定的pod,尝试为pod分配主机
  • 过滤节点(调度预选):kube-scheduler用一组郭泽过滤掉不符合要求的主机。比如说pod制定了所需要的资源量,那可用资源不够的会被过滤掉
  • 节点打分(调度优选):对预选的节点进行打分,(考虑一些整体优化策略:pod分散,使用最低负载的节点等)
  • 选择节点:选择打分最高的节点,进行binding操作,结果存储到etcd中(调用API Server创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息)
  1. 目标节点上的kubelet通过API Server watch API定期获取boundpod对象,发现需要创建pod了,则调用Docker API创建并启动pod
  2. kubelet通过CRI(Container Runtime Interface)获取pod状态,传给API Server,数据被更新到etcd中

3. etcd存储的是什么数据

etcd是一个高可用的分布式键值(key-value)数据库
etcd内部采用raft协议作为一致性算法
etcd至于go实现
服务注册和服务发现

保存了集群所有的网络配置和API Server对象的状态信息

4. 怎么查看etcd数据

exec进到pod,使用etcdctl命令

$ ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
get / --prefix --keys-only

5. etcd怎么做数据备份和数据恢复

  • 直接备份数据目录(用于单节点)
    etcd组件的数据目录默认位于/var/lib/etcd

  • 使用快照命令备份(可用于集群)

// 备份
$ etcdctl --endpoints=127.0.0.1:2380,ip:port snapshot save backupName.db
// 恢复
$ etcdctl snapshot restore backupName.db --data-dir=/var/lib/etcd

6. pod的状态是怎么监控的,怎么做到改变pod状态的

可能是CRI(Container Runtime Interface)

7.怎么修改docker容器资源?修改后容器重启吗?那修改pod呢?

// 修改容器不重启
$ docker update -c xxx -m xxx [container_id]

修改pod重启,因为kubelet会去同步etcd的数据syncPod

8. 资源隔离的具体实现

使用Linux的namespace实现,提供六种隔离机制:

  • UTS : 主机名与域名
  • IPC : 信号量、消息队列、共享内存
  • PID : 进程编号
  • Network : 网络设备、网络栈、端口等
  • Mount : 挂载点
  • User : 用户和用户组

与namespace相关的三个系统调用:

  • clone
    创建全新的namespace,由clone创建的新进程就位于这个新的namespace里
    创建时传入flags参数,可选值有CLONE_NEWIPCCLONE_NEWNETCLONE_NEWNSCLONE_NEWPIDCLONE_NEWUTSCLONE_NEWUSER,分别对应上面六种namespace
  • unshare
    为已有进程创建新的namespace
  • setns
    把某个进程放在已有的某个namespace里

9. 资源限制的具体实现

使用Linux的Cgroup实现,简单说是把进程放到一个组里面统一加以控制。
作用:可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、Memory、IO 等),为容器实现虚拟化提供了基本保证。
原理:将一组进程放在放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的。

  • 资源限制
    可以对任务使用的资源总额进行限制,如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)提示
  • 优先级分配
    通过分配的CPU时间片数量和磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级
  • 资源统计
    可以统计系统的资源使用,如 CPU 使用时长、内存用量等,这个功能非常适用于计费
  • 任务控制
    可以对任务执行挂起、恢复等操作
// 可以指定cpu和内存分配大小
$ docker run -c xxx -m xxx image:tag

10. docker现有运行时缺陷

  1. 基于Linux 64bit,无法在32bit的Linux/Windows/Unix环境下运行
  2. 网络管理相对简单,主要是基于namespace隔离
  3. LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base
  4. container随着用户进程的停止而销毁,container中的log等用户数据不便收集
  5. 太依赖namespace

11. k8s资源预留是怎么做的

// 通过该参数
kubelet --system-reserved=memory=4Gi

12. Sandbox作用

sandbox : 沙盒
是一种安全机制,为运行中的容器提供隔离的环境

13. 自定义k8s controller怎么选主

**etcd锁**

tryLock模式,每次lock都是尝试lock,已被lock就无法锁住,同时也用了租约,过期了自动释放

  1. 利用租约在etcd集群中创建一个key,这个key有两种形态,存在和不存在,而这两种形态就是互斥量。
  2. 如果这个key不存在,那么线程创建key,成功则获取到锁,该key就为存在状态。
  3. 如果该key已经存在,那么线程就不能创建key,则获取锁失败。

14. 二层网络,四层网络,overlay network

  • overlay
    为了满足云计算虚拟化的网络能力需求,逐步演化出了Overlay网络技术。
    通过虚拟化技术把一个逻辑网络建立在实体网络之上。
    在传统二层网络环境下,数据报文是通过查询MAC地址表进行二层转发,而网络设备MAC地址表的容量限制了虚拟机的数量。
    常用VXLAN
  • 二层网络:数据链路层(进行数据的分包)
  • 四层网络:传输层(TCP/IP协议在这里)

15. 创建pod怎么实现sidecar注入

使用init-container 配置iptables规则来做流量劫持转发

16. 怎么查看iptables规则

$ iptables -L

17. Pod terminating时候,ip还在吗,还通吗

ip在,ping不通

18. pause容器的作用,可不可以不要?pause容器的进程树是怎样的?

pause容器作为pod里其他所有容器的parent container,主要有两个职责

  • 是pod里其他容器共享Linux namespace的基础
  • 扮演PID 1(类似Linux的init进程)的角色,负责处理僵尸进程

进程树由pause容器开始,往下是业务容器

19. docker daemon挂了,容器是什么状态?继续运行还是也挂了?

容器会挂

你可能感兴趣的:(kubernetes & docker 问题整理)