Kubernetes培训叶伙荣(YeHuorong)bmyhr@163.com2016-01-28监控、调试K8S总体架构简介安全和资源管控调度和控制扩容、容错、升级、负载均衡、服务发现Agenda微服务K8S总体架构K8S是一个基于容器技术的分布式系统,•思想上的变革模块化思维(功能更加单纯,复用率高,高解耦)无需关心扩容、容错、负载均衡、通讯、安全、资源配额、服务发现等底层问题开发行为将由于“微服务”的理念而发生改变,•部署工作更加便捷和自动化将运行环境打包,它使得应用程序在开发、测试、生产系统中的运行环境没有差别具备自动部署能力•运维更简单监控、错误定位、安全、网络、容灾、扩容、资源管控等行为更加便捷微服务--Service微服务就是开发一个单纯的,小型的,有意义的功能作为一个单一服务。通过微服务,能够将主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。微服务的优点:•是一个体量小,用于实现一个特定功能或业务需求的系统•可以由一个小的开发组独立完成开发•松耦合,服务之间可以独立的开发和部署•可以用不同的语言开发•通过持续集成工具,可便捷地自动集成部署•易于理解,容易修改和维护•易扩展MicroServiceMicroServiceMicroServiceMicroServiceMicroServiceApp_1App_2传统应用架构微服务架构微服务--ServiceK8S中的Service是对象资源之一,一个K8SService是一系列pod的逻辑集合的抽象,同时它是访问这些pod的一个策略,有时候也被称为微服务。Service通过LabelSelector和Pod建立关联关系,并由Service决定将访问转向到后端的哪个pod。Service被创建后,系统自动创建一个同名的endpoints,该对象包含pod的ip地址和端口号集合Service分为三类:1.ClusterIP2.NodePort3.LoadBalancer安全—认证一个客户端访问某一个应用时,一般需要通过该应用服务端的多道安全防护,才能被服务端所接受。除了网络访问级别的(比如防火墙等)防护外,应用系统服务端一般会通过身份认证、授权以及准入控制三道措施来实现基本的安全防护。认证或身份鉴别,是指系统鉴别确认访问者身份的过程。如何保证以数字身份进行操作的操作者就是这个数字身份合法拥有者,也就是说保证操作者的物理身份与数字身份相对应,身份认证就是为了解决这个问题,作为防护网络资产的第一道关口,身份认证有着举足轻重的作用。身份认证包含如下几种方法:静态密码智能卡短信密码动态口令USBKEY生物识别K8S使用的认证方式为:客户端CA认证、HTTPBasic认证和Token认证三种方式安全—认证—BASIC认证在APIServer的启动参数中,加入--basic_auth_file参数如下:KUBE_API_ARGS=--log-dir=/var/log/kubernetes--secure-port=443--basic_auth_file=/root/basic_auth_file“在basic_auth_file中,包含用户名、用户密码和id信息,举例如下:使用基本认证方式从HTTP客户端访问APIServer时,HTTP请求头中的Authorization域必须包含“BasicBASE64ENCODEDUSER:PASSWORD”的值,其中”BASE64ENCODEDUSER:PASSWORD”为该访问客户base64加密算法加密后的用户名和密码。比如用户Thomas的密码为Thomas,通过下列代码访问APIServer:thomas,thomas,1admin,admin,2system,system,3tmp=`base64“thomas:thomas”`curl$APISERVER/api--headerAuthorization:Basic$tmp--insecure{versions:[v1]}安全—认证—TOKEN认证Token认证方式通过添加APIServer的启动参数“--token_auth_file=SOMEFILE”实现,其中“SOMEFILE”指的是存储Token的Token文件。目前,Token认证中Token是永久有效的,而且Token列表不能被修改,除非重启APIServer。Kubernetes计划在未来的版本中,Token认证的Token将为短期有效,而且是按需要生成Token,而不是像现在存储在文件中。Token文件格式为一个包含三列的CSV格式文件,该文件的第一列为Token、第二列为用户名、第三列为用户UID。当使用Token认证方式从HTTP客户端访问APIServer时,HTTP请求头中的Authorization域必须包含“BearerSOMETOKEN”的值,其中”SOMETOKEN”为该访问客户端持有的Token。例如Token文件中的内容为:lkjqweroiuuou,Thomas,8x7dlkklzseertyywx用CURL去访问该APIServer:curl$APISERVER/api--headerAuthorization:Bearerlkjqweroiuuou--insecure{versions:[v1]}Basic和Token认证都是防君子不防小人的,其安全性不够高,如果觉得证书认证太过复杂,可以用摘要认证来实现安全—认证—证书认证•加密算法:对文本进行编码,使偷窥者无法识别的算法•密钥改变加密算法行为的数字化参数•对称密钥加密算法编码/解码使用相同密钥的算法•非对称加密算法采用公钥/私钥的加密算法•数字签名用来防止报文被伪造或验证报文未被篡改的校验和•数字证书由可信组织验证和签发的身份识别信息安全—认证—证书认证加密算法:安全—认证—证书认证安全—认证—证书认证非对称加密:安全—认证—证书认证数字签名安全—认证—证书认证数字证书:安全—认证—证书认证HTTPSSSL握手流程:安全—认证—证书认证通过上述内容可知,使用CA认证的应用需包含一个CA认证机构(外部或企业自身)。通过该机构给服务器端下发根证书、服务端证书和私钥文件,给客户端下发根证书、客户端证书和私钥文件。因此APIServer的三个参数“--client-ca-file”、“--tls-cert-file”和“--tls-private-key-file”分别指向根证书文件、服务端证书文件和私钥文件。APIServer客户端应用的三个启动参数(例如Kubectl的三个参数“certificate-authority”、“client-certificate”和“client-key”),或客户端应用的kubeconfig配置文件中的配置项“certificate-authority”、“client-certificate”和“client-key”,分别指向根证书文件、客户端证书文件和私钥文件。Kubernetes的CA认证方式通过添加APIServer的启动参数“--client_ca_file=SOMEFILE”实现,其中SOMEFILE为认证授权文件,该文件包含一个或多个证书颁发机构(CACertificatesAuthorities)。安全—授权在Kubernetes中,授权(Authorization)是在认证(Authentication)后的一个独立步骤,授权作用于APIServer主要端口的所有HTTP访问。授权流程不作用于只读端口,在计划中只读端口不久的将来将被删除。授权流程通过访问策略比较请求上下文的属性(例如,用户名、资源和Namespace)。在通过API访问资源之前,必须通过访问策略地校验。访问策略通过APIServer的启动参数“`--authorization_mode”配置,该参数包含三个值,如下所列:“--authorization_mode=AlwaysDeny”“--authorization_mode=AlwaysAllow”“--authorization_mode=ABAC”其中,“AlwaysDeny”表示拒绝所有的请求,该配置一般用于测试;“AlwaysAllow”表示允许所有的请求,如果集群不需要授权流程,可以用该策略;“ABAC”表示使用用户配置的授权策略去管理访问APIServer的请求,ABAC代表Attribute-BasedAccessControl(基于属性的访问控制)。安全—授权在Kubernetes中,一个HTTP请求包含四个能被授权进程识别的属性:用户名(代表一个已经被认证的用户的字符型用户名);是否是只读请求(REST的GET操作是只读的);被访问的是哪一类资源,比如访问Pod资源:“/api/v1/namespaces/default/pods”;被访问对象所属的Namespace,如果这被访问的资源不支持Namespace,则是空字符串。由于通过过多的属性来实现访问控制会增加管理的复杂度,因此Kubernetes仅用四个属性来实现访问控制,并不希望添加更多的属性去实现访问控制。当APIServer接收到请求后,它读取该请求中所带的前面提及的四个属性。如果该请求中不带某些属性,则这些属性的值将根据值的类型设置成零值(例如为字符串类型属性,设置一个空字符串;为布尔型属性设置为false;为数值类型属性设置0)。安全—授权在授权策略文件中的策略对象,它的一个未设置属性,表示匹配http请求中该属性的任何值。请求的四个属性值和授权策略文件中的所有策略对象,逐个匹配。如果至少有一个策略对象被匹配上,则该请求将被授权通过。例如:1.允许用户alice做任何事情:{user:alice}2.用户Kubelet指定读取资源Pods:{user:kubelet,resource:pods,readonly:true}3.用户Kubelet能读和写资源events:{user:kubelet,resource:events}4.用户bob只能读取NamespacemyNamespace中的资源Pods:{user:bob,resource:pods,readonly:true,ns:myNamespace}该例子的授权策略文件ad.json,内容如下:{user:alice}{user:kubelet,resource:pods,readonly:true}{user:kubelet,resource:events}{user:bob,resource:pods,readonly:true,ns:myNamespace}安全—准入控制(资源配额)名称说明AlwaysAdmit允许所有请求通过AlwaysDeny拒绝所有请求,一般用于测试。DenyExecOnPrivileged拦截所有带有SecurityContext属性的Pod的请求,拒绝在一个特权容器中执行命令。ServiceAccount配合ServiceAccountController使用,为设定了ServiceAccount的Pod自动管理Secret,使得Pod能够使用相应的Secret下载Image和访问APIServerSecurityContextDeny不允许带有SecurityContext属性的Pod存在,SecurityContext属性用于创建特权容器ResourceQuota在Namespace中做资源配额限制LimitRanger限制Namespace中的Pod和Container的CPU和内存配额NamespaceExists读取请求中的Namespace属性,如果该Namespace不存在,则拒绝该请求NamespaceAutoProvision(deprecated)读取请求中的Namespace属性,如果该Namespace不存在,则尝试创建该Namespace.NamespaceLifecycle该插件