kubernetes入门(07)kubernetes的核心概念(4)

一、pod

二、Volume

volume可以为容器提供持久化存储,比如

三、私有镜像

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

四、RestartPoliy

支持三种RestartPolicy

  • Always:只要退出就重启
  • OnFailure:失败退出(exit code不等于0)时重启
  • Never:只要退出就不再重启

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

五、环境变量

环境变量为容器提供了一些重要的资源,包括容器和Pod的基本信息以及集群中服务的
信息等:
(1) hostname
HOSTNAME 环境变量保存了该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内容,如

原文地址:https://www.cnblogs.com/lexiaofei/p/7787470.html