文章目录
Github地址
八、K8s
8.0 什么是K8s
- 它由 Google 于 2000 年设计和开发,后来于 2014 年捐赠给云原生计算基金会(CNCF)。
- kubenetes 是一个容器编排工具。
- 用于管理容器。
类似 K8s的工具还有: docker swarm, Mesos, DC/OS.
8.1 K8s和docker 区别
Docker 用于构建 docker 镜像和创建容器,而 kubenetes 用于管理容器。
8.2 什么是自动化和编排
- 用于执行单个任务的自动化。
- 用于构建工作流的编排。
8.3 K8s 结构
- Master
- Kube-ApiServer: 就像是kubernetes的入口或者kubernetes的前端,每一个请求都是先到达api-server的。
- Scheduler: 它将通过检查 etcd 可用的服务来调度节点上的服务。
- Control manager:
- Node control manager: 通知节点是否已启动
- Replication control manager: 维护当前状态和所需状态
- EndPoint control manager: 它将为服务创建端点
- Service Account control manager: 它将允许访问外部服务,如 s3、rds 等。
- etcd --> 它包含有关主节点和节点的信息。它就像数据存储和键值对。
- Nodes
- Kublet: kubelet 将确保 Pod 处于运行状态。
- kube-Proxy: 它将处理与 pod 相关的网络,如 IP 地址。
- Docker: docker 运行容器。
- run kubectl command
- 当我们运行 kubectl 命令时,它将与 kube-apiserver 对话,api-server 将与 etcd 对话,etcd 将向 api-server 提供信息,然后服务器将与 kubelet 对话,kubelet 将与 Docker 对话并拉取图像并创建一个 pod。
8.4 Image 和 container 的区别
- Docker 镜像是包含基本操作系统、应用服务和数据的模板
- Docker 容器是镜像的副本,具有 CPU、内存、网络和存储等附加资源。
8.5 创建一个Pod的主要流程?
Kubernetes中创建一个Pod涉及多个组件之间联动,主要流程如下:
- 1、客户端提交Pod的配置信息(可以是yaml文件定义的信息)到kube-apiserver。
- 2、Apiserver收到指令后,通知给controller-manager创建一个资源对象。
- 3、Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中。
- 4、Kube-scheduler检测到pod信息会开始调度预选,会先过滤掉不符合Pod资源配置要求的节点,然后开始调度调优,主要是挑选出更适合运行pod的节点,然后将pod的资源配置单发送到node节点上的kubelet组件上。
- 5、Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心。
8.6 K8s中Pod的重启策略?
Pod重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应操作。
Pod的重启策略包括Always、OnFailure和Never,默认值为Always。
- Always:当容器失效时,由kubelet自动重启该容器;
- OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器;
- Never:不论容器运行状态如何,kubelet都不会重启该容器。
同时Pod的重启策略与控制方式关联,当前可用于管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接管理kubelet管理(静态Pod)。
不同控制器的重启策略限制如下:
- RC和DaemonSet:必须设置为Always,需要保证该容器持续运行;
- Job:OnFailure或Never,确保容器执行完成后不再重启;
- kubelet:在Pod失效时重启,不论将RestartPolicy设置为何值,也不会对Pod进行健康检查。
8.7 k8s 外部如何访问集群内的服务?
对于Kubernetes,集群外的客户端默认情况,无法通过Pod的IP地址或者Service的虚拟IP地址:虚拟端口号进行访问。通常可以通过以下方式进行访问Kubernetes集群内的服务:
- 映射Pod到物理机:将Pod端口号映射到宿主机,即在Pod中采用hostPort方式,以使客户端应用能够通过物理机访问容器应用。
- 映射Service到物理机:将Service端口号映射到宿主机,即在Service中采用nodePort方式,以使客户端应用能够通过物理机访问容器应用。
- 映射Sercie到LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。
8.8 简述Kubernetes网络模型?
Kubernetes网络模型中每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原因是,用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑如何将容器端口映射到主机端口等问题。
同时为每个Pod都设置一个IP地址的模型使得同一个Pod内的不同容器会共享同一个网络命名空间,也就是同一个Linux网络协议栈。这就意味着同一个Pod内的容器可以通过localhost来连接对方的端口。
在Kubernetes的集群里,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。