首页 > 云计算 > Docker/K8 > DCOS私有云容器化交付日常问题集
如下是在DCOS私有云项目交付过程中碰到的一系列问题整理如下:
|
问题1 |
DCOS 节点容器分布不均衡 |
|
问题描述 |
生产过程中,发现个别计算节点 CPU 使用率较高,其上的应用访问速度慢甚至异常的情况。
|
|
问题分析 |
发现该服务器上的容器数量过多,导致资源紧张。 |
|
解决方法 |
设置 Marahon constrains 策略为 hostname:GROUP_BY |
|
问题2 |
Calico 虚拟网络无法释放IP 地址 |
|
问题描述 |
当应用容器使用的 calico 虚拟网络中的 IP 地址,容器停止或删除, IP 地址无法从原来的容器中释放出来,导致其它容器启动的时候使用此 IP 时报服务已存在, IP 地址占用,影响应用容器启动。 Error response from daemon: container ebb091e0aabc5270fac970d0e26087495a6bdfd03f261a63558713d165bc1d40: endpoint create on GW Network failed: service endpoint with name gateway_ebb091e0aabc already exists Error: failed to start containers: ebb091e0aabc |
|
问题分析 |
发现192.168.0.33 在etcd 库里面注册了两个地址,最后导致路由表错乱了。 |
|
解决方法 |
1 、查看异常容器的 calico ip 地址 [root@dsv_app_06_04 ~]# docker exec -it 2b2 ip add -->10.x.x.132
2 、然后查看本地址容器 IP 对应路由 [root@dsv_app_06_04 ~]# netstat -rn|grep 192.168.0.33 192.168.0.33 10.x.x.132 255.255.255.255 UGH 0 0 0 eth1 发现 192.168.0.33 路由到 10.101.12.132 主机,路由策略错乱 正常应该如下: 192.168.0.33 0.0.0.0 255.255.255.255 UGH 0 0 0 eth1
3 、检查 etcd 数据库注册数据 在 etcd 服务端 10.x.x.21 排查注册信息 发现地址 192.168.0.33 真的写入到 10.x.x.132 ,因此需要删除这条注册信息 etcdctl ls /calico/v1/host/dsv_app_03_02/workload/libnetwork/libnetwork/endpoint/ etcdctl get /calico/v1/host/dsv_app_03_02/workload/libnetwork/libnetwork/endpoint/795211bd932ab94e85a7588a331f1c3e65f83820631b5e4b66c663eb3bfbc704 etcdctl rm /calico/v1/host/dsv_app_03_02/workload/libnetwork/libnetwork/endpoint/795211bd932ab94e85a7588a331f1c3e65f83820631b5e4b66c663eb3bfbc704
4 、启动应用容器 |
|
问题3 |
应用容器附件大小下载问题 |
|
问题描述 |
业务系统上传 10M 附件报 504 错
|
|
问题分析 |
用户的应用部署到nginx 容器中,统一应用访问入口走的nginx ,然后上传文件大小提示不能超过10M 大小,否则就会报504 Gateway Time-out ,其原因是nginx 端有一个参数可以控制了文件上传大小。查看到nginx.conf 配置文件client_max_body_size 2m 默认设置成2M 。
|
|
解决方法 |
修改 nginx.conf 文件 client_max_body_size 参数,调整如下: client_max_body_size 500m; 然后重启 nginx 服务。 说明:由于 nginx 是基础镜像,修改参数时需要重新封装基础镜像,然后二层镜像将应用打进去。 |
|
问题4 |
DCOS 平台持续构建问题 |
|
问题描述 |
DCOS 平台构建失败 |
|
问题分析 |
DCOS 平台构建失败,会有很多可能性的问题,像基础镜像不可用,目录权限问题。镜像仓库账号密码没有在jenkins 平台登录时导致镜像构建失败。 |
|
解决方法 |
登录 jenkins 控制台,打开构建历史,点击改状态条,进入详情页面,点击 Console Output ,查看构建 log ,就可以清晰的看到整个镜像构建的全部过程,报错也会在这里打印出来。
|
|
问题5 |
网络中断引起服务注册发现异常 |
|
问题描述 |
应用前台大范围报错: no available app found 。
|
|
问题分析 |
网络一直波动导致zk 频繁选举,web 从zk 中获取的app 信息未及时更新。 |
|
解决方法 |
增加 APP 节点信息定期对比校验机制。 |
|
问题6 |
HAProxy 健康检查异常 |
|
问题描述 |
测试过程中,发现基于 TCP 健康检测策略的 F5 设备出现 HAProxy 健康检测失败的情况。 |
|
问题分析 |
F5 TCP 健康检查时需要HAProxy 进行回包才能认为健康检测正常,而HAProxy 只是代理功能,无回包功能。 |
|
解决方法 |
修改 haproxy.cfg 配置文件 Timeout connect 5s Timeout queue 5s Timeout client 30s Timeout server 30s Timeout client-fin 30s Timeout server-fin 30s |
|
问题7 |
容器CPU 资源占用高 |
|
问题描述 |
生产过程中,发现个别应用容器的 CPU 使用率过高,出现 CPU 争抢情况,影响其他应用正常运行 |
|
问题分析 |
通过Marathon 设置的CPU 大小,无法限定容器CPU 实际使用大小,出现超高情况 |
|
解决方法 |
通过 marathon 设置 Docker 的 cpu-quota 参数,限制单容器 CPU 使用率 |
|
问题8 |
HAProxy 负载不均衡 |
|
问题描述 |
压力测试过程中,发现无论如何调整集群容器数量, TPS 一直上不去。 |
|
问题分析 |
通过对负载均衡HAProxy 的路由分析,发现请求分发并不均衡 |
|
解决方法 |
修改 haproxy.cfg 配置文件,将 balance 负载均衡策略由 roundrobin (轮询策略)修改为 leastconn (最小连接)策略。 |
|
问题9 |
Docker 容器日志旋转问题 |
|
问题描述 |
应用容器的业务日志默认打印到 docker 日志中,发现最近一段时间业务日志没有在容器中刷出来。 |
|
问题分析 |
Docker 默认日志参数设置成3M ,所以日志文件超过此参数值就会停止刷日志,需要对日志输出大小调大设置 |
|
解决方法 |
修改 /usr/lib/systemd/system/docker.service 服务启动参数文件,设置以下日志参数 --log-opt max-size=10m --log-opt max-file=3 然后重启 docker 服务 Systemctl restart docker |
|
问题10 |
业务容器与redis 服务网络不通问题 |
|
问题描述 |
客户反应业务系统无法正常访问,用户页面访问时无反应,页面会话互串。 |
|
问题分析 |
开发商已将session 持久化到redis 缓存中,一旦应用容器与redis 容器之间网络失联就会影响到用户会话失效,页面无法正常加载。 需要检查redis 容器是不是挂死或是服务已停止。由于应用容器之间通讯采用的是网桥模式,需要检查redsis 网卡启动模式。 |
|
解决方法 |
docker stop redis docker rm redis docker run -itd --name redis -v /home/redisdump:/usr/local/redis/dumpdb \ -p 6379:6379 redis:v3.2.3 测试应用容器与 redis 之间的网络 |
|
问题11 |
容器中的时区与语言的问题 |
|
问题描述 |
客户反馈启动的应用系统页面显示的时间不准确 |
|
问题分析 |
经检查数据库时间是准确的,而登录到应用容器里面确发现时间不准确,最终判断在打基础镜像的过程中没有将宿主机上面的/etc/localtime 时区文件没有同步到容器中。 |
|
解决方法 |
重新修改应用基础镜像,并将如下两条指令补充进去 dockerfile Form app ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "Asia/Shanghai" > /etc/timezone 然后用 docker build 命令生成新的基础镜像。 |
|
问题12 |
碰到网络问题,无法 pull 镜像包,需要配置网络代理 |
|
解决方法 |
1 、创建 docker.d 目录 mkdir /etc/systemd/system/docker.service.d 2 、创建 http_proxy.conf 配置文件 touch /etc/systemd/system/docker.service.d/http-proxy.conf http_proxy.conf 增加如下内容 [Service] Environment="HTTP_PROXY=http://proxy.example.com:80/" 3 、重启 docker systemctl daemon-reload systemctl show --property=Environment docker systemctl restart docker |
|
问题13 |
镜像数据问题 |
|
问题分析 |
由于容器重启后数据会被清空,所以 docker 中的数据需要通过映射存放到本地磁盘持久化 |
|
解决方法 |
启动docker 镜像的时候加-V diskPath:dockerPath 的参数。如: docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /opt/data/mysql:/var/lib/mysql -p 3306:3306 mysql |
|
问题14 |
docker 容器中 systemctl 问题 |
|
问题分析 |
在容器中使用 systemctl 报 Failed to get D-Bus connection: Operation not permitted 的错误,则在启动的时候把 sys/fs/cgroup 映射到 docker 容器中 |
|
解决方法 |
在容器启动时加入sys/fs/cgroup 与本地映射关系 docker run --privileged --name=test --hostname=test -v /sys/fs/cgroup:/sys/fs/cgroup image /usr/sbin/init |
|
问题15 |
Docker 的 network 已经被占用的情况 |
|
解决方法 |
1. 先删除容器 2. 使用 docker network inspect 网络模式( host 、 bridge )查看名字 3. 使用 docker network disconnet -f 网络模式 要删除的名字 |
|
问题16 |
docker 启动进程时提示报端口被占用 |
|
问题分析 |
端口被占用情况会存在以下几种情况: 一种是已经发布的服务端口占用,另一种是发布的服务中没有使用该端口 |
|
解决方法 |
1. 选择停止所有容器 2. 停止docker 服务,systemctl stop docker 3. 释放网络策略与停止docker0 网卡 iptables -t nat -F ifconfig docker0 down brctl delbr docker0 docker -d 4 、启动docker 服务,systemctl start docker |
有需要的朋友可以关注我的公众号,文章每日一更
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28833846/viewspace-2724924/ ,如需转载,请注明出处,否则将追究法律责任。