常见问题

本页面提供关于Kubernetes容器服务的一些常见问题的解答

一般性问题

什么是Kubernetes容器服务?

Kubernetes容器服务整合了云主机、网络、云硬盘等服务,并支持GPU、ARM等异构计算架构,支持多可用区容灾等技术构建高可用Kubernetes集群,并提供高性能可伸缩的容器应用管理能力,简化集群的搭建和扩容等工作,让您专注于容器化应用的开发与管理。

为什么采用应用容器化部署?

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现。而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。

集群与网络、子网的关系是怎样的?

“网络”为您构建了一个二层隔离的私有网络环境,您可以定义二层网络中的三层子网, 三层子网用来管理云主机网络平面,提供了包括CIDR管理、网关、DNS等服务。 image.png

“子网”属于一个网络,一个网络可以有多个子网。根据实际业务需要可以设置不同规模的子网,一般可为10.0.0.0/8-24、172.16.0.0/12-24、192.168.0.0/16-24,其中最大的子网10.0.0.0/8的A类地址网络。同一网络下的不同子网通过挂载到同一个路由器,实现跨子网的通信。 集群是同一个网络下的一个或多个虚拟机(又称:节点)通过相关技术组合而成的计算机群体,为容器运行提供了计算资源池。 集群和网络、子网只存在下面2种场景:

  • 一个集群的节点在同一个网络的同一个子网。
  • 一个集群的节点在同一个网络的不同的子网。

如何查看集群的节点网段?

打开 产品与服务 -> 网络 -> 网络 image.png 找到具有k8s-cluster、集群名的标签的网络,打开这个网络的详情,就可以看到集群的网段。 image.png

如何设置Kubernetes容器服务集群中节点的子网网段?

Kubernetes容器服务集群的节点的子网网段只能在创建集群时设置节点的网段,一旦集群创建后,子网网络不可修改了。 创建集群时,默认是自动创建网络,默认网段是10.0.0.0/16。如果需要设置网段,需要创建集群前先创建网络,然后选择已有节点网络。

4.png

安全性问题

如何安全访问集群节点?

创建集群时需要设置SSH密钥对,用于外部客户端通过SSH远程登录Kubernetes集群的节点。

常见问题解决

集群创建

Kubernetes容器服务集群创建或扩容失败

问题描述

本文主要介绍Kubernetes容器服务集群创建或扩容失败时,如何查看失败原因,并通过更改配置或其它运维手段解决问题

详细信息

集群创建扩容失败原因很多,目前只能通过重建集群解决

错误可以归结为以下几点:

  1. 云平台配置有误,导致创建失败。Kubernetes容器服务集群创建,目前依赖底层的openstack,包括nova、neutron、keystone、heat、mariadb等组件。如果其中某个组件配置有过改动,有可能会导致集群创建失败。例如,如果修改了平台endpoint的根域名,但是在heat的配置中没有更新,会导致集群内访问heat时,访问不通。又例如如果如果集群内没有开启public vip,heat内配置还是pubic vip,也会导致集群创建失败。
  2. 云平台负载太高,导致创建失败。例如创建集群时,如果要创建的节点数量比较多,nova会去并发创建虚机,导致云平台负载很高。对于数据库、网络、存储都会造成很大的压力,导致虚机创建失败,集群创建超时并失败。
  3. 集群内部服务出问题,导致创建失败。例如创建集群时,集群内部需要与控制平面通信,才能创建k8s证书。如果当时网络延迟较大,导致证书创建失败,也会导致集群最终创建失败。

定位失败原因

可以通过以下步骤,查看错误原因定位问题,并根据相应的解决方法解决问题。

  1. 登录控制台,点击上部导航栏,Kubernetes容器服务 > 集群管理,鼠标放在创建失败集群的气泡框,会显示错误原因。

image.png

  1. 根据错误原因自行解决或者复制失败信息寻求运维人员帮助。

集群运行

无法连接状态

