nginx 映像在 kubectl 部署和 pods 中的行为不同

nginx image behaves differently in kubectl deployment and pods

我正在使用 nginx 映像创建 pods 如下 -

$ kubectl run nginx --image=nginx --port=80 -- /bin/sh -c 'sleep 20000'
$ kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=1 

这两个结果pods如下-

$ kubectl get pods
nginx                           1/1     Running   0          24s
nginx-deploy-7496796997-wkhv8   1/1     Running   0          19s

curl 连接到“nginx-deploy”pod 中的本地主机,而在其他 pod 中则没有。

$ kubectl  exec -it nginx -- /bin/sh -c 'curl localhost'
curl: (7) Failed to connect to localhost port 80: Connection refused
$ k exec -it nginx-deploy-7496796997-wkhv8 -- /bin/sh -c 'curl localhost'
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
....

nginx 图像在这两个中表现不同的任何原因 pods?

/bin/sh -c 'sleep 20000'

您的命令已覆盖 nginx 映像中定义的默认 CMD/ENTRYPOINT。结果,nginx 服务器将无法启动。如果你再次 kubectl run 没有你的命令,nginx 将 运行 喜欢部署。

# Here command = /bin/sh -c 'sleep 20000'
kubectl run nginx --image=nginx --port=80 -- command

当您使用命令创建pod时,它会覆盖Dockerfile中的命令。这样 nginx 服务器就不会在 pod 中启动。请参考nginx的Dockerfile

  1. Have not defined COMMAND and ARGS in Kubernetes, use Dockerfile's config.
  2. Have defined COMMAND (no effect if ARGS defined or not) in Kubernetes, use Kubernetes COMMAND.
  3. Have not defined COMMAND but ARGS in Kubernetes, use ENTRYPOINT in Dockerfile and ARGS in Kubernetes.

综上所述,Kubernetes的优先级更高。