設計的一些kubernetes面試題

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

相關文章
相關標籤/搜索