在大于1024的端口上运行apache容器

时间:2019-07-05 17:34:33

标签: apache kubernetes httpd.conf

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

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

为了使该容器正常运行,因为需要将非root apache配置为绑定到端口> 1024,而不是默认端口80。据我所知,这意味着编辑Listen 80httpd.confListen {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错误。我是否正确设置了端口?还有什么需要做的吗?

2 个答案:

答案 0 :(得分:0)

检查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

您也可以检查入口日志。

答案 1 :(得分:0)

  

为了使此容器作为非root用户apache正常运行   需要配置为绑定到> 1024的端口,而不是   默认值80

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

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

  

在此处未指定端口不会阻止该端口被使用   裸露。正在侦听默认“ 0.0.0.0”地址的任何端口   可以从网络访问容器内部的内容。无法更新。

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