簡體   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