1

k8s总结

 2 years ago
source link: https://yaoguais.github.io/article/golang/k8sinterview.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

k8s总结

最近看到一篇博客,是关于k8s设计的一些思考。地址如下:

https://xuxinkun.github.io/2018/07/23/k8s-interview/

下面就顺着作者思路回答其提出的一些问题。

  1. kubernetes组件理解
  2. k8s的pause容器作用
  3. k8s的pod内容器之间的关系
  4. 经典pod的生命周期
  5. service和ep如何关联和影响
  6. 详述kube-proxy原理
  7. rc/rs实现原理
  8. deployment/rs区别
  9. 设计千台物理机的k8s集群
  10. 一千到五千台的瓶颈
  11. 集群运营注意要点
  12. 产生雪崩和预防
  13. 设计代替kube-proxy的实现
  14. sidecar在k8s中应用
  15. 灰色发布在原生k8s中的实现
  16. 介绍k8s实践中踩的大坑

kubernetes组件理解

问题:kubernetes包含几个组件。各个组件的功能是什么。组件之间是如何交互的。

这个问题从两个角度回答,一是从官方介绍中,二是从部署中。

官方文档参照 https://kubernetes.io/docs/concepts/overview/components/

大致分为3个部分:Master节点、Node节点、应用。

Master节点提供集群的控制面板,其下组件有:

  • kube-apiserver 提供k8s的API调用服务。
  • etcd 数据中心,存储集群的所有数据。
  • kube-scheduler 调度器,负责给新创建的容器分配节点等。
  • kube-controller-manager 控制管理器,负责监控和维护集群状态。

其中controller又包含:

  • Node Controller 报告节点健康状态。
  • Replication Controller 维护rc的pod个数,pod挂掉又控制重启。
  • Endpoints Controller 填充Endpoint对象,主要是给Service和Pod。
  • Service Account & Token Controllers 创建帐号和Token。

Master节点还包含:

  • cloud-controller-manager 是提供给第三方开发k8s特性的。

Node节点组件:

  • kubelet 管理Pod里面的容器。
  • kube-proxy 管理网络路由规则。
  • container runtime 容器运行环境,如Docker等。

应用都是部署在kube-system这个命名空间下的。如:

  • DNS dns服务。
  • Dashboard web管理界面。
  • Container Resource Monitoring 容器资源管理和监控,如cAdvisor、Prometheus。
  • Cluster-level Logging 日志收集分节点、集群、应用三种类型,可用elk或fluentd等。

另外,从部署上来看,这里参见的是 https://github.com/gjmzj/kubeasz 这个项目, 这个项目使用ansible部署k8s集群,步骤如下:

  1. 分发CA证书到各机器
  2. 部署etcd集群
  3. 部署docker服务
  4. 在Master节点部署kube-apiserver、kube-controller-manager、kube-scheduler
  5. 在Node节点部署kubelet、kube-proxy和cni插件(bridge、host-local、loopback)
  6. 部署kubedns、dashborad、heapster等。

k8s的pause容器作用

问题:k8s的pause容器有什么用。是否可以去掉。

关于"暂停"容器讲解比较详细的文章 http://dockone.io/article/2785

其提供两个功能,一是提供Pod在Linux中共享命名空间的基础,而是提供Pid Namespace并使用init进程。

命名空间是Linux中对资源隔离的机制,可参见:https://segmentfault.com/a/1190000009732550

隔离的条目很多,如IPC、Network、Mount、PID、User、UTC,通过Cgroup还可以限制CPU、内存等。

因此,我认为是可以去掉的。目前在运行Pod的时候,没并没有添加pause容器。

k8s的pod内容器之间的关系

问题:k8s中的pod内几个容器之间的关系是什么。

我们看k8s官方文档的解释:

一个Pod是一组容器的集合,像豌豆荚于豌豆。提供容器间存储和网络的共享,和一系列运行规范。

原文:https://kubernetes.io/docs/concepts/workloads/pods/pod/

Pod里面的容器共享网络,因此可使用localhost通讯。由于也共享存储,所以可以使用IPC和共享内存进行通讯。

