繁体   English   中英

在端口> 1024上运行apache容器

[英]Running an apache container on a port > 1024

我已经基于httpd:2.4构建了一个docker镜像。 在我的k8s部署中,我定义了以下securityContext

securityContext:
  privileged: false
  runAsNonRoot: true
  runAsUser: 431
  allowPrivilegeEscalation: false

为了使此容器正常运行,因为需要将非root apache配置为绑定到端口> 1024,而不是默认端口80。据我所知,这意味着在httpd.conf中将Listen 80编辑为Listen {Some port > 1024}

当我想运行正常构建的docker映像时(即在默认端口80上),我具有以下端口设置:

  • 部署
    • spec.template.spec.containers[0].ports[0].containerPort :80
  • 服务
    • spec.ports[0].targetPort :80
    • spec.ports[0].port :8080
  • 入口
    • spec.rules[0].http.paths[0].backend.servicePort :8080

有了这些设置,就可以通过入口清单中提供的主机URL访问该服务。 同样,这没有更改httpd.conf 当我进行了这些更改(使用Listen 8000 ),并将securityContext部分添加到部署中时,我相应地更改了各种清单:

  • 部署
    • spec.template.spec.containers[0].ports[0].containerPort :8000
  • 服务
    • spec.ports[0].targetPort :8000
    • spec.ports[0].port :8080
  • 入口
    • spec.rules[0].http.paths[0].backend.servicePort :8080

但是由于某种原因,当我尝试访问应该正常工作的URL时,出现502 Bad Gateway错误。 我是否正确设置了端口? 还有什么我需要做的吗?

检查Pod是否正在运行

kubectl get pods
kubectl logs pod_name

检查在Pod中是否可以访问该URL

kubectl exec -it <pod_name> -- bash
$ curl http://localhost:8000

如果上述方法无效,请检查您的httpd.conf。

检查服务名称

kubectl exec -it <ingress pod_name> -- bash
$ curl http://svc:8080

您也可以检查入口日志。

为了使此容器正常运行,因为需要将非根apache配置为绑定到端口> 1024,而不是默认端口80

知道了,这是使apache容器以非root用户身份运行的艰巨要求,因此,此更改需要在容器级别完成,而不是Kubernetes的抽象(例如Deployment的Pod规范或Service / Ingress资源对象定义)。 因此,剩下的唯一事情就是构建一个自定义httpd映像,侦听端口>1024。同样的方法适用于NGINX Docker容器。

您正在尝试手动调整Pod规范中“ containerPort”字段的一项关键信息,这种信息并不明显。 它在那里的主要目的是为了提供信息,并且不会导致在容器级别打开端口。 根据Kubernetes API 参考

在此处未指定端口并不能防止该端口暴露。 任何从容器中的默认“ 0.0.0.0”地址监听的端口都可以从网络访问。 无法更新。

希望这可以帮助您继续前进

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM