00:00
啊大家好,我是呃,腾讯云容器团队的那个架构师邱凯,我主要负责华南这边咱们客户啊,在云上使用容容器或者云原生化,会会会会给大家提供一些对接,或者是一些啊这种呃这种工作就是我我我会深度参与到咱们客户在这个云原生化这个过程里面啊,啊他们的输出的方案,或者说遇到一些问题啊,我都会给予一些啊反馈给我们的产研团队啊,然后给大家呃一个反馈,同时也会把中间的一些啊收益,然后拿出来给大家分享一下。我们先看一下,就是刚刚陈老师其实也有讲过说呃,咱们在挑选so类或者KS的时候呢,是希望啊走云源生路线,希望不要被厂商绑定了,那我作为一个厂商的一个员工,那我我我们怎么办啊,所以说这里呢,那我们只能呃向大家走一步,对吧,向大家走一步,我们会选择把云先生的这些技术比较成熟的这些产品呢,我们把它做成一个托管服务啊,提供给大家啊,就大家在不希望被技术绑定的同时,又能直接通过我们这个云原生产品的产品来消费云上的资源。
01:19
那这里呢,全景图里面呢,呃我就不一一展开讲了,就说呃就就讲一下,就说我们是希望大家呢,能够更加关注咱们的业务啊,包括咱们的呃资源的编排,调度监控啊,日志啊,CCICD这一块呢,就细大家可以嗯不用太关注细节,我们可以提供整套的这种呃兼容云原生的这种啊方案,然后呃,那我们最近在做什么事情呢?就是说我们从一六年开始做容器到现在的云原生这个产品矩阵啊,我们整个团队呢,呃在做什么事情,其实我们呃我我先先说一下结论啊,我们99%的客户呢,他们倾向于把这种呃底层的S资源呢,托管给腾讯,也就使用我们腾讯的呃托管容器去做KPS,然后呃。
02:12
我们在资源的弹性扩容,就是大家可能关注的资源的弹性扩容啊,然后和我们的这种呃,降本这块呢,我们呃可以说是做的比较好的,呃,因为客户会通过这种诉求,他反推着我们啊,就是我们推出。基于社区,呃的那个。节点之外呢,我们推出了一个叫超节点,叫原先节点,一个是超节点呢,它的主要逻辑是说通过咱们的。虚拟机啊,一个虚拟机它就跑一个pod啊,来实现咱们很好的资源的弹性和隔离性,也就是咱们今天要讲的一个超节点,然后另外一个呢,我们是有一个原生节点,然后可以做到一个比较好的一个降本效果,那同时呢啊,我们也做到了把那个函数啊,就刚刚也有讲到,陈陈总也有讲到,我们把这个函数可以和容器结合啊,对没错,我们这里也是一样的,我们的SCF也可以跑到我们的容器上面。
03:14
呃,那针对呃刚刚的问题就是说,诶,其实我们整个客户呢,他在资源的弹性降本这块做的比较好了,那我们这个时候呃,看一下中间有遇到一些具体问题啊,因为今天我们可能会比较聚焦在安全这一块,好假设一下,假设我们现在是一家金融公司,对吧,我们有很多啊虚拟机的服务器,我们已经基于我们的虚拟机啊,做了我们的这种安全的,比如说我们我我们过了等保对吧,我们啊证监银监或者是保监会啊,对我们安全团队有一些要求,我们已经基于安全组合acl呢,我们做了一些我们的一些安全的啊,这种能力啊,已经集成到现有系统里面去了,我们可以看一下。啊,我们的业务呢,可能是按照子网划分的啊,然后呢,不同的子网里面呢,我们会放一些啊不同类型的业务进去,对吧,然后我们的数据库呢,啊,我们的数据库啊,它会针对我们的业务子网进行放通,对吧?啊甚至我们做的好一点的时候呢,可能我们可以看一下下面这个安全组,安全组的这个规则,我们的数据库安全组可能是直接是对我们的呃服务器进行进行。
04:23
点对点的一个放通对吧,这是一个,呃,这是一个,呃,可以说在虚拟机里面大家基本上都是这样用的,但当然他可能还有更复杂的acl,这个我们先先不看啊,说它的场景是什么,我们用的,呃,我们这样用其实一直也没有问题,因为我们在用虚拟机的时候呢,虚拟机的这种资源它可能不像容器这样。弹性对吧,经常的扩容,所以说我们在这样用它其实没问题的,我们把这个问题呢,拿到容器里面看啊,比如我们现在正在做云原生啊,这个时候我们碰到的问题是说我们需要用原生化的这种啊容器,我们去替代传统的虚拟机,那这个时候带来一个最显著的问题,就是说我的资源啊,因为我我可能为了降本,我不可能统一大堆服务器在这对吧,我需要我用的时候我要扩,不用的时候我要缩,那这个时候我们会发现啊,容器在缩,资源在扩,扩容,那po它也是会有扩容,那上面的IP它会经常变,变的时候就会带来一些问题,那我们怎么去管理这些经常变化的这种容器的IP呢?啊,对吧?那。
05:25
其实最简单的方案就是说,诶,我们虚拟机时代怎么管我们容器怎么管我们我们我们大概率我们也可以把容器把它划成啊,按照那个子网划分啊,划成划成划成一个子网,就是做一个业务域,我们把容器就调度到这个子网里面,我们的这个数据库呢啊,我们的数据库的安全组,之前是IP对IP的放东,我们改成网段对数据库的放东,诶这个好像呃没有问题对吧,其实大部分的公司啊,如果对安全没有强诉求的话,其实做到这一步应该也就是现状了啊现状了,那但是他带来的问题是什么呢?是说。
06:00
第一个问题是我们的业务越来越多的时候,你需要管理越来越多的子网,对吧,子网的数量啊,并且子网的IP也是一个问题,比如说我现有的业务我扩容,我超过了这个子网的IP的一个呃,一个限制,这个时候你还要去调整或者加一个子网进去,对吧?啊,这个管理复杂度是比较高的。第二个是说,呃,我们呢,这个子网的这种网段啊,它并没有做到对IP的,就是单个IP的一个放通,就说比如说呃,如果说啊,被黑到这个知网里面去了,他。呃,一台虚拟机,它是有权限可以访问这个数据库的,对吧,或者是一个容器,它它也是有权限可以访问这个数据库,这个不太符合我们对安全的一个追求,我们可能要想办法把它再优化一下啊,基于刚刚两个诉求啊,一个是对子网的管理的成本,一个是点对点的安全,我们再看一下下一个方案啊,这个方案呢,是曾经在呃一段时间之内,我们认为的一个最佳方案啊,所以说我们可以认为它叫一个2.0的时候,就是我们,哎哎,前面讲到是说我们按子网去划分业务域啊,这种情况对子网的管理成本呢,太高了,那我们能不能把它混到一个子网里面来,一个子网里面呢,我们能跑就是所有的这种业务,AI业务B都跑到一个子网里面来啊,可不可以啊,是可以的啊,那他去访问数据库的时候呢,我们或者是访问其他业务的时候,我我们怎么去管理他的安全呢?那这里我们想到了一个办法,就是说诶。
07:26
我们容器呢,就是有一个特性啊,就是我们可以做到固定IP,那我们能不能把这个pod的IP给固定住,这样的话他去访问数据库对吧?啊,我把白名单给他开了,他就OK了。好,这个这个我们当时的核心思路啊,我们是通过固定IP去解决的,在这里会碰到几个问题啊,就是第一个我们容器呢啊,创建的时候,对吧,你怎么去快速的去给这个安全组去打开这个安全组,因为固定IP它只能解决在pod迁移啊,就是我在漂移,我滚动更新的时候,这个IP它不变,那销毁的时候呢,那怎么把这个安全组撤销掉,所以说我们我们想我们的service就是我们容器里面的QS service是一个什么原理啊,Service就是监听APSO的啊里面去拿到endpoint的变化数据,对吧,去修改,比如是CLB的underpoint,那我们这个能不能仿照这个逻辑去,我们去监听破的变化,然后去动态去调整安全组啊,对,没错,我们整个思路就是说。
08:27
啊,我们会写一个旁路的控制器啊,写一个controller,它会去监听pod的变化,然后根据pod的情况啊,去到指定的安全组里面去啊去。注册啊,就打开他的安全组啊,就加一个加加一个加一个安全组策略啊,销毁的时候去删除这个安全组策略,它带来的问题是什么呢。这个呃,我们我们我们用起来没问题,但是因为我们去开通安全组的时候,会会需要调用一个云API,这个云API呢,他可能不是说立马能够去呃去及时响应,或者是说安全组啊,可能他他他他要开一会,那这个时候业务呢,如果这个时候启动的时候,他可能嗯不太能够立刻访问数据库,他会报错说我们又想了一个办法,在这个容器的,在这个容器的启动的时候呢,给了给了他一个啊。
09:21
初始化容器去做一下阻塞,我去判断一下,诶能不能这个数据库能不能通啊,能通OK我再起,不能通我就我就我就不起,那这个时候我们可以看到整个方案呢,其实是一个可交付的状态啊,但是它还会有一些弊端,第一个是说我需要额外维护一个初始化容器,第二个是说我需要去。啊,我我需呃我需要去调这个云API去开通或者是销毁这个安全组啊,云API的可能大家呃嗯没有细关注过,云API它是有一个QPS的一个限制的,就是说你去调API的时候,它不会特别快,当我们容器规模特别大的时候,你去反复调用云API,他这里可能会排队啊,所以说我们评估了这个方案是OK的啊,并且大家可以在我们和呃和和和云商都能找到类似的一个插件啊,去去做这个事啊,所以我们觉得这个方案他可以行,但是呃在大规模实践的时候,可能还需要再优化一下啊。
10:24
然后到后面发展到我们,我们我们看到我们的。安全组它提供了一个能力,就是说安全组它可以对安全组放通,那另外一个呢,就是我们的超节点,我们的超节点刚刚讲到我们的超节点它是用一个虚拟机去跑一个破的,那一个虚拟机跑一个破的,它在带来弹性隔离性的时候呢,啊,它能够去绑定一个网卡,独立的网卡啊,独立的网卡上可以绑定一个独立的安全组,好,那基于安全组对安全组的放通和。我们的pod能够去独立绑定安啊绑定安全组这样一个能力,我们啊给客户交付交付了一个方案啊,我们来看一下。
11:07
呃,在整个方案里面呢,我们就不一样的,我不限制你的这个业务往哪个子网去调度啊,因为这个时候我不需要用这个子网去做你的业务域。然后呢,我们。在这个能力上呢,我们先抽象一下,我们提供一个啊,比如说我们,呃,在我们的安全团队给我们的业务团队提供一个界面啊,就是说安全团队会去配置什么业务,比如说业务A可以访问数据库A啊允许对吧,这个逻辑呢,是安全团队他他他他他明白的,他能够配好的,那底层呢,我们根据他这个配置呢,就它的配置的行为,我们下面自动去翻译,我们把这个业务A。带的这个破全部打上安全组A,把它对应的这个数据库打上安全组一。啊,这个这个过程自动化是挺容易的,对吧,因为你只要定义到这个上面,我们下面做一个安全组的翻译,其实很容易的,OK,我们再根据这两个啊数据啊,啊两个数据,我们再做一个事儿,我们写了一个旁路的控制器,我们把所有打标签的啊,打了这个A业务标签的,我全都跟他绑上安全组。
12:16
啊,就是我们有一个控制器,这个控制器的参考压码就是是这样的,大家可以看一下前面就里面其实就是两个关键参数,一个是说我的业务的这个标签是什么,一个是我要保什么安全组,我这个控制器收到就是拿到这个压码之后,在你所有pod启动的时候,我会给你拦截啊拦截跟你跟你的这个在pod启动时,因为它其实创建安全,创建虚拟机嘛,创建虚拟机的时候,我就会把这个安全组给你绑上,说这个po启动的时候呢,都会带上业务。都会带上业务相关的一个安全组,那这个时候同样呢,还有一个逻辑就是说我这里配了安全组到一的一个放通,说我还需要用云API去去在这个安全组这个一这里的去放通一下这个安全组A。对吧,那这个时候我的破D它启动的时候,它代表是个安全组啊安全组A,它去访问这个一的时候,因为已经放通过了,它是可以访问的,说这个时候我的破D的扩容缩容调度。
13:10
它的整个生命周期都是和这个安全组绑定的,我们发现在这个方案里面的我们安全组,它其实就承载了我们整一个一个安全域的这样的一个作用啊,所以说这个方案呢,我我们认为它是一个可交付的方案,并且是可以大规模实施的,那它的它的上限是多少呢?整个呃安全组的这个条目应该是呃2万啊2万,所以说是一个相对一个比较大的一个一个111个数字啊,可以可以在大家的那个呃生产里面啊,是可以推荐使用的一个方案,好这个方案呢,呃,我们觉得还不错啊,因为他他能做到是说第一个从底层逻辑上来说,他是把这个呃安全和安全,就是业务的行为和安全的行为进行分离了,因为业务的同学还是写M,他写破的,他只用告诉K8S说我是谁给自己打标签啊,给自己打标签,然后我们安全同学去配置安全访问策略啊,这个安全访问策略啊,就可以完成整个安全的一个啊,一个一个一个实施。
14:11
过程。那这个方案呢,提交给我们的客户之后,我们的客户他给了我们一个更好的一个反馈。给大家也给大家分享一下,他觉得在上一个方案里面呢,我们对一个业务呢,需要用安全组A安全主机来去描述啊,一个是目一个云端,一个目的端,如果他们需要做双向放通的话,那个配置规则还挺复杂的啊,对吧,那能不能把这个。相关的一个业务就浓缩在一个安全组里面呢。啊,所以说啊,咱们给了一个让咱们的客户反馈的一个更好的方案是说。在这个业务A啊,这个业务A里面呢,全部用这个安全组A,安全组A呢,他对自己进行放通,所以说后面的所有的业务的port和数据库,他都打到一个安全组里面。
15:03
然后他们之间就可以互访了,不管说咱们的容器进行扩容还是扩容啊,或者是说我们的数据库进行扩容缩容,因为我们的数据库也是支持。啊,就是扩容扩那个扩只读实例出来对吧,那我们在这种模式下都是通通可以满足出,并且他的管理成本啊特别低啊,所以大家可以看一下,这应该是啊,是目前云上的一个啊,比较理想的一个一一个实践一个实践方案了,所以整体上它是可以用一个比较低的成本,在语音上能够去解决,大家对。我们的业务去访问数据库的这样的一个管理,就不用大家去折腾固定IP啊,也不用大家去分子网了啊,就全部统统搞定了啊,这这是这是这是我们对网络破的。在访问网络的时候,一个一个访问控制,我们再看一下。仅仅是说我的破的访问数据库好像不太够啊,对吧,那举个例子,我们这个时候,呃,因为这讲的是网络这一块嘛,那有没有应用这一块呢?啊呃,最明显的例子就是说我们在配数据库访问的时候,我不仅要配安全组的访问,我还得在数据库里面配上这个数据库的账号,对吧?在数据库里面配一下这个数据库账号,艾特一下IP地址,我来通过账号密码还要去限制一下,对吧?所以说我们在云上来也是一样的,就是说呃,我我我能不能。
16:30
在上面也做一点事情啊,我们先看一个简单的例子啊,这个例子就是说我们有一组应用,他要去云上去访问咱们的cos啊,就是啊对象存储啊,去访问的时候呢,这这是一个很正常的逻辑啊,就是说呃,我的pod可以访问呃存储桶A不能访问存储桶B啊这个是怎么做啊,很简单对吧,我们在云上呢,我们去申请一个子账号,这个子账号绑定一组策略啊,这个策略就是腾讯云的。com策略啊,这里面呢,呃一段接就是表示说他允许访问存储统A,它不允许访问存储统B啊就这么一个策略,它和这个他和呃子账号进行绑定,我们从子账号上面呢,拿到一个访问密钥啊,就是咱们APM密钥,这个密钥呢,通过这个容器里面的SDK,对吧?Cos SDK就是你通过环境面量,或者说通过配置文件把它塞进到这个SDK里面去,这个SDK他去访问cos的时候,他可以通过这个看不健全,他能够去控制它能访问A还是不能访问B,这是一个很正常逻辑,对不对?但这个时候有个问题啊,那我们的这个security ID。
17:30
K,它是一个静态的啊,就和咱们账号密码啊,数据库账号密码一样的连接串一样的,我们我们存哪,我们是通过环境变量注入进去啊,还是通过配置文件给他。是吧,我们是不是要想办法去把这个sid SK给藏起来,因为这个东西一旦泄露,就代表你子账号的权限泄露了。那这个时候怎么办啊,有有没有一种办法能够去自动的去轮转,所以说我们其实也希望有这样一个一个东西出来啊,我们再看一下在KS里面怎么解的,KS里面呢。
18:01
呃,我们的KSAPSO它是可以做一个OIDC的一个,呃,111个一个provider,它可以接入到我们的camera里面去啊camera里去,然后我们的APISO呢啊就是我们的API,我们的po在启动的时候呢,我们一般会给它指定一个service count对吧,这个可能大家有关注过,就是我们用什么样的账号去启动这个破的好,这个收费的count呢,实际上的本质它就是一组脱N对吧?啊那那那我们能不能去把这个通过这种方式去。结合一下啊,结合一下我们我们来看一下,我们首先呢,我们还是一样的,我们先要定义定一个云上的角色,他有什么权限啊,有有什么样的权限,就把我们刚刚那个权限啊定义给这个角色啊,这个角色呢,我们我们通过这个OIDC啊,我们和这个设备的count进行绑定啊,当然这个绑定啊,可能是大家要去写一下雅M去配置一下啊,我们先把它抽象一下,具体的这个实现方案,我们在会后有文档大家可以看啊,我们把这个角色和这个设备的count进行绑定,Service service count呢,我们就把他的票据注入到这个pod里面去,这个pod的它的STK在访问的时候,他不再拿着service,呃,Service,那service ID和service。
19:12
就是security ID security k去访问这个po,他是拿着token,他是拿着个serve count的这个token去访问啊这个CA,这个CA呢,他他本来他是不认识,他也不知道你你这个KS颁发的这个sa的token,我我我凭什么认啊,我也不认啊,对吧,但是我们在这里不是给他注注册了一下吗?注册一个注册成他的一个适配器,所以说这里他不认的时候,他会去问。这个APISO,这个是不是count是不是啊,是不是你颁发的,那当然说是吗?对吧,是他就他就认证过了,他就会找到相关联的角色啊,就会把这个权限对他进行放通。啊,通过这么一个关系,就是说诶,我们好像就是把这个security t square k就托管给了我们的KS的一个service和count,啊这样形成了一个呃,把我们的密钥藏起来的这样一个动作,那整个过程呢,它是没有人工干预的啊,就是咱们也不用去啊,去找个API把这个呃下下下来,然后再通过什么方式拷贝环境变量,拷贝到程序里面去,没有这个没有这个过程了啊,没有这个过程。
20:17
那放到更复杂的场景里面呢,啊OK,放到放到更复杂场景里面呢,我们我们我们我们再讲一个就是刚刚数据库的那个那个那种情况,哎,我们其实可以呢,就是用同样的方式去访问数据库,但是呢,呃,可能需要大家换一下。DB的那个驱动啊,所以这个成本可能太高,我们换一个走动方案,我们是不是用能用同样的方式把我们数据库的账号密码也给藏起来啊,所以说我们一样的,我们数据库它会把密码写到我们的这个,呃,SSMSSM后面呢,会对接我们的那个K啊,那个KMS啊,对吧,就是我们有个密钥服务,我们把数据库把密码放到这个SSM里面去,然后我们通过前面这个逻辑呢,就是我们绑定到这个pod,这个pod可以从这个SSM里面把这个密钥给把我们的连接字符串啊给拿出来,然后去访问数据库啊,这样一个过程呢,你会发现你的数据库密数据库密码啊,甚至可以做到不需要人工干预啊,不需要人工干预就能够直接你的破D,通过一个有权限的这个sa起来,他就能去访问数据库,我们这样也可以把那个数据库密码给藏的比较好,好那。
21:28
整个逻辑呢,这个通过密码访问数据库啊,这条路径和我们前面的上面的那个破的访问。呃,控制那个逻辑就挂关联起来了,就说我们的一个容器,它能访问数据库,它需要先通过这个service count去拿到密码,然后呢,再通过我们前面配的那个安全组合标签,他才能去啊,去访问到我们的数据库。那整整个方案呢,就形了一个,呃,形成了一个在我们的超级点上对访问控制的一个闭环,就是不管是说对我们的安全组也好,还是对我们的这个云上资源也好啊,都是可以去啊,去做一个很好的管理啊。
22:09
啊,上面两个方案呢,实际上我们在腾讯上也是有文章,就是它的实现细节啊,在这里就大家有空的话也可以去看一下啊好吧,那今天我的分享就到这。
我来说两句