管理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}}我们可以在资源清单文件中覆盖容器镜像中的运行参数及程序。清单文件的配置选项包括command和args,覆盖规则如下:
- 同时指定这两个配置,则完全覆盖镜像中运行程序和参数。
- 只指定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: falsekubectl explain进行查看
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!