开发者社区官方技术圈

阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。

阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。

借助于优质的阿里云云原生基础设施而实现的消息队列RocketMQ版,有如下的优势:

1.接入方便:创建即用,用户只需关注具体的业务逻辑,无需关注RocketMQ本身的版本迭代以及产品运维等方面的问题,极大的降低了用户在系统运维方面的成本投入。

2.架构先进:消息队列RocketMQ版将存储和计算分离,可以独立按需水平的扩展存储和计算,从而满足高效弹性运维和高性能大规格能力的诉求。

3.高性能:提供了单实例集群最高100万TPS稳定消息收发的能力,使用户在面对峰值流量场景,无需担心系统稳定性。

4.弹性低成本:在面对突发流量的场景时,往往需要预留大量Buffer资源,消息队列RocketMQ版提供了预留+突发弹性的组合能力,无需再去预留资源,节省机器资源;在存储方面实现Serverless弹性化,按量付费使用,在拥有弹性的同时,成本也更低。

5.运维更方便:提供了例如全链路Trace、Prometheus等可观测系统,丰富了运维可观测能力;还提供完善的OpenAPI能力,使用户可以集成自助运维系统。

6.金融级容灾:提供全球跨地域消息路由复制能力,支持毫秒级低延迟、自定义Topic级别数据备份同步能力;提供异地双活容灾能力,支持国内地域组建双活应用系统。

以上内容摘自《企业级云原生白皮书项目实战》电子书,点击https://developer.aliyun.com/ebook/download/7774可下载完整版

胡嘞嘞 评论 0

•ingress controller的本质是多一层nginx7层代理

•ingress controller本质是多一层nginx7层代理,默认情况下ingress controller svc使用的lb为4层 tcp监听,tls需要通过ingress配置来支持。对于七层节点来说,服务端如果需要采集客户端真实IP地址,需要采集XFF的header来确定客户端的地址需要采集XFF的header来确定客户端的地址

•ingress的后端或者证书更新的时候,svc的ep更新后,ingress也会重新reload backend,这之间是需要一个时间差的,这个差值一般在几秒以内,不会对业务产生影响。所以存在pod已经被从svc 的ep中移除,但是还为从ingress controller的backend移除,依然会存在请求打到老pod,所以建议在pod中设置prestop来进行优雅的关闭连接。

•Loadblance 类型的svc

•依赖slb的负载均衡算法 健康检查,白名单等功能,可以通过SLB的ACL名单,来控制SLB的访问规则。

•slb支持7层监听,可以将证书放到slb上来完成https的握手,但是slb与后端pod使用http协议通讯。 这时候如果集群内访问SLB IP其实链路是不经过SLB的,会被iptables规则直接转发到目的pod,无法建立http是连接

•默认添加的后端服务器是nodeport类型,Terway模式,优选eni类型,这样SLB会直接转发到目的pod所在的ECS的附属ENI上,避免了后端ECS上的多次转发

•NodePort类型的svc

•依赖节点本身具备公网ip,这种用法会比较消耗eip,需要每个ECS配置EIP来提供被公网访问的能力

•不同的pod所在节点公网能力有所不同,会增加运维成本,建议使用SLB的方式提供对外服务的能力"

以上内容摘自《企业级云原生白皮书项目实战》电子书,点击https://developer.aliyun.com/ebook/download/7774可下载完整版

胡嘞嘞 评论 0

i.偶发出访问不通-出口NAT网关:

如果您有大量访问公网的机器或者pod,公网NAT网关做为统一公网出口,需要留意NAT网关的性能上限(带宽,最大连接数,吞吐量),可通过nat网关监控确认是否有达到性能瓶颈丢包等行为。

-偶发性的负载增加导致链路中出现丢包。 如遇负载徒增的问题导致丢包,基于tcpip协议的特性会有自动重传,小量的丢包可以忽略,如果量级比较高(可自行评估可承受的偶发延迟率,如超过1%的请求超过1s不可接受),需要评估是否需要横向扩展或者提高宿主机的配置,可参考上面所属的亲和性打散,cpu-static的优化,使用alinux2系统以及使用最新的规格如7代实例等。

ii.持续出访问不通

-底层实例网络故障

•先判断节点到公网,节点到节点是否能通