集群处于无法连接状态,一般是因为集群对外暴露的apiserver地址无法访问。导致这种情况可以归纳为以下几点。

  1. 云平台防火墙关闭了集群对外暴露使用的7443端口,这种情况,防火墙直接放行7443端口即可。
  2. 集群对外暴露的地址,是一个vxlan网络的地址,如果云平台出现问题,比如交换机或者配置更改,可能会导致地址无法访问。这种情况需要联系运维人员协助处理。
  3. 集群内部出现问题。所有的master节点服务全部down掉。master节点服务down掉,有可能是master虚机被人关机或者是etcd负载太高,导致apiserver一直重启。这种情况需要联系运维人员协助。

未授权或警告状态

  1. 未授权状态

    集群节点的规格是通过license控制,如果在云主机页面通过手工修改了集群节点的规格并超过了license的限制就会导致集群处于未授权状态。可以通过云主机页面重新把调大的规格改成小于license的限制。

  2. 警告状态

    当集群中有关键组件,比如controller-manager、kube-scheduler、etcd等等组件异常时,集群会变成警告状态。

    当集群中有节点not ready时,集群会变成警告状态。

    一般处于警告状态时,集群过一段时间会自愈变成健康状态,如果长时间没有变化,需要联系运维人员协助。

查看集群节点的CPU和内存规格

集群节点在创建时确定好以后,在扩容时无法更改。(Kubernetes界面无法修改,可以在虚机管理页面更改规格,但是会造成节点重启,有可能会造成业务中断)可以在集群管理界面查看集群节点的规格。

  1. 登录Kubernetes服务控制台。点击上部导航栏,Kubernetes容器服务 > 集群管理。点击集群名字,进入集群详情页。
  2. 选择节点管理tab,可以看到各个节点的CPU和内存规格,注意这里内存显示的是K8s集群内部容器可以使用的容量。image.png
  3. 点击基础资源tab可以看到虚机配置的cpu和内存规格。image.png

查看集群资源使用量

Kubernetes容器服务提供对集群资源量使用量的统计。

  1. 登录Kubernetes容器服务控制台。点击上部导航栏,Kubernetes容器服务 > 集群管理。点击集群名字,进入集群详情页。可以查看当前集群的节点数量,集群资源的使用量,容器数量及关键组件的状态等很多信息。image.png

如何访问集群节点

创建好以后集群以后,可以通过key或者初始密码登录节点。

  1. 登录Kubernetes容器服务控制台。点击顶部导航栏,Kubernetes容器服务 > 集群管理。点击集群名字,进入集群详情页,点击基础资源tab查看master节点的公网ip。
  2. 通过创建时指定的key可以登录节点,默认用户名是escore。例如ssh -i eks.key escore@10.100.3.157
  3. 通过密码直接登录。ssh root@10.100.3.157
  4. 集群登录的key和密码需要联系集群管理员获得。

集群删除后,pvc的数据是否保留

  1. 容器关联的持久化数据会保存在pvc里。pvc的保留还是删除通过删除集群时的选项控制的。

image.png

  1. 保留的pvc对应的数据卷可以在产品服务 > 块存储 > 云硬盘里看到 image.png

集群删除失败

问题描述

本文主要介绍Kubernetes容器服务集群删除失败时,如何查看失败原因,并通过更改配置或其它运维手段解决问题

详细信息

集群删除失败原因很多,错误可以归结为以下几点:

  1. 集群创建的资源被占用。集群创建完成后,会创建网络(创建时选择自动创建网络)、安全组、路由器等许多资源。如果有其它非集群内资源使用了这些资源会导致集群删除失败。例如创建虚机时,选择安全组或者网络选择了集群的安全组或者网络就会导致删除集群失败。
  2. 权限更改导致集群失败。每个租户在创建集群时,keystone会创建一个代理用户给集群使用。这个代理用户的权限继承自创建集群的租户。如果删除集群时,租户的权限被更改,代理用户和租户的权限比对失败,会导致集群删除失败。
  3. 集群创建或扩容失败,虚机创建失败,导致云硬盘没办法挂载到对应的虚机上一直处于挂载中状态。这会导致硬盘删除不掉,并导致集群删除失败。

定位失败原因

可以通过以下步骤,查看错误原因定位问题,并根据相应的解决方法解决问题。

  1. 登录控制台,点击顶部导航栏,Kubernetes容器服务 > 集群管理,鼠标放在创建删除集群的气泡框,会显示错误原因。

