Skip to main content

常见问题

启动容器时,为什么要创建应用?

  • 应用是平台容器应用(原容器服务)暴露给用户的一个管理概念,通过选择一个“镜像”或者选择一个“编排模板”创建而成。
  • 我们推荐用户将自己的复杂业务应用划分成不同的服务组件,帮助用户管理不同服务组件的属性、数量以及组件间的链接。
  • 每个服务组件由相同镜像相同配置的一组容器组成,在容器服务里我们称作“服务”。

有状态服务与无状态服务的区别?

服务端所维护的与客户端的交互活动信息称为状态信息。

不保存任何状态信息的服务器称为无状态服务(Stateless service),反之则称为有状态服务(Stateful service)。

对于平台的服务而言,可以简单理解为:在应用运行过程中会保存数据或状态的服务叫有状态服务。

例如“MySQL”,需要存储产生的新数据;如果在运行中始终不保存任何数据或状态叫“无状态服务”,如Nginx。因为容器可以在不同主机间迁移,所以在宿主机上并不会保存数据,这依赖于平台的高可用存储卷,将存储卷挂载在容器上,从而实现“有状态服务”的数据持久化。

“我的服务”创建后,一直在部署中,是什么原因?

正常情况下,如果用户的容器停止运行,会重新部署。如果您的服务运行后,因为某些原因,就立刻结束了,那么就会导致系统不停的重新部署您的服务,这种情况很可能是镜像有问题,请咨询售后人员。

业务服务如何设置HTTPS?

使用服务出口来设置HTTPS,设置步骤如下所示。

(1) 设置条件

  • 设置HTTP端口:该服务出口需要配置服务域名(泛域名),然后设置该服务出口,映射服务端口协议为HTTP。
  • 绑定域名

img

(2) 添加证书:添加SSL证书,包括证书内容(PEM编码)和秘钥内容(PEM编码)。

(3) 使用应用负载均衡来设置HTTPS

a. 创建应用负载均衡器。

b. 在应用负载均衡器中创建HTTP/HTTPS监听。

网络CNI插件是什么?

目前使用较多的网络插件有flannel,calico,wear,Canel等,但是如果对比以上几种网络插件的性能,还是calico最受欢迎。

实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico。

  • Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些ip可以在host间路由,容器间无需NAT和port mapping转发就可以实现跨主机通信。Flannel网络没有提供Docker DNS服务,容器间不能通过hostname访问。
  • Weave对于容器来说,它就像是一个巨大的以太网交换机, 所有容器都被接入到这个交换机,同样容器间无需NAT和port mapping转发就可以实现跨主机通信。Weave网络提供了Docker DNS服务,容器之间可以通过hostname访问。
  • Calico是一个纯三层的虚拟网络,它会为每个容器分配一个ip,每个host都是router,把不同host的容器连接起来,从而实现跨主机间容器通信。与vxlan不同的是,calico网络不对数据包进行额外封装,不需要NAT和端口映射,扩展性和性能都很好。Calico网络提供了Docker DNS服务,容器之间可以通过hostname访问。

网络方案区别如下所示。

  • 网络模型

    • Flannel网络有两种模式:vxlan模式是一种overlay覆盖网络,而host-gw模式将主机作为网关,依赖于纯三层的IP转发。
    • Weave网络是一种overlay覆盖网络;
    • Calico网络也是一种纯三层的网络;
    • (overlay是基于vxlan的虚拟网络,可以将二层网络数据封装到UDP进行传输,在主机间建立vxlan虚拟隧道,实现跨主机容器之间通信)。
  • 分布式存储(Distributed Store)

    • Flannel和Calico都需要分布式健值存储数据库(key-values),比如etcd或consul。
    • Weave自己负责在主机间交换网络配置信息,不需要etcd或consul这些数据库。
  • IP地址管理(IPAM)

    • Flannel为每个主机自动分配独立的subnet,用户只需要指定一个大的IP池。不同subnet之间的路由信息也由Flannel自动生成和配置。
    • Weave默认配置下所有容器使用10.32.0.0/12的subnet,如果此地址空间与现有IP冲突,则可以通过--ipalloc-range分配特定的subnet。
    • Calico通过IP Pool可以为每个主机定制自己的Subnet。
  • 网络连通和隔离

    • 不同Flannel网络中的容器可以直接通信,Flannel没有提供网络隔离。与外网通信可以通过bridge网络。
    • Weave网络默认配置下所有容器在一个大的Subnet中,可以自由通信,如果要实现网络隔离,需要为容器指定不同的Subnet或IP。若要与外网通信,则需要将主机加入到Weave网络,并把主机当作网关。
    • Calico默认配置下只允许同一网络中的容器之间通信,但通过其强大的Policy能够实现几乎任意场景的访问控制。

