常见问题
启动容器时,为什么要创建应用?
- 应用是平台容器应用(原容器服务)暴露给用户的一个管理概念,通过选择一个“镜像”或者选择一个“编排模板”创建而成。
- 我们推荐用户将自己的复杂业务应用划分成不同的服务组件,帮助用户管理不同服务组件的属性、数量以及组件间的链接。
- 每个服务组件由相同镜像相同配置的一组容器组成,在容器服务里我们称作“服务”。
有状态服务与无状态服务的区别?
服务端所维护的与客户端的交互活动信息称为状态信息。
不保存任何状态信息的服务器称为无状态服务(Stateless service),反之则称为有状态服务(Stateful service)。
对于平台的服务而言,可以简单理解为:在应用运行过程中会保存数据或状态的服务叫有状态服务。
例如“MySQL”,需要存储产生的新数据;如果在运行中始终不保存任何数据或状态叫“无状态服务”,如Nginx。因为容器可以在不同主机间迁移,所以在宿主机上并不会保存数据,这依赖于平台的高可用存储卷,将存储卷挂载在容器上,从而实现“有状态服务”的数据持久化。
“我的服务”创建后,一直在部署中,是什么原因?
正常情况下,如果用户的容器停止运行,会重新部署。如果您的服务运行后,因为某些原因,就立刻结束了,那么就会导致系统不停的重新部署您的服务,这种情况很可能是镜像有问题,请咨询售后人员。
业务服务如何设置HTTPS?
使用服务出口来设置HTTPS,设置步骤如下所示。
(1) 设置条件
- 设置HTTP端口:该服务出口需要配置服务域名(泛域名),然后设置该服务出口,映射服务端口协议为HTTP。
- 绑定域名
(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。下面对各级别分别进行相应说明。
- 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镜像构建慢,该如何处理?
在执行记录页面查看镜像构建情况,如下图所示。
原因:流水线构建镜像慢,因代码编译时产生大量临时文件,并且临时文件是.后缀的隐藏文件,删除时未删除掉。
解决:代码编译加入 rm -rf ./tmpbuild/.*
,删除.后缀的隐藏临时文件。