公司現在上了一部分的業務至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運維中遇到過哪些問題,怎么解決的