initC

589 阅读4分钟

容器编排工具:MESOS APACHE Docker Swarm

各组件及作用

APISERVER:集群入口 ,封装了核心对象的增删改查操作,以RESTful接口方式提供给外部客户和内部组件调用,集群内各个功能模块之间数据交互和通信的中心枢纽

CrontrollerManager:负责执行各种控制器

Scheduler::负责介绍任务,选择合适的节点进行分配任务 

ETCD:管理配置信息和服务发现,高可用高性能的强一致性分布式键值数据库

Kubelet:直接跟容器引擎交互实现容器的生命周期管理,并与master通信,每隔一个时间周期,就会调用一次API server的REST接口报告自身状态,通过cAdvisor监控容器和节点资源

Kube-proxy:负责写入规则至 IPTABLES、IPVS 实现服务映射访问的 

COREDNS:可以为集群中的SVC创建一个域名IP的对应关系解析 

DASHBOARD:给 K8S 集群提供一个 B/S 结构访问体系 

INGRESS CONTROLLER:官方只能实现四层代理,INGRESS 可以实现七层代理 

FEDERATION:提供一个可以跨集群中心多K8S统一管理功能 

名称空间级别资源

① 工作负载型资源(workload):Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、CronJob(ReplicationController在v1.11版本被废弃

② 服务发现及负载均衡型资源(ServiceDiscoveryLoadBalance):Service、Ingress、...

③ 配置与存储型资源:Volume(存储卷)、CSI(容器存储接口,可以扩展各种各样的第三方存储卷)

④ 特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感数据)、DownwardAPI(把外部环境中的信息输出给容器)

集群级资源

Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding

元数据型资源

HPA、PodTemplate(pod模板)、LimitRange(资源限制)

initC

Pod 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init 容器。

Init 容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成。
  • 每个都必须在下一个启动之前成功完成。

如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。

与普通容器不同之处

Init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。 然而,Init 容器对资源请求和限制的处理稍有不同,在下面 资源 处有说明。 而且 Init 容器不支持 Readiness Probe,livenessProbe因为它们必须在 Pod 就绪之前运行完成。

如果为一个 Pod 指定了多个 Init 容器,那些容器会按顺序一次运行一个。 每个 Init 容器必须运行成功,下一个才能够运行。 当所有的 Init 容器运行完成时,Kubernetes 初始化 Pod 并像平常一样运行应用容器。

initC能做什么

因为 Init 容器具有与应用容器分离的单独镜像,它们的启动相关代码具有如下优势:

  • 它们可以包含并运行实用工具,出于安全考虑,是不建议在应用容器镜像中包含这些实用工具的。

  • 它们可以包含用于安装的工具和定制化代码,这些都是在应用镜像中没有的。例如,创建镜像没必要 FROM 另一个镜像,只需要在安装过程中使用类似 sedawkpythondig 这样的工具。

  • 应用镜像可以分离出创建和部署的角色,而没有必要联合它们构建一个单独的镜像。

  • 它们使用 Linux Namespace,所以对应用容器具有不同的文件系统视图。因此,它们能够具有访问 Secret 的权限,而应用容器不能够访问。

  • 它们在应用容器启动之前运行完成,然而应用容器并行运行,所以 Init 容器提供了一种简单的方式来阻塞或延迟应用容器的启动,直到满足了一组先决条件。

    apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers:

    • name: myapp-container image: busybox command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers:
    • name: init-myservice image: busybox command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
    • name: init-mydb image: busybox command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

在 Pod 启动过程中,Init 容器会按顺序在网络和数据卷初始化之后启动。 每个容器必须在下一个容器启动之前成功退出。 如果由于运行时或失败退出,导致容器启动失败,它会根据 Pod 的 restartPolicy 指定的策略进行重试。 然而,如果 Pod 的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy 策略。

在所有的 Init 容器没有成功之前,Pod 将不会变成 Ready 状态。 Init 容器的端口将不会在 Service 中进行聚集。 正在初始化中的 Pod 处于 Pending 状态,但应该会将条件 Initializing 设置为 true。

如果 Pod 重启,所有 Init 容器必须重新执行。

对 Init 容器 spec 的修改,被限制在容器 image 字段中。 更改 Init 容器的 image 字段,等价于重启该 Pod。