公司如今上了一部分的業務至k8s,老實說,我內心很慌,在項目改造中,天天都會遇到不少問題,好友找我出一份k8s面試題,參考了網上的一些,再加上本身公司遇到的一些問題,整理以下:
參考連接:http://yaoguais.github.io/article/golang/k8sinterview.htmlhtml
一、理論篇node
1.1 簡要說下Kubernetes有哪些核心組件以及這些組件負責什麼工做?linux
etcd:提供數據庫服務保存了整個集羣的狀態 kube-apiserver:提供了資源操做的惟一入口,並提供認證、受權、訪問控制、API註冊和發現等機制 kube-controller-manager:負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等 cloud-controller-manager:是與底層雲計算服務商交互的控制器 kub-scheduler:負責資源的調度,按照預約的調度策略將Pod調度到相應的機器上 kubelet:負責維護容器的生命週期,同時也負責Volume和網絡的管理 kube-proxy:負責爲Service提供內部的服務發現和負載均衡,並維護網絡規則 container-runtime:是負責管理運行容器的軟件,好比docker
1.2 你對 Kubernetes 的負載均衡器有什麼瞭解?git
負載均衡器是暴露服務的最多見和標準方式之一。 根據工做環境使用兩種類型的負載均衡器,即內部負載均衡器或外部負載均衡器。內部負載均衡器自動平衡負載並使用所需配置分配容器,而外部負載均衡器將流量從外部負載引導至後端容器。
1.3 經典pod的生命週期github
Pod都處於如下幾種狀態之一,可經過查詢Pod詳情查看。 Pending 部署Pod事務已被集羣受理,但當前容器鏡像還未下載完。 Running 全部容器已被建立,並被部署到k8s節點。 Successed Pod成功退出,並不會被重啓。 Failed Pod中有容器被終止。 Unknown 未知緣由,如kube-apiserver沒法與Pod進行通信。 詳細敘述以下: 首先拖取Pod內容器的鏡像,選擇某個Node節點並啓動Pod。 監控Pod狀態,若Pod終止則根據策略決定是否從新調度。 Pod退出,並根據策略決定是否重啓。
1.4 詳述kube-proxy原理golang
問題:詳述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實現原理docker
問題: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.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.六、如何查看test命名空間下的全部ingress
kubectl get ingress -n test
2.七、如何刪除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.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 集羣如何預防雪崩,簡要寫出必要的集羣優化措施
一、爲每一個pod設置資源限制 二、設置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運維中遇到過哪些問題,怎麼解決的