-集群网络模式

•Terway模式,pod拥有独立于ecs的eni, 需要留意pod eni的网络环境 (路由表,安全组等)。Terway Trunk ENI支持为每个Pod配置固定IP、独立的虚拟交换机、安全组。

image.png

•Flannel 模式,pod出方向经由节点eth0, 由CCM组件自动添加pod网段对应下一跳节点的路由条目。若路由表项缺失,会造成pod访问或者回包异常。

image.png

-是否设置NetworkPolicy

•Terway-eniip使用Calico的Felix作为NetworkPolicy功能的实现; 在基于IPvlan的ENI多IP的IPvlan模式中Terway的NetworkPolicy是通过集成Cilium组件来实现。

•注意NetworkPolicy的限制范围:可访问公网服务的来源IP网段;只能被带有特定标签的应用访问;限制一个Pod只能访问指定地址;控制命名空间下Pod公网访问权限。

-是否开启Istio注入

•开启Istio注入,Istio-proxy会根据用户设置的isito 规则改写iptables规则,pod出入流量会被istio-proxy拦截处理。

-EIP:

•通常VPC内配置NAT网关提供SNAT出公网能力,如果某些ECS实例已经绑定了EIP,这些ECS实例会优先通过绑定的EIP访问互联网,而VPC内的其他ECS实例通过NAT网关的SNAT功能访问互联网,造成VPC内ECS实例的公网出口IP不一致,EIP单独的网络环境也会带来额外的问题。

•以上场景非最佳实践,可以通过为ECS实例绑定弹性网卡来解决公网出口IP不统一的问题。为绑定了EIP的ECS实例单独分配一块弹性网卡,并将EIP绑定到弹性网卡,这样来自互联网的访问流量会经过弹性网卡到达ECS实例,当ECS实例需要访问互联网时会通过NAT网关进行转发。

-安全组出口规则

企业安全组需要明文规定出口规则。普通安全组出方向默认全开。参考官方文档中总结。

以上内容摘自《企业级云原生白皮书项目实战》电子书,点击https://developer.aliyun.com/ebook/download/7774可下载完整版

胡嘞嘞 评论 0

对于集群内访问

svc:

•我们首先推荐集群使用svc 的 clusterip,此模式下,访问svc 的clusterip的转发模式取决于svc的internalTrafficPolicy配置,默认是cluster。 所以访问ClusterIP会被iptables/ipvs 规则默认转发到svc 后端的所有endpoint

•某些客户场景是通过lb类型暴露svc服务到集群外部, 同时配置lb的域名解析到lb的ip。而这个lb是提供给集群外和集群内访问。这种情况下,对于集群外部访问,lb可以均匀的转发到集群内后端的ep。但是对于集群内的pod访问svc的lb IP, 流量转发取决于externalTrafficPolicy的设置,一般情况下,ACK为Local模式,此时,客户端pod和lb后端的某个ep在同一个节点上时,流量才会被iptables/ipvs规则转发该节点上的后端ep上,而不会转发到其他节点上的ep。 这时候就产生了疑问,如何实现在集群内访问lb ip呢?可以给svc配置host(通过ervice.beta.kubernetes.io/alibaba- cloud-loadbalancer-hostname:""${your_service_hostname}""), 不过这种情况下,一般建议配置7层监听,如果是4层监听,可能存在访问回环的问题。

•有时不需要或不想要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 ""None"" 来创建 Headless Service。

可以使用一个无头 Service 与其他服务发现机制进行接口,而不必与 Kubernetes 的实现捆绑在一起。对于无头 Services 并不会分配 Cluster IP,kube-proxy 不会处理它们, 而且平台也不会为它们进行负载均衡和路由。 DNS 如何实现自动配置,依赖于 Service 是否定义了选择算符。

以上内容摘自《企业级云原生白皮书项目实战》电子书,点击https://developer.aliyun.com/ebook/download/7774可下载完整版

胡嘞嘞 评论 0

DNS域名解析请求是Kubernetes最高频的网络行为之一,其中很多请求是可以优化和避免的。您可以通过以下方式优化域名解析请求:

•(推荐)使用连接池:当一个容器应用需要频繁请求另一服务时,推荐使用连接池。连接池可以将请求上游服务的链接缓存在内存中,避免每次访问时域名解析和TCP建连的开销。

