"oc new-app"命令不会暴露端口,即使输入的镜像包含端口信息。

5
我正在探索OpenShift 3.9,并成功使用oc new-app和Docker构建策略构建并运行了第一个容器。我的Dockerfile包括命令EXPOSE 5432
在部署后,oc describe istag/my_app:latest | grep ^Exposes报告Exposes Ports: 5432/tcp,看起来很好:镜像公开了端口5432。但是,oc describe po/my_app-1-some_id | grep "^\s*Port"报告Port: <none>,因此总体上似乎端口已在Docker层面上公开,但尚未在Kubernetes/OpenShift层面上公开。 OpenShift文档中如下所述:

new-app命令尝试检测输入图像中公开的端口。 它使用最低数字的公开端口生成公开该端口的服务。为了公开不同的端口,请在new-app完成后使用oc expose命令生成其他服务。

为什么在这种情况下oc new-app不会暴露端口5432(实际上它也不会创建任何service资源),我该如何让它自动执行此操作,因为输入镜像已经这样做了,并且从文档中看来似乎是可能的? 更新:以下是有关如何创建新应用程序的更多详细信息:
oc new-app ssh://my_account@my_git_server/my_path/my_repo.git
  --context-dir=my_dir --strategy=docker --name my_app

Git存储库包含一个迄今为止很平凡的my_dir/Dockerfile,其中包含命令EXPOSE 5432

为什么不使用OpenShift自带的PostgreSQL镜像呢?它将以非root用户身份正确运行,自动为您配置一些东西,因此您无需自己解决问题,并且最重要的是将部署策略设置为Recreate。默认的Rolling策略不应与数据库一起使用。请尝试:oc new-app --template postgresql-persistent - Graham Dumpleton
1
如果您刚开始使用OpenShift,您可能想阅读位于https://help.openshift.com/底部链接的三本免费电子书。 - Graham Dumpleton
1
如果您运行oc new-app命令,但添加选项--dry-run -o json,则它生成的JSON是否显示“Service”对象?在“DeploymentConfig”中,容器的“ports”定义显示什么? - Graham Dumpleton
请不要删除问题。这样做会破坏StackOverflow作为记录此类讨论的目的。正是这种行为让那些愿意帮助别人的人感到“为什么要费心帮助他人”,因为其他人可能会删除这些讨论。这意味着所有的时间都白费了,因为它对未来找到它的人没有任何好处。 - Graham Dumpleton
1
你可以随意发布一个帖子,因为你最了解问题/结果。 - Graham Dumpleton
显示剩余7条评论
1个回答

2
最终,问题“突然”消失了,现在oc new-app确实按照文档所说暴露端口。到目前为止,我使用的是一个简单的Dockerfile,如下所示。
FROM debian:stretch
EXPOSE 5432

COPY start.sh /usr/local/bin/start.sh
CMD ["start.sh"]

startup.sh 调用 sleep infinity。就解释而言,我只能猜测我可能犯了一些次要且短暂的错误导致干扰。

在尝试诊断和解决问题时,学到了以下经验(特别感谢 @GrahamDumpleton):

  • 如果 oc new-app 一切顺利,则 oc get all 应指示资源 svc/my_app 的端口 5432/TCP,并应列出新的 OpenShift(和 Kubernetes)资源类型,如 deploymentconfigsbuildconfigsbuildsimagestreamsporc
  • 此自动机制仅在集群内部公开端口,即 svc/my_app 具有(并侦听)集群 IP(而非外部 IP)。
  • 附加参数 --dry-run -output json 会导致 oc new-app 进行干扰,并打印出它通常会创建的资源的精确描述(以 JSON 格式)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接