图2 CreateDb流程
Pod 一直处于 ContainerCreating 或 Waiting 状态
问题分析
在云托管的 K8S 服务环境下,默认挂载的 Volume 通常为一块存储类型的云硬盘。如果某个节点出现故障,导致 kubelet 无法正常运行或无法与 apiserver 通信,则到达时间阈值后就会触发该节点驱逐,自动在其他节点上启动相同的 Pod(Pod 漂移),被驱逐的节点无法正常运行及确定自身状态,故该节点的 Volume 也未正确执行解挂操作。
由于 cloud-controller-manager 需等待 Volume 正确解挂后,才会调用云厂商接口将磁盘从节点上解挂。因此,Pod 漂移会导致 cloud-controller-manager 在达到一个时间阈值后,强制解挂 Volume 并挂载到 Pod 最新调度的节点上。
造成影响
最终导致 ContainerCreating 的时间相对较长,但通常是可以启动成功的。
2. 命中 K8S 挂载 configmap/secret 时 subpath 的 bug
实践发现,当修改了 Pod 已挂载的 configmap 或 secret 的内容,Pod 中容器又进行了原地重启操作(例如,存活检查失败被 kill 后重启拉起),就会触发该 bug。
检查磁盘空间是否不足
启动 Pod 时会调 CRI 接口创建容器,容器运行时组件创建容器时通常会在数据目录下为新建的容器创建一些目录和文件。如果数据目录所在的磁盘空间不足,将会导致容器创建失败。通常会显示以下报错信息:
检查节点内存是否碎片化
检查 limit 设置
- 执行 kubectl describe pod 命令,查看 event 报错信息如下:
- Kubelet 报错如下:
当 limit 设置过小以至于不足以成功运行 Sandbox 时,也会导致 Pod 一直处于 ContainerCreating 或 Waiting 状态,通常是由于 memory limit 单位设置错误引起的。
例如,误将 memory limit 单位设置为小写字母 m ,则该单位将会被 K8S 识别成 Byte。您需要将 memory limit 单位设置应为 Mi 或 M 。若 memory limit 设置为1024m,则表示其大小将会被限制在1.024Byte以下。较小的内存环境下,pause 容器一启动就会被 cgroup-oom kill 掉,导致 Pod 状态一直处于 ContainerCreating。
检查拉取镜像是否失败
拉取镜像失败也会引起 Pod 发生该问题,镜像拉取失败原因较多,常见原因如下:
- 配置了错误的镜像。
- Kubelet 无法访问镜像仓库。例如,默认 pause 镜像在 gcr.io 上,而国内环境访问需要特殊处理。
- 拉取私有镜像的 imagePullSecret 没有配置或配置有误。
- 镜像太大,拉取超时。可在拉取时适当调整 kubelet 的 --image-pull-progress-deadline 和 --runtime-request-timeout 选项。
针对上述情况调整配置后,请再次拉取镜像并查看 Pod 状态。
检查 CNI 网络是否错误
- 无法配置 Pod 网络。
- 无法分配 Pod IP。
检查 controller-manager 是否异常
查看 Master 客户选择 OCI 的原因 上 kube-controller-manager 状态,异常时尝试重启。
检查节点已有 docker
若在节点已有 docker 或旧版本 docker 未完全卸载的情况下,又安装了 docker,也可能引发 Pod 出现此问题。
例如,在 CentOS 上,执行以下命令重复安装了 docker:
由于重复安装的 docker 版本不一致,组件间不完全兼容,导致 dockerd 持续无法成功创建容器,使 Pod 状态一直 ContainerCreating。执行 kubectl describe pod 命令,查看 event 报错信息如下:
请选择保留 docker 版本,并完全卸载其余版本 docker。
检查是否存在同名容器
节点上存在同名容器会导致创建 sandbox 时失败,也会导致 Pod 一直处于 ContainerCreating 或 客户选择 OCI 的原因 Waiting 状态。
执行 kubectl describe pod 命令,查看 event 报错信息如下:
OCI最强整理
IAS 1 requires that OCI is classified into two groups as follows:
• items that might be reclassified to profit or loss in subsequent accounting periods:
- Foreign exchange gains and losses arising on translation of a foreign operation (IAS 21)
- Effective parts of cash flow hedging arrangements (IFRS 9)
- Re-measurement of investments in debt instruments that are classified as fair value through OCI (IFRS 9)
• items that will not be reclassified to profit or loss in subsequent accounting periods:
阿里云加入开放容器计划( OCI)
阿里云弹性计算服务的首席架构师蔡俊杰表示:“容器标准化让全世界都可以说同样的语言,且托管提供商、ISV、开发人员和最终用户将同样受益。”“我们深信,通用规范能让客户从云中获得更多价值,现已在内部架构以及阿里云提供的公共容器服务采用 OCI v1.0 规范。我们也大力投入领先的容器项目,例如,containerd 和我们自己的最新开源容器项目,PouchContainer。阿里对于加入 OCI 深感高兴,将为该计划提供深入的容器体验,同时与社区合作,从而规范这一空间。”
作为开放标准的积极成员和倡导者,阿里巴巴期待着在整个容器生态系统中深入 OCI 的工作——使云架构层更加民主,以更好地服务于最终用户,并使云开发商能够避免重复劳动,同时专注于更高价值的创新。
关于 PouchContainer
PouchContainer 是由阿里巴巴集团开源的一款完全兼容 OCI 标准的企业级容器引擎。该项目是阿里巴巴基础设施中重要的一部分,并以百万级容器数量支撑集团业务稳定运行。
为了成为在不同生产环境中的通用容器引擎,PouchContainer 支持了多种兼容 OCI 标准的容器运行时,这使得容器服务可以做到真正的开箱可用:
ORACLE调用接口(OCI)简介及重要函数流程介绍
weixin_34267123 于 2015-12-07 18:45:客户选择 OCI 的原因 26 发布 304 收藏 1
【文章摘要】
对于实现用户开销户的程序来说,与数据库进行交互是必不可少的。为了实现用户数据的存放、读取、删除等操作,我们需要频繁地访问数据库,这就对数据库的访问模式提出了较高的要求。ORACLE数据库具有系统可移植性好、使用方便、功能强等特点,因此在实际的软件开发项目中使用得非常的广泛。为了方便C语言程序操作ORACLE中的数据,ORACLE调用接口(OCI)应运而生。
一、OCI简介
在通常的情况下,大家是通过在客户端(如PLSQL Developer)中输入SQL语句来对数据库中的数据进行操作的。那么,如果我们想在C程序中实现对数据库的操作,该如何处理呢?ORACLE数据库提供了一个第三代程序设计语言的接口,用户可以通过C语言来编程访问数据库。
OCI(Oracle Call Interface)就是为了实现高级语言访问数据库而提供的接口,它允许开发者使用高级语言来编写程序,并通过该接口来访问数据库。
利用OCI,C程序访问ORACLE数据库的模式如图1所示。
图1 C程序访问ORACLE数据库的模式
二、OCI中常用函数简介
OCI提供了一组完备的功能集合,可以实现创建数据库连接、关闭数据库连接、执行SQL语句或存储过程、获取SQL语句或存储过程的执行结果、获取数据库空间大小等功能。
表1 OCI常用函数及其功能
三、OCI中重要函数流程介绍
为了让大家了解OCI的流程,我们对OCI中两个重要的函数流程进行分析。如果大家想要对OCI进行深入的理解,请阅读OCI源码。
1 CreateDb流程
图2 CreateDb流程
2.ExecuteSql流程
图3 ExecuteSql流程