整理阿里k8s沙龙的相关知识

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-schedulerkube-controller-manager进程处于工作状态,如果运行多个,则需要通过选举产生一个leader。

Node节点

负责pod调度,整体资源为调度能力为主。

包含组件:

  • kubelet:集群中的每个node节点都有,它能确保容器运行在一个 pod上。不管理非k8s创建的容器。
  • kube-proxy:通过维护host网络规则及执行连接转发来实现k8s service抽象。
  • container(docker): k8s支持的容器服务有:docker,rkt,runc等。
  • flanneld:同master。

kube-schedulerkube-controller-manager 一般和 kube-apiserver 部署在同一台机器上,它们使用非安全端口和 kube-apiserver通信;
kubeletkube-proxykubectl 部署在其它 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.

猜你喜欢

转载自blog.csdn.net/ybt_c_index/article/details/80401995
k8s