一、pod
二、Volume
volume可以为容器提供持久化存储,比如
三、私有镜像
在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用。
创建docker registry secret:四、RestartPoliy
支持三种RestartPolicy
- Always:只要退出就重启
- OnFailure:失败退出(exit code不等于0)时重启
- Never:只要退出就不再重启
注意,这里的重启是指在Pod所在Node上面本地重启,并不会调度到其他Node上去。
五、环境变量
环境变量为容器提供了一些重要的资源,包括容器和Pod的基本信息以及集群中服务的
信息等:(1) hostnameHOSTNAME 环境变量保存了该Pod的hostname。(2)容器和Pod的基本信息Pod的名字、命名空间、IP以及容器的计算资源限制等可以以Downward API的方式获取并存储到环境变量中。(3) 集群中服务的信息
容器的环境变量中还包括了容器运行前创建的所有服务的信息,比如默认的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来解析服务。六、ImagePullPolicy
支持三种ImagePullPolicy
- Always:不管镜像是否存在都会进行一次拉取。
- Never:不管镜像是否存在都不会进行拉取
- IfNotPresent:只有镜像不存在时,才会进行镜像拉取。
注意:
- 默认为 IfNotPresent ,但 :latest 标签的镜像默认为 Always 。
- 拉取镜像时docker会进行校验,如果镜像中的MD5码没有变,则不会拉取镜像数据。
- 生产环境中应该尽量避免使用:latest 标签,而开发环境中可以借助 :latest 标签自动拉取最新的镜像。
七、访问DNS的策略
通过设置dnsPolicy参数,设置Pod中容器访问DNS的策略
-ClusterFirst:优先基于cluster domaim 后缀,通过kube-dns查询 -Default:优先从kubelet中配置的DNS查询注意:默认配置的dnsPolicy是ClusterFirst
1、使用主机的IPC命名空间
通过设置hostIPC参数True,使用主机的IPC命名空间,默认为False
2、使用主机的网络命名空间
通过设置hostNetwork参数True,使用主机的网络命名空间,默认为False
3、使用主机的PID空间
通过设置hostPID参数True,使用主机的PID命名空间,默认为False
4、设置Pod中的hostname
通过hostname参数实现,如果未设置默认使用PodName作为Pod的hostname
5、设置Pod的子域名
通过subdomain参数设置Pod的子域名,默认为空
指定hostname为busybox-2和subdomain为default-subdomain,完整域名
为 busybox-2.default-subdomain.default.svc.cluster.local :
八、资源限制
Kubernetes通过cgroups限制容器的CPU和内存等计算资源,包括requests(请求,调度器保证调度到资源充足的Node上)和limits(上限)等:
- spec.containers[].resources.limits.cpu :CPU上限,可以短暂超过,容器也不会被停止
- spec.containers[].resources.limits.memory :内存上限,不可以超过;如果超过,容器可能会被停止或调度到其他资源充足的机器上
- spec.containers[].resources.requests.cpu :CPU请求,可以超过
- spec.containers[].resources.requests.memory :内存请求,可以超过;但如果超过,容器可能会在Node内存不足时清理
比如nginx容器请求30%的CPU和56MB的内存,但限制最多只用50%的CPU和128MB的内存:
注意,CPU的单位是milicpu,500mcpu=0.5cpu;而内存的单位则包括E, P, T, G, M, K,Ei, Pi, Ti, Gi, Mi, Ki等。
九、健康检查
为了确保容器在部署后确实处在正常运行状态,Kubernetes提供了两种探针(Probe,支持exec、tcp和httpGet方式)来探测容器的状态:
- LivenessProbe:探测应用是否处于健康状态,如果不健康则删除重建改容器
- ReadinessProbe:探测应用是否启动完成并且处于正常服务状态,如果不正常则更新容器的状态
十、Init Container
Init Container在所有容器运行之前执行(run-to-completion),常用来初始化配置。
十一、容器生命周期钩子
容器生命周期钩子(Container Lifecycle Hooks)监听容器生命周期的特定事件,并在
事件发生时执行已注册的回调函数。支持两种钩子:- postStart: 容器启动后执行,注意由于是异步执行,它无法保证一定在ENTRYPOINT之后运行。如果失败,容器会被杀死,并根据RestartPolicy决定是否重启
- preStop:容器停止前执行,常用于资源清理。如果失败,容器同样也会被杀死
而钩子的回调函数支持两种方式:
- exec:在容器内执行命令
- httpGet:向指定URL发起GET请求
postStart和preStop钩子示例:
十二、使用Capabilities
默认情况下,容器都是以非特权容器的方式运行。比如,不能在容器中创建虚拟网卡、配置虚拟网络。
Kubernetes提供了修改Capabilities的机制,可以按需要给给容器增加或删除。
比如下面的配置给容器增加了 CAP_NET_ADMIN 并删除了 CAP_KILL 。
十三、限制网络带宽
可以通过给Pod增加 kubernetes.io/ingressbandwidth和 kubernetes.io/egress-bandwidth 这两个annotation来限制Pod的网络带宽
目前只有kubenet网络插件支持限制网络带宽,其他CNI网络插件暂不支持这个功能。
kubenet的网络带宽限制其实是通过tc来实现的
十四、调度到指定的Node上
可以通过nodeSelector、nodeAffinity、podAffinity以及Taints和tolerations等来将Pod调
度到需要的Node上。也可以通过设置nodeName参数,将Pod调度到制定node节点上。比如,使用nodeSelector,首先给Node加上标签:kubectl label nodes <your-node-name> disktype=ssd接着,指定该Pod只想运行在带有 disktype=ssd 标签的Node上:十五、自定义hosts
默认情况下,容器的 /etc/hosts 是kubelet自动生成的,并且仅包含localhost和podName等。不建议在容器内直接修改 /etc/hosts 文件,因为在Pod启动或重启时会被覆盖。
默认的 /etc/hosts 文件格式如下,其中 nginx-4217019353-fb2c5 是podName:从v1.7开始,可以通过 pod.Spec.HostAliases 来增加hosts内容,如