•使用DNS缓存:

•(推荐)当您的应用无法改造成通过连接池连接另一服务时,可以考虑在应用侧缓存DNS解析结果,具体操作,请参见使用节点DNS缓存NodeLocal DNSCache。

•如果NodeLocal DNSCache无法适用的,可以在容器内置NSCD(Name Service Cache1Daemon)缓存。关于如何使用NSCD缓存,请参见在Kubernetes集群中使用NSCD。

•优化resolv.conf文件:由于resolv.conf文件中ndots和search两个参数的机制作用,容器内配置域名的不同写法决定了域名解析的效率,关于ndots和search两个参数的机制详情,请参见DNS原理和配置说明。

•优化域名配置:当容器内应用需要访问某域名时,该域名按以下原则配置,可以最大程度减少域名解析尝试次数,继而减少域名解析耗时。

•Pod访问同命名空间的Service,优先使用< service-name>访问,其中service-name代指Service名称。

• P o d 跨命名空间访问Service , 优先使用< service- name> . < name -space-name>访问,其中namespace-name代指Service所处的命名空间。

•Pod访问集群外部域名时,优先使用FQDN类型域名访问,这类域名通过常见域名最后加半角句号(.)的方式来指定地址,可以避免search搜索域拼接带来的多次无效搜索,例如需要访问www.aliyun.com,则优先使用FQDN类型域名www.aliyun.com.来访问。"

以上内容摘自《企业级云原生白皮书项目实战》电子书,点击https://developer.aliyun.com/ebook/download/7774可下载完整版

胡嘞嘞 评论 0

•在Kubernetes资源(例如无状态应用Deployment)模板中配置拉取凭证(image-PullSecret)会导致免密组件失效,如果需使用免密组件,请避免手工配置拉取凭证(imagePullSecret)。

•如果部署的Kubernetes资源(例如无状态应用Deployment)使用了自定义的ServiceAccount,需先调整免密组件配置文件中Service-Account字段,使其作用于自定义的ServiceAccount,再进行部署资源操作。

•确认Kubernetes集群所属地域与要拉取的镜像所在的地域是否一致,默认配置只可以拉取本地域的镜像。如果需要跨地域拉取镜像,请参考下面的配置。(仅适用于公网拉取)

image.png

•使用自定义RAM角色的AccessKey ID和AccessKey Secret进行镜像拉取的情况下,需要把访问密钥写入configMap,这样存在一定的密钥泄露风险。请确定AccessKey ID和AccessKey Secret所属的RAM角色只拥有拉取容器镜像的相关权限。

•在集群中创建新的Service Account一段时间后,免密插件根据ACK集群默认权限生成的ACR私有镜像拉取Token才会更新到应用使用到的Service1Account中,使用Service Account的应用才会使用Token去拉取镜像。如果创建完Service Account之后立即创建应用则会出现因鉴权失败无法拉取的情况。

•免密插件默认覆盖ACK中所有命名空间中默认的ServiceAccount中的imagePullSecret字段。被覆盖的ServiceAccount会随着对应kube-system命名空间中acr-configuration配置项中的service-account字段变动而变动。(见上图)。

•在修改kube-system命名空间中的acr-configuration配置项时,请确认缩进是否与给出的场景的例子相同。建议直接复制对应场景的YAML内容到编辑器中,修改对应的值然后直接应用到集群,以保证YAML格式的正确性。

•企业版实例创建后,默认不允许通过公网访问。因此在配置公网的访问控制策略前, 需要先打开公网的访问入口。在打开访问入口之后, 会默认生成一条127.0.0.1/32的公网白名单。如果删除所有白名单,可以认为放开所有的公网机访问ACR实例。

•镜像太大,造成每次部署时候拉取速度慢,以及传统容器运行需要将全量镜像数据下载后再解包,然而容器启动可能仅使用其中部分的内容,导致容器启动耗时长。此种场景可以考虑P2P加速和按需加载容器镜像。

以上内容摘自《企业级云原生白皮书项目实战》电子书,点击https://developer.aliyun.com/ebook/download/7774可下载完整版

胡嘞嘞 评论 0

公告

阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。

展开