我已经基于httpd:2.4构建了一个docker镜像。在我的k8s部署中,我定义了以下securityContext
:
securityContext:
privileged: false
runAsNonRoot: true
runAsUser: 431
allowPrivilegeEscalation: false
为了使该容器正常运行,因为需要将非root apache配置为绑定到端口> 1024,而不是默认端口80。据我所知,这意味着编辑Listen 80
在httpd.conf
至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错误。我是否正确设置了端口?还有什么需要做的吗?
答案 0 :(得分:0)
kubectl get pods
kubectl logs pod_name
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”地址的任何端口 可以从网络访问容器内部的内容。无法更新。
我希望这可以帮助您继续前进