管理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: false
kubectl explain
进行查看
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!