image.png

  1. 根据错误原因自行解决或者复制失败信息寻求运维人员帮助。

    针对上面错误的三种错误原因,解决方案如下:

    a. 资源被占用的情况。错误信息里会提示是安全被占用还是网络资源被占用,需要找到占用集群安全组或网络的虚机,删除相关虚机资源或者给虚机重新分配安全组或网络以后,再次点击删除集群。

    b. 权限更改的情况。可以直接再次点击删除集群或者把租户的权限改成创建集群时的租户权限再次删除。

    c. 创建或扩容失败的情况下导致删除失败的情况。这种情况一般就是云硬盘处于挂载中导致删除不掉。需要云管账户进到云硬盘页面,重置硬盘状态为可用状态以后,再次删除集群。

    d. 其它删除失败的情况可以联系运维人员请求协助。

集群网络

如何为Kubernetes容器服务集群事先创建节点网络?

Kubernetes容器服务集群对节点网络只要求节点ip互通即可,不限制网络的拓扑形状。 下面以一个网络2个子网举例EKS使用已有网络。

创建网络

  1. 点开网络
  2. 创建网络 1.png

创建子网

至少有一个子网就可以被Kubernetes容器服务集群使用。这里创建2个子网,只是举例。

创建路由器

  1. 点开路由器
  2. 创建路由器 2.png
  3. 连接子网
  4. 连接公网

创建Kubernetes容器服务集群

  1. 选择 已有网络

3.png 2. 3master节点选择99网络

  1. 2node节点选择99网络,2node节点选择88网络

4.png

如何设置Kubernetes容器服务集群中的容器网段?

在创建集群时,打开其他配置,设置容器组CIDR网络地址,就是EKS集群的容器网段。 容器组CIDR网络地址必须和服务CIDR网络地址不重叠,且容器组CIDR网络地址的ip数量小于服务CIDR网络地址的ip数量。

image.png

集群节点

扩容节点失败

注意事项: 同一集群下的节点镜像保证一致

排查项一:内存配额不足

问题现象:

Kubernetes容器服务集群扩容节点时,无法点击扩容按钮,提示"资源超过最大配额,点击查看详情" 扩容配额不足.png

原因分析:

点击查看详情按钮,查看总配额为204800M,已使用配额和新添加配额为231424M,超过了26624M

解决办法:

向管理员申请给集群所在租户扩大内存配额。然后再进行扩容

排查项二:license配额不足

问题现象:

eks集群扩容节点时,右上角提示"容器集群扩容失败" 扩容失败-license.png

原因分析:

打开浏览器F12按钮,查看扩容接口response提示cpu超过配额限制。

解决办法:

购买更高配额的license,重新导入再进行扩容。

存储

创建存储类失败

问题现象:

创建存储类时,选择集群时,下拉框没有可选择的集群。 创建存储类-无健康集群.png

原因分析:

查看集群状态,集群状态处于非健康状态,无法创建存储类。

解决办法:

查看集群告警原因,恢复集群为健康状态再创建存储类。

无法删除持久卷

问题现象:

删除持久卷按钮为灰色,无法删除。 持久卷删除.png

原因分析:

持久卷处于绑定状态无法直接删除。

解决办法:

需要先删除对应的pvc,再删除持久卷。

网络异常

工作负载网络异常时,如何定位排查?

排查思路

排查项一:容器和容器端口 先通过Kubernetes容器服务的网页找到pod的ip地址,下图中第4个字段IP地址就是pod的ip地址。 image.png 然后登录到集群内的节点或容器中,使用curl命令等方法手动调用接口,查看结果是否符合预期。 如果容器IP+端口不能访问,建议登录到业务容器内使用127.0.0.1+端口进行排查。

常见问题:

  1. 容器端口配置错误(容器内未监听访问端口)。
  2. URL不存在(容器内无相关路径)。
  3. 服务异常(容器内的业务BUG)。

排查项二:service和容器

  1. 打开网络管理,服务image.png
  2. 检查容器端口是否和容器内业务监听的端口一致。
  3. 如果是nodePort类型的服务,找到节点端口后,使用容器所在节点的IP地址+端口进行访问,并查看结果是否符合预期。

