管理Pod对象的容器

镜像及其获取策略

主要包括三种镜像获取策略

  • Always:总是,即无论本地是否存在镜像都重新从仓库下载
  • IfNotPresent:当本地不存在的时候下载
  • Never:从不下载

对于镜像标签为latest的镜像应该设置为Aways以保持最新,其他一般使用默认IfNotPresent,如下面的示例:

apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
  image: ikubernetes/myapp:v1
  imagePullPolicy: Always

暴露端口

在kubernetes中,各Pod的IP地址位于同一网络平面(同一网段),即各Pod之间可以直接通信,暴露端口更多的是给管理员提供信息及供调用。
暴露端口使用ports字段,该字段是一个列表,常用嵌套字段如下:

  • containerPort:必选字段,1-65535,通常指定容器正常监听的端口
  • name:端口名,可供Service等调用
  • protocol:端口监听的协议,TCP或UDP
  • hostIP:将主机转发指定的端口绑定到主机的特定IP之上,默认为0.0.0.0
  • hostPort:Pod的地址无法被集群外直接访问,简单的办法即通过主机上的端口转发,这里指定的即要使用的主机的端口。注意,与NodePort不同的是,NodePort在所有节点监听,hostPort只监听Pod所在主机。

提示:可通过kubectl explain pods.spec.containers.ports获取更多嵌套字段信息

下面是示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: ikubernetes/myapp:v1
    imagePullPolicy: Always
    ports:
    - name: http
      containerPort: 80
      protocol: TCP
      hostIP: 0.0.0.0
      hostPort: 80

自定义运行的容器化应用

对于Docker镜像来说,镜像运行的应用程序由Dockerfile中的ENTRYPOINT指定,参数由CMD指定,如果不存在ENTRYPOINT则CMD可同时指定运行的程序及其参数。可以使用下面的命令来获取这两个参数。

docker inspect ikubernetes/myapp:v1 -f {{.Config.Cmd}}
docker inspect ikubernetes/myapp:v1 -f {{.Config.Entrypoint}}

我们可以在资源清单文件中覆盖容器镜像中的运行参数及程序。清单文件的配置选项包括commandargs,覆盖规则如下:

  • 同时指定这两个配置,则完全覆盖镜像中运行程序和参数。
  • 只指定args,则覆盖镜像中的参数配置,并将其传递给镜像中指定运行的程序。
  • 只指定command,覆盖镜像中的参数,且镜像中的程序以无参数的方式运行。
    下面是一个示例:
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx
    spec:
    containers:
    - name: nginx
      image: ikubernetes/myapp:v1
      imagePullPolicy: Always
      command: ["/bin/sh"]
      args: ["-c", "while true; do sleep 30; done"]

环境变量

除了上述通过参数来配置容器内应用程序的方式,如果应用程序支持的话,还可以通过环境变量来配置。如果应用程序不支持,可以在制作docker镜像时通过ENTRYPOINT脚本完成环境变量的程序配置文件的同步。传递环境变量的方法有两种,env和envFrom。此处先说第一种。
env是一个列表,主要有name和value两个字段组成。分别对应变量名和变量值。下面是一个示例文件。

apiVersion: v1
kind: Pod
metadata:
  name: pod-filebeat
spec:
  containers:
  - name: filebeat
    image: ikubernetes/filebeat:5.6.5-alpine
    env:
    - name: REDIS_HOST
      value: 127.0.0.1:6379
    - name: LOG_LEVEL
      value: info

共享节点的网络名称空间

同一个pod对象的个容器均匀性女一个独立的隔离的网络名称空间中。但有一些特殊的pod对象需要运行与节点所在的名称空间中。如以Kubeadm方式部署的各个组件一般运行为第二种方式。如果我们需要指定某个pod共享节点所在的网络名称空间只需要指定spec.hostNetwork为true即可,如下面的示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  hostNetwork: true

创建上述对象之后,使用kubectl exec命令连入进去然后执行ifconfig命令进行验证。此外还可以分别使用spec.hostPID和spec.IPC共享节点的PID和IPC名称空间

设置pod对象的安全上下文

Pod对象的安全上下文用于设定Pod或容器的权限和访问控制功能,其支持设置的常用属性包括以下几个方面。

  • 基于UID和GID控制访问对象的权限
  • 以特权或非特权方式运行
  • 通过Linux Capabilites为其提供部分特权
  • 基于Seccomp过滤进程的系统调用
  • 基于SELinux的安全标签
  • 是否能够进行权限升级
    对Pod对象的安全上下文的定义在spec.securityContext字段中,对于容器的安全上下文定义则在spec.containers[].securityContext字段中。且二者可使用的嵌套字段有些许区别。下面的示例给容器定义了安全上下文,它以UID为1000的非特权用户运行容器,并禁止权限升级。
    apiVersion: v1
    kind: Pod
    metadata:
    name: busybox-with-securityContext
    spec:
    containers:
    - name: busybox
      image: busybox
      command: ["/bin/sh", "-c", "sleep 36000"]
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        allowPrivilegeEscalation: false
    此外还有许多其他属性可以使用命令kubectl explain进行查看

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!