Pod

Pod是一组紧密关联的容器集合,它们共享IPC、Network、UTC namespace,是k8s调度的基本单位。

Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享提供服务。

Pod一旦调度后就跟Node绑定,即使Node挂掉,也不会重新调度,推荐使用Deployments、Daemonsets等控制器。

当Pod删除的时候,首先会给内部的进程发送SIGTERM,等待一段时间(grace period)后才强制停止依然运行的进程。

特权容器(通过SecurityContext配置)具有改变系统配置的权限。

定义Pod

在k8s中,所有对象都使用manifest(yaml或json)定义。下面定义简单的nginx服务

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

使用Volume

Volume可以为容器提供持久化的存储

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}

使用私有镜像

在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用

kubectl create secret docker-registry regsecret \
--docker-server=<your-registry-server> \
--docker-username=<your-name> \
--docker-password=<your-password> \
--docker-email=<your-email>

在容器中引用secret

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regsecret

RestartPolicy

支持3种RestartPolicy

  • Always:只要退出就重启

  • OnFailure:失败退出时重启

  • Never:只要退出就不重启

这里的重启是指在Pod所在的Node上面本地重启,并不会调度到其他Node上。

环境变量

环境变量为容器提供了一些重要的资源,包括容器和Pod的基本信息以及集群中服务的信息等。

HOSTNAME 环境变量保存pod的hostname。

Pod的名字、命名空间、IP以及容器的计算资源限制等可以以Downward API的方式获取并存储到环境变量中。

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: test-container
    image: gcr.io/google_containers/busybox
    command: ["sh","-c"]
    args:
    - env
    resources:
      memory: "32Mi"
      cpu: "125m"
    limits:
      memory: "64Mi"
      cpu: "250m"
  env:
  - name: MY_NODE_NAME
    valueFrom:
      fieldRef: metadata.name
        fieldPath: spec.nodeName
  - name: MY_POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  - name: MY_POD_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
  - name: MY_POD_IP
    valueFrom:
      fieldRef:
        fieldPath: status.podIP
  - name: MY_POD_SERVICE_ACCOUNT
    valueFrom:
      fieldRef:
        fieldPath: spec.serviceAccountName
  - name: MY_CPU_REQUEST
    valueFrom:
      resourceFieldRef:
        containerName: test-container
        resource: requests.cpu
  - name: MY_CPU_LIMIT
    valueFrom:
      resourceFieldRef:
        containerName: test-container
        resource: limits.cpu
  - name: MY_MEM_REQUEST
    valueFrom:
      resourceFieldRef:
        containerName: test-container
        resource: requests.memory
  - name: MY_MEM_LIMIT
    valueFrom:
      resourceFieldRef:
        containerName: test-container
        resource: limits.memory
  restartPolicy: Never

集群中服务的信息

容器的环境变量中包括了容器运行前创建的所有服务的信息,比如默认的kubernetes服务对应的环境变量。

KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
KUBERNETES_SERVICE_HOST=10.0.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443

由于环境变量存在创建顺序的局限性,环境变量中不包含后来创建的服务,推荐使用DNS解析服务。

results matching ""

    No results matching ""