性质
Termination of Pods | https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination
常用 Pod 文件模板
这是我们常用的 Pod 文件的模板,能够根据需要进行剪裁:
apiVersion: v1 kind: Pod metadata: name: dapi-envars-fieldref spec: containers: - name: test-container image: k8s.gcr.io/busybox # 镜像拉取策略:Always、IfNotPresent; imagePullPolicy: Always # 字段 command 对应镜像的 entrypoint 指令; command: [ "sh", "-c"] # 字段 args 对应镜像的 CMD 指令; args: - while true; do echo -en '\n'; printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE; printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT; sleep 10; done; # 限制资源使用情况 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" # 使用环境变量 env: # 直接定义环境变量 - name: FOO valueFrom: fieldRef: fieldPath: spec.nodeName # 引用定义中的变量作为环境变量 - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name
定义容器启动命令(command)及参数(args)
Define a Command and Arguments for a Container | Kubernetes
How to set multiple commands in one yaml file with Kubernetes? – Stack Overflow
使用 command 定义启动命令,使用 args 定义启动参数。在容器启动后,该参数不能修改。
命令及参数的示例
apiVersion: v1 kind: Pod metadata: name: example-command-demo spec: containers: - name: command-demo-container image: debian command: ["printenv"] args: ["HOSTNAME", "KUBERNETES_PORT"] # 对于较长的参数 - name: long-args command: - java - -jar - -Dfoo=1 - -Dbar=2 - app.jar
在命令中,使用环境变量
下面的 YAML 文件演示如何使用环境变量:
env: - name: MESSAGE value: "hello world" command: ["/bin/echo"] args: ["$(MESSAGE)"] # 环境变量出现在括号中,这对于在 command 或 args 字段中扩展变量是必需的。 # 以这种方式引用环境变量 ≠ 在 Shell 中引用变量 # 这是两种不同的途径,前者由 Kubernetes API 处理,后者由 Shell 解析
执行 Shell 脚本(用于多命令场景)
How to set multiple commands in one yaml file with Kubernetes? – Stack Overflow
下面的 YAML 文件演示如何执行 Shell 脚本:
# 常用简单格式 --- command: ["/bin/sh"] args: ["-c", "while true; do echo hello; sleep 10;done"] # 或者使用如下形式 --- command: ["/bin/sh", ""] args: - | while true do echo hello sleep 10 done # 可以根据需要灵活组合
拉取私有镜像 | imagePullSecrets
第一步、创建访问私有镜像仓库的 Secret 信息:
kubectl create secret generic regcred \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson # 或者,通过命令行指定 kubectl create secret docker-registry regcred \ --docker-server=<your-registry-server> \ --docker-username=<your-name> \ --docker-password=<your-pword> \ --docker-email=<your-email>
第二步、在 Pod 中,指定访问该仓库的凭证:
apiVersion: v1 kind: Pod metadata: name: private-reg spec: containers: - name: private-reg-container image: <your-private-image> imagePullSecrets: - name: regcred
默认 imagePullSecrets 定义
Automatically use secret when pulling from private registry
Kubernetes API Reference / ServiceAccount
在命名空间中,我们希望配置默认 ImagePullSecret 信息,而不需要为每个 Deployment 单独添加配置。
# 首先创建 Secret kubectl create secret docker-registry my-registry-secret \ --docker-server=<your-registry-server> \ --docker-username=<your-username> \ --docker-password=<your-password> \ --docker-email=<your-email> \ -n your-namespace # 然后将 Secret 添加到 default ServiceAccount kubectl patch serviceaccount default -n your-namespace \ -p '{"imagePullSecrets": [{"name": "my-registry-secret"}]}'
注意,在 Helm Chart 中,其创建的 Deployment 可能并不使用 default ServiceAccount 资源,所以可能仍旧需要修改 values.yaml 文件。
相关链接
关于 Pod 网络:Understanding kubernetes networking: pods
参考文献
Expose Pod Information to Containers Through Environment Variables | Kubernetes
Images | Kubernetes
Kubernetes/Concepts/Pods
Pull an Image from a Private Registry | Kubernetes
Managing Resources for Containers | Kubernetes
Labels and Selectors | Kubernetes
docker – Change entrypoint of a k8s Pod, but keep the CMD – Stack Overflow