「KUBERNETES-OBJECTS」- Pod(学习笔记)

性质

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