公司现在上了一部分的业务至k8s,在项目改造中,每天都会遇到很多问题,好友找我出一份k8s面试题,参考了网上的一些,再加上自己公司遇到的一些问题,整理如下:

参考链接:http://yaoguais.github.io/article/golang/k8sinterview.html

1、理论篇

1.1 简要说下Kubernetes有哪些核心组件以及这些组件负责什么工作?

etcd:提供数据库服务保存了整个集群的状态
kube-apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
kube-controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
cloud-controller-manager:是与底层云计算服务商交互的控制器
kub-scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet:负责维护容器的生命周期,同时也负责Volume和网络的管理
kube-proxy:负责为Service提供内部的服务发现和负载均衡,并维护网络规则
container-runtime:是负责管理运行容器的软件,比如docker

1.2 你对 Kubernetes 的负载均衡器有什么了解?

负载均衡器是暴露服务的最常见和标准方式之一。

根据工作环境使用两种类型的负载均衡器,即内部负载均衡器或外部负载均衡器。内部负载均衡器自动平衡负载并使用所需配置分配容器,而外部负载均衡器将流量从外部负载引导至后端容器。

1.3 经典pod的生命周期

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

Pending 部署Pod事务已被集群受理,但当前容器镜像还未下载完。
Running 所有容器已被创建,并被部署到k8s节点。
Successed Pod成功退出,并不会被重启。
Failed Pod中有容器被终止。
Unknown 未知原因,如kube-apiserver无法与Pod进行通讯。
详细叙述如下: 首先拖取Pod内容器的镜像,选择某个Node节点并启动Pod。 监控Pod状态,若Pod终止则根据策略决定是否重新调度。 Pod退出,并根据策略决定是否重启。

1.4 详述kube-proxy原理

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

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

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

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

1.5 deployment/rs的区别

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

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

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

1.6 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,以实现维持特定副本数的功能。

RS也是大致相同。

2、命令篇

2.1 查看ops这个命名空间下的所有pod,并显示pod的IP地址

kubectl get pods -n ops -o wide

2.2 查看tech命名空间下的pod名称为tech-12ddde-fdfde的日志,并显示最后30行

kubectl logs tech-12ddde-fdfde -n tech|tail -n 30

2.3 怎么查看test的命名空间下pod名称为test-5f7f56bfb7-dw9pw的状态

kubectl describe pods test-5f7f56bfb7-dw9pw -n test

2.4 如何查看test命名空间下的所有endpoints

kubectl get ep -n test

2.5 如何列出所有 namespace 中的所有 pod

kubectl get pods --all-namespaces

2.6、如何查看test命名空间下的所有ingress

kubectl get ingress -n test

2.7、如何删除test命名空间下某个deploymemt,名称为gitlab

kubectl delete deploy gitlab -n test

2.8 如何缩减test命名空间下deployment名称为gitlab的副本数为1

kubectl scale deployment gitlab -n test --replicas=1

2.9 如何在不进入pod内查看命名空间为test,pod名称为test-5f7f56bfb7-dw9pw的hosts

kubectl exec -it test-5f7f56bfb7-dw9pw -n test -- cat /etc/hosts

2.10 如何设置节点test-node-10为不可调度以及如何取消不可调度

kubectl cordon test-node-10     #设置test-node-10为不可调度
kubectl uncordon test-node-10 #取消

3、考察实际生产经验(最重要)

3.1 某个pod启动的时候需要用到pod的名称,请问怎么获取pod的名称,简要写出对应的yaml配置(考察是否对k8s的Downward API有所了解)

env:
- name: test
valueFrom:
fieldRef:
fieldPath: metadata.name

3.2 某个pod需要配置某个内网服务的hosts,比如数据库的host,刑如:192.168.4.124 db.test.com,请问有什么方法可以解决,简要写出对应的yaml配置或其他解决办法

解决办法:搭建内部的dns,在coredns配置中配置内网dns的IP

要是内部没有dns的话,在yaml文件中配置hostAliases,刑如:

hostAliases:
- ip: "192.168.4.124"
hostnames:
- "db.test.com"

3.3 请用系统镜像为centos:latest制作一个jdk版本为1.8.142的基础镜像,请写出dockerfile(考察dockerfile的编写能力)

FROM centos:latest
ARG JDK_HOME=/root/jdk1.8.0_142
WORKDIR /root
ADD jdk-8u142-linux-x64.tar.gz /root
ENV JAVA_HOME=/root/jdk1.8.0_142
ENV PATH=$PATH:$JAVA_HOME/bin
CMD ["bash"]

3.4 假如某个pod有多个副本,如何让两个pod分布在不同的node节点上,请简要写出对应的yaml文件(考察是否对pod的亲和性有所了解)

affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: "kubernetes.io/hostname"
labelSelector:
matchLabels:
app: test

3.5 pod的日志如何收集,简要写出方案(考察是否真正有生产经验,日志收集是必须解决的一个难题)

每个公司的都不一样,下面三个链接可当做参考
https://jimmysong.io/kubernetes-handbook/practice/app-log-collection.html
https://www.jianshu.com/p/92a4c11e77ba
https://haojianxun.github.io/2018/12/21/kubernetes%E5%AE%B9%E5%99%A8%E6%97%A5%E5%BF%97%E6%94%B6%E9%9B%86%E6%96%B9%E6%A1%88/

3.6 谈下你对k8s集群监控的心得,口述

3.7 集群如何预防雪崩,简要写出必要的集群优化措施

1、为每个pod设置资源限制
2、设置Kubelet资源预留

3.8 集群怎么升级,证书过期怎么解决,简要说出做法

参考
https://googlebaba.io/post/2019/09/11-renew-ca-by-kubeadm/ #更新证书 https://jicki.me/kubernetes/2019/05/09/kubeadm-1.14.1/ #集群升级

3.9 etcd如何备份,简要写出命令

参考:https://www.bladewan.com/2019/01/31/etcd_backup/
export ETCDCTL_API=3
etcdctl --cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
snapshot save /data/test-k8s-snapshot.db

3.10 在以往的k8s运维中遇到过哪些问题,怎么解决的

最新文章

  1. bootscript/javascript组件
  2. 采用DBCP连接池技术管理连接
  3. 高通平台FastMMI(FFBM模式)简介与进入方法
  4. ATS
  5. C# 根据ADO.NET数据库连接字符串构建EntityFrame数据库连接字符串
  6. python 添加类属性
  7. 使用filter统一设置编码
  8. 阿尔宾我饿iejr89e 如何
  9. firefox 对WebRTC支持
  10. Controller的激活
  11. String,StringBuffer,StringBuilder的区别及其源码分析
  12. Gem install Mysql2的问题
  13. Python开发——1.基础知识
  14. 用js互相调用iframe页面内的js函数
  15. Linux中怎么通过PID号找到对应的进程名及所在目录
  16. Android : 修改内核源码 and 编译、打包成新的boot.img
  17. ESP8266 ESP-01调试方法
  18. 抓包和测试Api类工具
  19. 转:ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
  20. 疯狂JAVA——第八章 java集合

热门文章

  1. HandlerMethodReturnValueHandler SpringMVC 参数解析 继承关系以及各解析器解析类型
  2. Springboot 条件注解
  3. 小程序 图表 antv f2 的使用
  4. Git采坑与问题排查
  5. docker 安装jenkins 发布 asp.net core 2.0
  6. c++ 二进制方式读取文件 读取特殊类型数据
  7. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之点播分享
  8. [转载]schtasks命令使用实例介绍
  9. 头部文件jq嵌入笔记
  10. 待补充 MySQL必知必会第29章--------数据库维护