经典pod的生命周期

问题:一个经典pod的完整生命周期。

同样参见官方文档:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

Pod都处于以下几种状态之一,可通过查询Pod详情查看。

  • Pending 部署Pod事务已被集群受理,但当前容器镜像还未下载完。
  • Running 所有容器已被创建,并被部署到k8s节点。
  • Successed Pod成功退出,并不会被重启。
  • Failed Pod中有容器被终止。
  • Unknown 未知原因,如kube-apiserver无法与Pod进行通讯。

详细叙述如下:

首先拖取Pod内容器的镜像,选择某个Node节点并启动Pod。 监控Pod状态,若Pod终止则根据策略决定是否重新调度。 Pod退出,并根据策略决定是否重启。

service和ep如何关联和影响

问题:k8s的service和ep是如何关联和相互影响的。

ephemeral storage 是k8s 1.8引入的特性,用作限制临时存储,可为Pod的每个容器单独配置。

它包括四个方面:EmptyDie volumes、Container logs、image layers和container writable layers。

注:容器可写层即向容器内写入文件时占用的存储。

当任意一个容器超过限制,或整个Pod超过限制,则Pod将被放逐(如果Pod有重启策略,则在另外Node复活)。

因为该特性是Pod中Container级别的,而service给pod暴露服务。所以,当Pod被放逐,service会受到部分影响。

详述kube-proxy原理

问题:详述kube-proxy原理,一个请求是如何经过层层转发落到某个pod上的整个过程。请求可能来自pod也可能来自外部。

kube-proxy部署在每个Node节点上,通过监听集群状态变更,并对本机iptables做修改,从而实现网络路由。 而其中的负载均衡,也是通过iptables的特性实现的。

另外我们需要了解k8s中的网络配置类型,有如下几种:

  • hostNetwork Pod使用宿主机上的网络,此时可能端口冲突。
  • hostPort 宿主机上的端口与Pod的目标端口映射。
  • NodePort 通过Service访问Pod,并给Service分配一个ClusterIP。

rc/rs实现原理

问题:rc/rs功能是怎么实现的。详述从API接收到一个创建rc/rs的请求,到最终在节点上创建pod的全过程,尽可能详细。另外,当一个pod失效时,kubernetes是如何发现并重启另一个pod的?

Replication Controller 可以保证Pod始终处于规定的副本数。

而当前推荐的做法是使用Deployment+ReplicaSet。

ReplicaSet 号称下一代的 Replication Controller,当前唯一区别是RS支持set-based selector。

RC是通过ReplicationManager监控RC和RC内Pod的状态,从而增删Pod,以实现维持特定副本数的功能。

可参见:https://blog.csdn.net/WaltonWang/article/details/62433143

RS也是大致相同。

deployment/rs区别

问题:deployment/rs有什么区别。其使用方式、使用条件和原理是什么。

deployment是rs的超集,提供更多的部署功能,如:回滚、暂停和重启、 版本记录、事件和状态查看、滚动升级和替换升级。

如果能使用deployment,则不应再使用rc和rs。

设计千台物理机的k8s集群

问题:设想一个一千台物理机,上万规模的容器的kubernetes集群,请详述使用kubernetes时需要注意哪些问题?应该怎样解决?(提示可以从高可用,高性能等方向,覆盖到从镜像中心到kubernetes各个组件等)

一千到五千台的瓶颈

问题:设想kubernetes集群管理从一千台节点到五千台节点,可能会遇到什么样的瓶颈。应该如何解决。

集群运营注意要点

问题:kubernetes的运营中有哪些注意的要点。

产生雪崩和预防

问题:集群发生雪崩的条件,以及预防手段。

设计代替kube-proxy的实现

问题:设计一种可以替代kube-proxy的实现

sidecar在k8s中应用

问题:sidecar的设计模式如何在k8s中进行应用。有什么意义。

灰色发布在原生k8s中的实现

问题:灰度发布是什么。如何使用k8s现有的资源实现灰度发布。

介绍k8s实践中踩的大坑

问题:介绍k8s实践中踩过的比较大的一个坑和解决方式。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK