权限
# RBAC 权限模型:http://www.woshipm.com/pd/1150093.html
role-base access control: 用户 -> Role -> 权限
RBAC0: 用户 -> Role -> 权限
简单:一个用户可拥有多个role;一个role可以赋予多个用户。
缺点:如果用户数量很大,且权限划分比较细时。权限管理变得复杂,可能出现P6拥有P7都没有的权限
RBAC1: 引入了子角色,可以对角色做分级。支持权限继承,子角色的权限<=父角色的权限
RBAC2: 增加了对角色的限制;角色互斥、角色基数约束、先决条件角色。
RBAC3: 综合了RBAC0,1,2的特点
图库
# Unsplash 极具美感的无版权图库:https://www.thosefree.com/unsplash
官网:https://unsplash.com
操作系统
# CPU
PC:programer controller
寄存器:
计数器:
TCP/IP
# TimeWait 太多:https://www.cnblogs.com/dadonggg/p/8778318.html
TIMEWAIT的作用:确保链接正确关闭,如果最后一次的ACK未收到,则服务端需要重新发送Fin
解决办法:调整内核参数,打开系统的TIMEWAIT重用和快速回收。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间
Golang
# context: https://zhuanlan.zhihu.com/p/68792989
CICD
瀑布式开发 -> 敏捷开发
devops
ci:持续集成 -> 自动进行编译构建测试
cd:持续交付/持续部署-> 打包好,自动部署到环境
部署方式:
重新部署:停止旧版本部署新版本
- 应用状态全部更新
- 停机时间取决于应用程序的关闭和启动消耗的时间
灰度发布/滚动:滚动更新通过逐个替换实例来逐步部署新版本的应用,直到所有实例都被替换完成为止。
蓝绿发布:蓝/绿发布是版本2 与版本1 一起发布,然后流量切换到版本2,也称为红/黑部署。
- 蓝/绿发布与滚动更新不同,版本2(绿) 与版本1(蓝)一起部署,在测试新版本满足要求后,
- 然后更新更新 Kubernetes 中扮演负载均衡器角色的 Service 对象,通过替换 label selector 中的版本标签将流量发送到新版本。
金丝雀发布:金丝雀部署是让部分用户访问到新版本应用,
- 在 Kubernetes 中,可以使用两个具有相同 Pod 标签的 Deployment 来实现金丝雀部署。
- 新版本的副本和旧版本的一起发布。在一段时间后如果没有检测到错误,则可以扩展新版本的副本数量并删除旧版本的应用。
A/B 测试:A/B 测试实际上是一种基于统计信息而非部署策略来制定业务决策的技术,与业务结合非常紧密。但是它们也是相关的,也可以使用金丝雀发布来实现。
- 除了基于权重在版本之间进行流量控制之外,A/B 测试还可以基于一些其他参数(比如 Cookie、User Agent、地区等等)来精确定位给定的用户群,该技术广泛用于测试一些功能特性的效果,然后按照效果来进行确定。
编排
# 早期的容器编排工具
docker-compose 单机管理
docker-swarm 多机集群模式,面线多机镜像应用编排。
docker-machine 用户快速将机器加入swarm集群。
mesos -> idc 操作系统,将一个idc的机器进行统一资源管理分配,上层还需要应用容器编排框架
Kubernetes功能特点
# 特点
- 自动装箱,自我修复,水平扩展
- 服务发现,负载均衡
- 自动发布,自动回滚
- 密钥和配置管理
- 存储编排,存储卷
- 任务批量处理执行
Kubernetes架构
# 调度器-schedule
# node选择
- 预选
- 优选
# Pod识别,Pod控制器
元数据定义在元数据MetaData中
# 标签选择器,label selecter
根据标签,来过滤pod的机制
# 结构
Master-Node模型
- master
- apiserver
- schedule
- contorl-manager/ cloud-contorl-manager
- Node
- kubelet: 启动pod,pod健康,创建存储卷
- docker:
- Pod:调度的原子单元
集群网络
对于k8s来说网络间的负载均衡是由infrastructure实现的,即对于部署在集群中的各个pod是透明无感知的。基本的实现有2种方式,iptable方式和ipvs方式。
对于iptable方式是k8s默认的网络负载均衡模式,顾名思义就是利用linux iptable中的nat实现负载均衡。对于ipvs方式是在1.11版本中引入的,利用linux ipvs内核模块来实现负载均衡(大名鼎鼎的LVS同样也是利用ipvs来实现的负载均衡)。我们以前文章里并没有刻意配置k8s负载均衡策略,所以是默认的iptable方式。如果希望以ipvs方式运行,那么需要在kube-proxy网络组件的启动参数中加入--proxy-mode=ipvs。
对于容器之间的网络通讯总结起来基本分为两种,underlay方式和overlay方式。underlay方式在通讯过程中没有额外的封包,通常将容器的宿主作为路由来实现数据包的转发,需要宿主开启网络转发功能(net.ipv4.ip_forward = 1)。常见的实现方案有flannel host-gw方式,calico bgp方式。
overlay方式在通讯过程中有额外的封包,例如flannel vxlan方式(在三层网络里构建二层网络,即在udp包里封装eth以太包),calico ipip模式(在ip包里再次封装ip包)。还有flannel udp方式,在upd包里封装ip包(当然这种方式使用tun device,每次通讯都涉及到用户态到内核态的切换,所以效率不高,基本是不会被用的。不过作为学习入手是可以的)。
所以总结一下,对于k8s网络基本会包括以下方面
- 网络负载均衡
iptable方式(默认负载均衡策略)
ipvs方式(v1.11以及以后版本)
- 网络间通讯
underlay网络:flannel host-gw,calico bgp等方式
overlay网络:flannel vxlan,calico ipip,flannel udp等方式
常见面试题总结
1 单项链表,给出了头指针,求倒数第k个元素的信息。
2 查找第k小的数,数组,同样大小的算一样大
3 二分查找
4 字符串反转答应
5 反转打印链表,并将元素输出到一个数组中
6 快速排序
7 最大公共前缀
9 托管侧多AZ打散怎么做的?
- 亲和反亲和?
10 terway 和flannel 的区别?
11 terway网络的路由信息存储在哪儿的?不然pod无法通行?
12 特定ip/端口网络连接占比?
13 tcp监控会关注哪些指标?
14 你会写哪些故障演练脚本?
15 二叉树底层节点之和?
16 一组进程,已知每个进程的启停时间,求最大并发连接数?
17 进程,线程,携程? 线程解决什么问题?携程和线程有啥区别?对编程有啥好处?
18 对于nodePort 类型的service,当service非常多的时候,如何突破nodePort限制?
19 --cpu-perid, --cpu-quota 底层咋监控的,实现的?
20 limit/request的定义底层咋实现的?
21 pod和容器的区别?
22 ros和terraform的区别?