常见问题:

节点的入方向对业务端口未放通。 节点配置了自定义路由,并且配置错误。 pod的label与service的label不匹配(kubectl或API创建)。

添加Ingress失败或无法正常访问

Ingress基于七层的HTTP和HTTPS协议进行转发,是集群流量的入口,可以通过域名和路径对访问做到更细粒度的划分。集群在添加Ingress后,可能会出现无法正常访问的情况,本文提供添加Ingress失败或无法正常访问的通用排查思路,帮助您找到问题所在。

排查思路

Ingress作为集群流量的分发器,是连接外界和容器内业务的桥梁。 通过Kubectl创建Ingress是问题出现最多的场景,这里提供了几个重点排查项供您参考,帮助您快速找到根因。

排查项一:Ingress资源必需参数是否正确

如您通过YAML文件添加Ingress,首先考虑是否由于参数设置引起异常。Ingress通过annotations字段下的参数进行定义,K8s在创建资源时并不会对annotations字段参数进行校验,如果出现关键参数错误或缺失,Ingress资源也可被创建,但无法正常访问。

解决措施:

如通过Kubectl添加Ingress,请根据常见错误项进行检查,并检查关键参数是否存在填写错误的情况。若异常依旧无法排除,建议重新创建Ingress,确认基础功能可用后再添加自定义的高级功能。 建议通过Kubernetes容器服务网页添加Ingress,根据可视界面按需设置参数,自动过滤不符合要求的负载均衡及Service,能够有效避免出现关键参数格式错误或缺失的问题。 image.png

排查项二:Service后端容器端口是否正确

通过YAML创建Ingress时,需要正确填写目标Service名称及访问端口,然后确认Service中的容器端口是正确配置的,即Service可正常访问容器内业务。 通过Kubernetes容器服务添加Ingress时,将筛选符合要求的目标Service并自动填充对应的Service访问端口,您只需确认Service可正常访问容器内业务。

解决措施:

您需要确认Service中正确填写了容器内应用的暴露端口,在集群内的容器或节点上能够正常访问。

排查项三:容器内业务是否存在相应路径

Ingress进行转发时支持设置不同的访问路径,需要注意的是该访问路径是目标容器内业务真实暴露的路径,如业务不存在对应路径,访问结果将返回404错误,无法找到对应的内容。

解决措施:

确认容器内业务拥有相应的路径,将Ingress中的path修改为目标业务中真实存在的路径。

为什么访问部署的应用时浏览器返回404错误码?

4.png 如果返回如上图,表示没有相应的ingress配置。 其他404返回是业务返回,请排查自身业务。

为什么容器无法连接互联网?

当容器无法连接互联网时,请排查容器所在节点能否连接互联网。 登入节点,测试节点能否访问互联网。

网络的子网无法删除,怎么办?

网络的子网无法删除可能是因为您在EKS的集群中使用了该网络的子网,因此需要在Kubernetes容器服务界面删除相应的集群后,再删除网络的子网。 • 删除集群会将集群内的节点以及运行的工作负载和服务都销毁,请谨慎操作。 • 不建议在Kubernetes容器服务界面外删除管理Kubernetes容器服务集群的资源。 如何修复出现故障的容器网卡? 容器的网卡出现故障,会导致容器不断重启,且该容器无法对外提供服务。可通过如下步骤修复出现故障的容器网卡:

操作步骤

  1. 找到出现故障的容器image.png
  2. 删除故障容器的Pod之后系统自动为容器重建Pod,从而修复容器网卡。

工作负载

Pod处于Terminating状态,且无法删除

问题描述

当节点处于“NotReady”状态,或删除pod时,容器由于某些原因无法终止时,导致pod阻塞在Terminating状态。 image-20220121162756911.png

解决方法

可执行以下命令强制删除:

kubectl delete pods <pod> -n <namespace> --grace-period=0 --force

容器终端无法打开

问题描述

点击容器“终端”选项,终端界面无法输入 4a7becaf894ddc958d33aa5d9e8e396a.jpg

解决方法

可换为Google Chrome浏览器进入