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挂了,容器是什么状态?继续运行还是也挂了?

容器会挂

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容