本页面展示了当你在 Pod 中运行容器时,如何定义命令和参数。
你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。
要检查版本,请输入 kubectl version。
当你创建一个 Pod 时,你可以为在 Pod 中运行的容器定义命令和参数。要定义命令,请在配置文件中包含 command 字段。要定义命令的参数,请在配置文件中包含 args 字段。一旦 Pod 被创建,你所定义的命令和参数就不能再更改了。
你在配置文件中定义的命令和参数会覆盖容器镜像提供的默认命令和参数。如果你定义了参数(args)但没有定义命令,则会使用默认命令加上你的新参数。
command 字段对应于 ENTRYPOINT,而 args 字段对应于 CMD。在本练习中,你将创建一个运行单个容器的 Pod。该 Pod 的配置文件定义了一个命令和两个参数。
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
根据 YAML 配置文件创建一个 Pod
kubectl apply -f https://k8s.io/examples/pods/commands.yaml
列出正在运行的 Pod
kubectl get pods
输出显示在 command-demo Pod 中运行的容器已完成。
要查看在容器中运行的命令的输出,请查看来自 Pod 的日志:
kubectl logs command-demo
输出显示了 HOSTNAME 和 KUBERNETES_PORT 环境变量的值。
command-demo
tcp://10.3.240.1:443
在前面的示例中,你通过提供字符串直接定义了参数。作为直接提供字符串的替代方案,你可以使用环境变量来定义参数。
env:
- name: MESSAGE
value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]
这意味着你可以使用定义环境变量的任何可用技术为 Pod 定义参数,包括 ConfigMaps 和 Secrets。
"$(VAR)"。这是在 command 或 args 字段中展开变量所必需的。在某些情况下,你需要让命令在 Shell 中运行。例如,你的命令可能由多个通过管道连接的命令组成,或者它可能是一个 Shell 脚本。要在一个 Shell 中运行你的命令,请按如下方式包装它:
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]