跨主机通信时,整个通信路径完全没有使用NAT或者UDP封装,性能上的损耗确实比较低。但正式由于calico的通信机制是完全基于三层的,这种机制也带来了一些缺陷,例如:

  • calico目前只支持TCP、UDP、ICMP、ICMPv6协议,如果使用其他四层协议(例如NetBIOS协议),建议使用weave、原生overlay等其他overlay网络实现。
  • 基于三层实现通信,在二层上没有任何加密包装,因此只能在私有的可靠网络上使用。
  • 流量隔离基于iptables实现,并且从etcd中获取需要生成的隔离规则,有一些性能上的隐患。

Request与Limit的设置有什么区别

为了实现资源被有效调度和分配的同时提高资源利用率,Kubernetes针对不同服务质量的预期,通过QoS(Quality of Service)来对pod进行服务质量管理,提供了采用requests和limits两种类型对资源进行分配和使用限制。对于一个pod来说,服务质量体现在两个具体的指标:CPU与内存。实际过程中,当Node节点上内存资源紧张时,kubernetes会根据预先设置的不同QoS类别进行相应处理。

QoS分类:Kubelet提供QoS服务质量管理,支持系统级别的OOM控制。在Kubernetes中,pod的QoS级别:Guaranteed,Burstable与Best-Effort。下面对各级别分别进行相应说明。

info
  • Guaranteed,CPU/Memory必须request==limit,其余资源可不等,它是一类高 QoS Class,一般拿Guaranteed配置给一些需要资源保障能力的pods。
  • Burstable,CPU/Memory request和limit不相等,它是中等的一个QoS label,一般会为一些希望有弹性能力的pod来配置Burstable。
  • BestEffort,所有资源request/limit必须都不填,它是低QoS Class,通过名字我们也知道,它是一种尽力而为式的服务质量,K8S不承诺保障这类Pods服务质量。

创建应用的资源配置根据应用服务所需要的保障程度来选择。

(1) 平台默认的QoS Class为Burstable,在创建服务应用时可以根据业务需求设置资源。

如下图所示,平台提供了一些推荐的规格,如2X,4X等等,同时也可以根据业务需求自定义规格。

(2) 查看pod,验证规格配置。

服务访问设置

  • 对于服务的集群内访问,即访问同一集群内的某个服务,建议使用服务的集群内访问方式;
  • 对于服务的对外访问,出于安全性、性能方面的考虑,容器云平台不直接提供NodePort的产品化方式。在容器云平台上,提供两种ingress对外服务暴露方式。

集群网络出口

  • 服务部署默认使用租户/集群维度的网络出口(基于 Ha Proxy实现,支持 TCP/HTTP协议)。
  • 集群网络出口可设置三种访问方式,分别为公网访问、内网访问和仅在集群内访问(网络出口为基础设施管理员设置)。选择需要的网络出口,设置端口映射,将容器端口映射到服务端口。端口映射可以自动生成,也可以自己指定。服务端口是宿主机端口,指定端口时请避免冲突。
  • 集群网络出口HTTPS证书只支持域名,不支持IP。

应用负载均衡

  • 选择已经创建的应用负载均衡,设置监听器,即可实现应用负载均衡。应用负载均衡既是一种服务出口,也可以解决多个后端服务之间的流量分配。
  • 应用创建成功以及配置完成之后,返回应用列表,应用状态变为“运行中”时,查看访问地址,访问者如果在集群内,则使用集群内地址;反之,则使用集群外地址(内网或公网)。
  • 应用负载均衡HTTPS证书只支持域名,不支持IP。
  • 创建应用负载均衡的HTTPS监听器的时候,SSL证书需要签订域名,并且服务位置处填写的域名需要和这个签订的域名一致。

Ingress如何配置SSL证书?

5.x版本ingress ingress使用证书是key文件格式需要为rsa。证书创建命令为:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout k8s.key -out k8s.crt -subj "/CN=test.api.com"

key格式为rsa需要对key转换格式,转换命令如下所示。

openssl rsa -in k8s.key -out k8s.key

如何指定docker-compose网段?

进入相应服务目录,停止服务,运行如下所示的命令。

docker-compose down -v

修改 docker-compose.yml文件,以monitor服务为例,增加(注意对齐)。

networks:
monitor:
external: false
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.10.0/24
gateway: 10.10.10.1

注意每个服务networks的名称要和此处对应,例如:

monitor-metrics-probe:
networks:
- monitor
image: system_containers/monitor-metrics-probe:v3.0.0

启动服务,运行如下所示的命令。

docker-compose up -d

重启一次主机,确认修改无误。

Docker镜像构建慢,该如何处理?

在执行记录页面查看镜像构建情况,如下图所示。

test

原因:流水线构建镜像慢,因代码编译时产生大量临时文件,并且临时文件是.后缀的隐藏文件,删除时未删除掉。

解决:代码编译加入 rm -rf ./tmpbuild/.*,删除.后缀的隐藏临时文件。