整理阿里k8s沙龙的相关知识
k8s架构master节点主要部署管控类应用,以稳定性为主。包含组件:etcd:存储所有集群数据。kube-apiserver:暴露k8s的API,这是k8s控制平面的前端,可水平扩展。kube-scheduler:调度器,当有一个新建pods没有注册到node上时,为它安排一个;调度因素有资源需求、软硬件及规则限制、数据本地化等等。kube-controller-ma...
k8s架构
master节点
主要部署管控类应用,以稳定性为主。
包含组件:
- etcd:存储所有集群数据。
- kube-apiserver:暴露k8s的API,这是k8s控制平面的前端,可水平扩展。
- kube-scheduler:调度器,当有一个新建pods没有注册到node上时,为它安排一个;调度因素有资源需求、软硬件及规则限制、数据本地化等等。
- kube-controller-manager:控制器的集合,包括node controller(当node下降时监控和响应)、replication controller(维护每个replication controller object的pods个数)、endpoints controller(连接services和pods)、service account&token controller(为新命名空间创建默认账户和api访问令牌)。
在启动kube-controller-manager时禁止cloud-controller-manager(和特定云供应商关联用),设置
--cloud-provider=external
。
- flannel: master节点与node节点上的pods需要通过pod网络通信,所以需要部署flannel。
同时只能有一个kube-scheduler、kube-controller-manager进程处于工作状态,如果运行多个,则需要通过选举产生一个leader。
Node节点
负责pod调度,整体资源为调度能力为主。
包含组件:
- kubelet:集群中的每个node节点都有,它能确保容器运行在一个 pod上。不管理非k8s创建的容器。
- kube-proxy:通过维护host网络规则及执行连接转发来实现k8s service抽象。
- container(docker): k8s支持的容器服务有:docker,rkt,runc等。
- flanneld:同master。
kube-scheduler
、kube-controller-manager
一般和kube-apiserver
部署在同一台机器上,它们使用非安全端口和kube-apiserver
通信;
kubelet
、kube-proxy
、kubectl
部署在其它 Node 节点上,如果通过安全端口访问kube-apiserver
,则必须先通过 TLS 证书认证,再通过 RBAC 授权。
Pod
- Pod是一组Container的抽象;
- Pod会共享同一个IP与文件系统;
- Pod是k8s管理的最小资源单位。
Service
- Service是k8s中访问端点的抽象;
- Service是通过label匹配资源的;
- Service是一种资源可以独立存在。(即不需要pod,只有service)
Replication Controller(ReplicaSet)
Replication Controller确保任意时间都有指定数量的Pod“副本”在运行。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。
目前不推荐在k8s上创建rs,更推荐的做法是新建Deployment来自动管理rs,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)。
Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。
可以参考jimmysong的文章。
看一个简单的Deployment及对应Service的部署:
#============one============
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: one
version: v1
name: one
spec:
replicas: 1
selector:
matchLabels:
app: one
version: v1
template:
metadata:
labels:
app: one
version: v1
spec:
containers:
- image: yubotao/istio-one:test
imagePullPolicy: IfNotPresent
name: one
ports:
- containerPort: 8180
---
apiVersion: v1
kind: Service
metadata:
name: one
labels:
app: one
spec:
ports:
- name: http
port: 8180
#nodePort: 30011
#type: NodePort
selector:
app: one
---
其他相关抽象就不一一例举了,比如Secret,ConfigMap,RoleBinding,ServiceAccount等。
推荐查阅jimmysong的kubernetes-handbook。
五个关键词深入理解k8s
1.抽象:最小部署单元为Pod,不同应用为Deployment,StatefulSet,DaemonSet等,接入层抽象为Service,存储抽象为pv与pvc等。抽象代表k8s能够覆盖通用场景的能力。
2.面向资源:除了常见的资源抽象,权限抽象为RoleBinding,秘钥抽象为Secret等,面向资源就可以通过yaml进行生命周期管理。
3.异步:在k8s中,大部分的行为都是异步的,异步的机制解耦了组件之间的联系,让k8s的升级和演进有更少的历史债务。比如新建Deployment时,Depolyment会生成对应的rs和pod等资源,这个过程就是异步的。
4.状态机:在k8s中有大量的Controller,Controller的作用就是保证一个资源是在正确的状态下,通过异步监听、定期刷新的方式实现自愈。
5.可扩展性:k8s组件之间要么是异步通过配置信息通信,要么通过API通信,因此只要保证API先前兼容即可,此外自定义的扩展。
阿里云容器服务k8s总览
就放图,不多bb,不是很了解。
比较复杂的网络问题
首先我们分配了一个网段192.168.17.0/24,然后两台虚拟机VM A和VM B分别取的其中一个地址,然后再通过路由表为不同机器上的pod分配ClusterIP。上图路由表为172.16.3.0 —> VM A;172.16.2.0—> VM B。
接下来就是外部路由寻址,通过什么策略来找到对应的pod呢?
首先我们看上图,讨论第一种情况:pod在本机上,如上图橙线所示。通过路由表,我们首先找到VM A,然后我们查找kube-proxy中的DNAT信息(DNAT 的全称为Destination Network Address Translation目的地址转换,常用于防火墙中。);然后通过本机上的网络插件,发现要寻找的ClusterIP:172.16.3.2在本机上,然后经过伪装将返回信息发送出去。
第二种情况:我们先进入VM B中,然后查找kube-proxy中的DNAT信息,发现所要寻址的ClusterIP不在这个机器上,然后回退到转换器上,按照路由表继续查其他机器。
以上内容,部分来自莫源
在阿里k8s沙龙上的分享。
编排:Deployment
- Deployment创建并控制Replicaset
- Replicaset控制pod数量
- Deployment通过控制好Replicaset实现应用更新
- 当pod被删除或节点失联,会立即自动创建一个新的pod,保证pod数量和预期一致。
以下是使用Deployment实现滚动升级的方式:
可以通过Deployment的rolling update功能实现(该功能rs不支持).
网络:Service、Ingress
Service
- 通过Label匹配pod(selector)
- 节点上的kube-proxy,修改iptables规则,实现流量分发。
- 支持类型:ClusterIP、NodePort、LoadBalancer
Ingress
- 支持七层路由
- 多个服务公用同一个LoadBalancer
存储:Volume、PersistentVolume/PersistentVolumeClaim
关于这块,最近也在了解阶段,理解的还不是很清晰,推荐文章.
以上内容绝大部分来自萧元
在阿里k8s沙龙上的分享。
网段
- 阿里云VPC网段:
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 - 交换机网段:
VPC网段的子集(可以和VPC地址一致)。同一VPC下的交换机网段不能重叠。 - Pod地址段:
Pod是k8s内的概念,每个Pod具有一个IP地址。创建集群时可以指定Pod段,不能和VPC段重叠。 - Service地址段:
Service也是k8s内概念,每个Service也有自己的地址。同样,Service地址段也不能和VPC地址段重合,而且Service地址段也不能和Pod地址段重合。仅限集群内使用。
网络结构
同一VPC多集群
跨VPC网络互联
阿里云针对k8s集群的安全保障
- 主子账号的授权管理
- 集群API支持STS临时授权
- 全链路的TLS证书
- 原生的Secret&RBAC支持
- 镜像的安全扫描
- 安全组以及公网访问
以上内容来自治世
在阿里k8s沙龙上的分享。
提问:一台worker节点最多可部署多少个pods?
答:首先pods个数受worker机器资源,每个pod所占资源影响;此外,为pods分配的IP网段也是影响pods个数的一个因素,需要把这个也要考虑进来。
通过上述介绍,相信你对于k8s已经有了一个大体的认识了,接下来就是精进相关方面的知识了。
这里分享几个对我很有帮助的书籍/项目/博客/文章等:
10分钟理解k8s核心概念.
k8s入门.
和我一步步部署k8s集群.
jimmysong的kubernetes-handbook.
更多推荐
所有评论(0)