云服务器内容精选

  • 排查项二:后端服务器健康检查是否有异常 在Service更新ELB后端服务器的过程中,为保证流量不中断,会先增加后端服务器,在确保新加的后端服务器可用后,再删除原先的后端服务器。 但在后端服务器配额已满的情况下,无法再新增后端服务器,会出现以上超出配额上限的错误,此时会直接更新已有的后端服务器。如果在更新Service时配置出现错误,导致更新后的后端服务器全部健康检查失败,在保证流量不中断的逻辑下,Service此时并不会删除原先正常的后端服务器,最终导致只有部分后端服务器更新为错误配置,其余后端服务器仍保持原先配置。 解决方法:在后端服务器配额已满的情况下,更新Service时需要配置正确的健康检查协议、端口,查看健康检查是否成功。
  • 问题现象 负载均衡型Service更新时出现错误,信息如下: (combined from similar events):Details:Update member of listener/pool(dc9098a3-e004-4e60-ac6c-44a9a04bd8f8/539490e1-51c2-4c09-b4df-10730f77e35f) error: Failed to create member :(error_msg":"Quota exceeded for resources: members_per_pool","error_code":"ELB.8905","request_id":"e064fd46211318ff57f455b29c07c821"},status code: 409
  • 解决办法 解决这个问题通常有如下办法: (推荐)在集群内部访问使用Service的ClusterIP或服务域名访问。 将Service的externalTrafficPolicy设置为Cluster,即集群级别服务亲和。不过需要注意这会影响源地址保持。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"traffic","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Cluster ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer 使用Service的pass-through特性,使用ELB地址访问时绕过kube-proxy,先访问ELB,经过ELB再访问到负载。 独享型负载均衡配置pass-through后,CCE Standard集群在工作负载同节点和同节点容器内无法通过Service访问。 1.15及以下老版本集群暂不支持该能力。 IPVS网络模式下,对接同一个ELB的Service需保持pass-through设置情况一致。 使用节点级别(Local)的服务亲和的场景下,会自动设置kubernetes.io/elb.pass-through为onlyLocal,开启pass-through能力。 apiVersion: v1 kind: Service metadata: annotations: kubernetes.io/elb.pass-through: "true" kubernetes.io/elb.class: union kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"traffic","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}' labels: app: nginx name: nginx spec: externalTrafficPolicy: Local ports: - name: service0 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
  • 问题原因 当Service设置了服务亲和为节点级别,即externalTrafficPolicy取值为Local时,在使用中可能会碰到从集群内部(节点上或容器中)访问不通的情况,回显类似如下内容: upstream connect error or disconnect/reset before headers. reset reason: connection failure 或: curl: (7) Failed to connect to 192.168.10.36 port 900: Connection refused 在集群中访问ELB地址时出现无法访问的场景较为常见,这是由于Kubernetes在创建Service时,kube-proxy会把ELB的访问地址作为外部IP(即External-IP,如下方回显所示)添加到iptables或IPVS中。如果客户端从集群内部发起访问ELB地址的请求,该地址会被认为是服务的外部IP,被kube-proxy直接转发,而不再经过集群外部的ELB。 当externalTrafficPolicy的取值为Local时,在不同容器网络模型和服务转发模式下访问不通的场景如下: 多实例的工作负载需要保证所有实例均可正常访问,否则可能出现概率性访问不通的情况。 CCE Turbo集群(云原生2.0网络模型)中,仅当Service的后端对接使用主机网络(HostNetwork)的Pod时,亲和级别支持配置为节点级别。 表格中仅列举了可能存在访问不通的场景,其他不在表格中的场景即表示可以正常访问。 服务端发布服务类型 访问类型 客户端请求发起位置 容器隧道集群(IPVS) VPC集群(IPVS) 容器隧道集群(IPTABLES) VPC集群(IPTABLES) 节点访问类型Service 公网/私网 与服务Pod同节点 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 与服务Pod不同节点 访问服务端所在节点IP+NodePort — 通 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 通 访问非服务端所在节点IP+NodePort — 无法访问 正常访问 正常访问 与服务Pod同节点的其他容器 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 无法访问 与服务Pod不同节点的其他容器 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 访问服务端所在节点IP+NodePort — 正常访问 访问非服务端所在节点IP+NodePort — 无法访问 独享型负载均衡类型Service 私网 与服务Pod同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问 DNAT网关类型Service 公网 与服务Pod同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod不同节点 无法访问 无法访问 无法访问 无法访问 与服务Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问 与服务Pod不同节点的其他容器 无法访问 无法访问 无法访问 无法访问 nginx-ingress插件对接独享型ELB(Local) 私网 与cceaddon-nginx-ingress-controller Pod同节点 无法访问 无法访问 无法访问 无法访问 与cceaddon-nginx-ingress-controller Pod同节点的其他容器 无法访问 无法访问 无法访问 无法访问
  • TCP健康检查的机制 ELB节点根据健康检查配置,向后端服务器(IP+健康检查端口)发送TCP SYN报文。 后端服务器收到请求报文后,如果相应的端口已经被正常监听,则会返回SYN+ACK报文。 如果在超时时间内没有收到后端服务器的SYN+ACK报文,则判定健康检查失败,然后发送RST报文给后端服务器中断TCP连接。 如果在超时时间内收到了SYN+ACK报文,则发送ACK给后端服务器,判定健康检查成功,并发送RST报文给后端服务器中断TCP连接。
  • 完整错误信息 java.io.IOException: Connection reset by peerat sun.nio.ch.FileDispatcherImpl.read0(Native Method)at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)at sun.nio.ch.IOUtil.read(IOUtil.java:197)at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)at com.wanyu.smarthome.gateway.EquipmentSocketServer.handleReadEx(EquipmentSocketServer.java:245)at com.wanyu.smarthome.gateway.EquipmentSocketServer.run(EquipmentSocketServer.java:115)