docker与k8s面试题基础
目錄
1.docker與虛擬機的區別
2.虛擬機常用有幾種網絡模式?
3.什么是容器:
4.什么是Docker容器?
5.容器技術的原理:
6.容器技術都有哪些應用:
7.容器的簡單安裝使用過程
8.docker能干些什么?
9.docker三大核心
10.virsh命令工具是提供管理各虛擬機的命令接口
11.自定義docker鏡像倉庫
12.docker自定義鏡像,如果寫了多條CMD,那么默認執行時會執行哪一條命令呢?
13.docker如何做持久化存儲
14.容器的六大命名空間
15.dockerfifile中ADD和Copy區別
16.docker命令
17.docker怎樣實現容器件的獨立
18.什么是ELK
19.微服務:
20.K8S架構:
21.Kubectl管理命令
22.K8S的POD
23.pod的創建過程:
24.控制器-Deployment:
25.K8S的監控
1.docker與虛擬機的區別
1)docker啟動快速,屬于秒級別.虛擬機啟動通常需要幾分鐘 2)docker需要的資源更少,docker在操作系統級別進行虛擬化,docker容器和內核交互,幾乎沒有性 能損耗,性能優于虛擬機 3)docker更輕量級,docker的架構可以共用一個內核與共享應用程序庫,占用內存極小.同樣的硬件 環境,docker運行的鏡像數量遠多于虛擬機數量,對系統的利用率更高 4)與虛擬機相比,docker的隔離性更弱,docker屬于進程之間的隔離,虛擬機可以實現系統級別的隔離 5)安全性:docker的安全性更弱,docker的租戶root和宿主機root等同,一旦容器內的用戶從普通用 戶權限提升為root權限,他就直接具備了宿主機的root權限,進而可進行無限制的操作.虛擬機租戶 root權限和宿主機的root虛擬機的權限是分離的 6)可管理性:docker的集中化管理工具還不算成熟,各種虛擬化技術都有成熟的管理工具,例 如:VMware等 7)高可用和可恢復性:docker對業務的高可用支持是通過快速部署實現的.虛擬機具備負載均衡,高可用,容錯性,遷移和數據保護等成熟的熟的保障機制,保障業務的連續性 8)快速創建、刪除:虛擬化的創建是分鐘級別的,docker容器創建是秒級別的,docker的快速迭代性決定了無論是開發、測試部署都可以節約大量時間 9)交付、部署:虛擬機可以通過鏡像實現環境交付的一致性,但鏡像分發無法體系化,docker在 dockerfifile中記錄了容器的構建過程,可在集群中實現快速分發和快速部署2.虛擬機常用有幾種網絡模式?
有橋接模式、隔離模式(自定義模式)、NAT模式、路由模式橋接模式:Guest與Host連接到同一個交換機上;通過橋接物理網卡,相當于直連到Host所在網 絡。 隔離模式:允許Guest訪問同一虛擬交換機上的其他Guest;但是不能訪問Host所在的外部網絡。 NAT模式(默認):將Guest虛擬機的默認網關指向Host物理機的virtbr0接口的IP地址;Guest共 享真機的網絡連接,以地址轉換的方式訪問外網。 路由模式:由Host物理機充當路由器,開啟轉發;需要額外設置外網與Guest虛擬機之間互訪的路由條目,Guest以路由轉發的方式訪問外網(需要在真機配置iptables規則)。3.什么是容器:
容器就是將軟件打包成標準戶單元,用于開發、交付和部署,是應用程序封裝和交付的核心技術。
4.什么是Docker容器?
Docker容器包括應用程序及其所有依賴項,但與其他容器共享內核, 在主機操作系統的用戶空間中作為獨立進程運行。Docker容器是Docker鏡像的實例5.容器技術的原理:
利用Cgroups和Namespace兩大機制,前者是將進程分組管理的內核功能,通過Cgroups隔離進程,控制進程的資源占用(cpu,內存等)情況在操作系統底層限制物理資源,起到集裝箱/容器的作用;后者是讓每個進程組有獨立的PID,IPC和網絡空間,起到隔離的作用。
還有一個SELinux 安全
6.容器技術都有哪些應用:
1.容器化傳統應用:容器不僅能提高現有應用的安全性和可移植性,還能節約成本。
2.持續集成和持續部署 (CI/CD) 通過 Docker 加速應用管道自動化和應用部署,提升交付速度
3.微服務 加速應用架構現代化進程。核心:拆分服務(nginx+php-fpm)
4.IT 基礎設施優化 充分利用基礎設施,節省資金。
將微服務應用放置在容器中,帶來了快速與可移植性。從開發、測試、上線,實現了“一次編寫,到處運行”。
總之,通過容器、微服務的有效結合應用,最終幫助企業應用演進到互聯網架構,實現IT投資和收益的最優化。
7.容器的簡單安裝使用過程
環境準備:需要64位操作系統,centos7以上版本,關閉防火墻,開啟路由轉發,開放iptable的FORWARD默認規則
安裝軟件:docke-ce*+依賴包(多數需要連上阿里云等網絡yum源安裝)
導入鏡像:#docker load -i ?鏡像.tar.gz
啟動容器:#docker run -itd ?+鏡像名:標簽 ?/bin/bash
8.docker能干些什么?
1)加速本地開發(通過Docker能夠快速搭建好開發和運行環境,并且該環境可以直接傳遞給測 試和產品部署) 2)自動打包和部署應用 3)創建輕量、私有的PasS環境 4)自動化測試和持續集成部署 5)部署并擴展Web應用、數據庫和后端服務 6)創建安全沙盒(使容器隔離) 7)輕量級的桌面虛擬化9.docker三大核心
docker主要包括三大核心概念,理解了這三個核心概念,就能理解docker的整個生命周期: 1)鏡像:類似于虛擬機鏡像,可以將它理解為一個面向Docker引擎的只讀模板,包含了文件系統,鏡像是創建Docker容器的基礎。 2)容器:類似于一個輕量級的沙箱,Docker利用容器來運行和隔離應用。容器是從鏡像的應用運行實例,可以將其啟動,開始,停止,刪除,而這些容器都是相互隔離,互不可見的。鏡像自 身是只讀的,容器從鏡像啟動的時候,Docker會在鏡像的最上層創建一個可寫層,鏡像本身保持不變。 3)倉庫:類似于代碼倉庫,是docker集中存放鏡像文件的場所。10.virsh命令工具是提供管理各虛擬機的命令接口
– 支持交互模式,查看/創建/停止/關閉 .. .. 格式:virsh 控制指令 [虛擬機名稱] [參數] virsh nodeinfo #//查看KVM節點(服務器)信息 virsh list #//列出正在運行的虛擬機 virsh list --all #//列出所有的虛擬機 virsh net-list--all #//列出虛擬網絡 virsh dominfo 虛擬機名稱 #查看挃定虛擬機的信息 運行|重啟|關閉挃定的虛擬機 virsh start|reboot|shutdown 虛擬機名稱11.自定義docker鏡像倉庫
1)創建存放Dockerfifile的目錄 2)書寫Dockerfifile FROM:基礎鏡像 MAINTAINER:鏡像創建者的信息 EXPOSE:開放的端口 ENV:設置變量 ADD:復制文件到鏡像 RUN:制作鏡像時執行的命令,可以有多個 WORKDIR:容器默認的工作目錄 CMD:容器啟動時執行的命令,僅可以有一條CMD 3)執行docker命令創建鏡像倉庫 docker build 容器名:標簽 .(當前)12.docker自定義鏡像,如果寫了多條CMD,那么默認執行時會執行哪一條命令呢?
如果寫入了多條CMD,那么執行時默認或執行最后一條命令13.docker如何做持久化存儲
1)Bind mounts:可以實現將Host中的任意路徑掛載到容器中,可以存儲在任意位置,非 Docker的進程或者容器可能隨時對其進行修改,存在一定的風險。 在單容器情況下,使用Bind mount可以用 -v 或者 --volume,在swarm集群中,我們使用 -- mount,在Docker17.06之后,可以統一使用 --mount 2)Volumes:實現將Docker中的某一個volume掛載到容器中,存儲在Docker Host文件系統的某一個路徑下,默認是/var/lib/docker/volumes,由Docker進行管理,非Docker的進程不能修改該路徑下的文件,比較安全。VOlumes和bind的對比: Volumes 的備份和遷移更加容易。 可以使用 Docker CLI 或者 Docker API 管理 volumes。 Volumes 既可以在 Linux 的容器中使用,也可以在 Windows 的容器中使用。 Volumes 在多容器中共享更加的安全。 Volume drivers 允許我們把數據存儲在遠程主或云提供商。| 不同點 | bind mount | volume |
| source位置 | 可以任意指定 | NarlibdockerNolimes/ |
| Host源地址為空 | 覆蓋掉有容器的內容 | 容器內數據復制到volume |
| 是否支持單個文件 | 支持 | 不支持,只能是目錄 |
| 權限控制 | 讀寫或者只讀 | 讀寫或者只讀 |
| 移值性 | 弱,與host path綁定 | 強,無需指定host目錄 |
| Key | Value |
| type | bind,volume,tmpfs,如不指定默認為volume |
| destination(或者dst/target) | 容器中的路徑 |
| tmpfs-type(或者tmpfs-mode) | 附加參數 |
14.容器的六大命名空間
六大命名空間:主機名空間、文件系統、用戶、網絡、進程、信號向量15.dockerfifile中ADD和Copy區別
COPY指令和ADD指令的區別在于是否支持從遠程URL獲取資源。 COPY指令只能從執行docker build所在的主機上讀取資源并復制到鏡像中。COPY不能對壓 縮文件進行自動解壓,COPY只能對一些較小的文件進行操作,不能對大文件操作 ADD指令還支持通過URL從遠程服務器讀取資源并復制到鏡像中。ADD可以對壓縮文件進行 自動解壓并安裝build16.docker命令
容器生命周期管理 — docker[run|start|stop|restart|kill|rm|pause|unpause] 容器操作運維 — docker[ps|inspect|top|attach|events|logs|wait|export|port] 容器 rootfs命令 — docker[commit|cp|diffff] 鏡像倉庫 — docker[login|pull|push|search] 本地鏡像管理 — docker[images|rmi|tag|build|history|save|import] 其他命令 — docker[info|version]17.docker怎樣實現容器件的獨立
1)pidnamespace 不同用戶的進程就是通過 pidnamespace隔離開的,且不同 namespace中可以有相同pid。所有的LXC 進程在 docker中的父進程為 docker進程,每個 lxc進程具有不同的 namespace。 2)netnamespace 有了 pidnamespace,每個 namespace中的 pid能夠相互隔離,但是網絡端口還是共享host的端 口。網絡隔離是通過 netnamespace實現的,每個 netnamespace有獨立的network devices,IP addresses,IP routing tables,/proc/net目錄。這樣每個container的網絡就能隔離開來。docker 默認采用 veth的方式將 container中的虛擬網卡同 host上的一個 dockerbridge:docker0連接在一起。 3)ipcnamespace container 中 進 程 交 互 還 是 采 用 linux 常 見 的 進 程 間 交 互 方 法 (interprocess communication- IPC),包括常見的信號量、消息隊列和共享內存。 container的進程間交互實際上還是host上具有相同pidnamespace中的進程間交互。 4)mntnamespace 類 似 chroot,將 一 個 進 程 放 到 一 個 特 定 的 目 錄 執 行 。 mnt namespace 允 許 不 同 namespace的進程看到的文件結構不同,這樣每個 namespace中的進程所看到的文件目錄就被隔離開了。在 container里頭,看到的文件系統,就是一個完整的 linux系統,有 /etc、/lib等,通過chroot實現。 5)utsnamespaceUTS("UNIX Time-sharing System")namespace允許每個 container擁有獨立的hostname和domainname,使其在網絡上可以被視作一個獨立的節點而非 Host上的一個進程。 6)usernamespace 每個 container可以有不同的 user和 groupid,也就是說可以在 container內部用container內部的用戶執行程序而非 Host上的用戶。 有了以上 6種 namespace從進程、網絡、IPC、文件系統、UTS 和用戶角度的隔離,一個 container就可以對外展現出一個獨立計算機的能力,并且不同 container從 OS 層面實現了隔離.然而不同 namespace之間資源還是相互競爭的,仍然需要類似 ulimit來管理每個 container所能使用的資源 - -cgroup。 cgroups(Controlgroups)實現了對資源的配額和度量。18.什么是ELK
三大組件 Elasticsearch:負責日志檢索和儲存 Logstash:負責日志收集和分析、處理 Kibana:負責日志的可視化 ELK可用于解決: 分布式日志數據集中式查詢和管理 系統監控,包含系統硬件和應用各個組件的監控 故障排查 安全信息和事件管理 報表功能 Elasticsearch特點: 實時分析 分布式實時文件存儲,將每個字段都編入索引 文檔導向,所有的對象全部是文檔高可用性,易擴展,支持集群(Cluster)、分片和復制(shards和Replicas) 接口友好,支持JSON Logstash特點: 所有類型的數據集中處理 不同模式和格式數據的正?;? 自定義日志格式的迅速擴展 為自定義數據源輕松添加插件 Kibana特點: 靈活的分析和可 視化平臺 實時總結流量和數據的圖表 為不同的用戶顯示直觀的界面 及時分享和嵌入的儀表板19.微服務:
微服務架構也是從Monolithic架構演進來的。Monolithic應用中按照職責的不同,拆分解耦成一個個的單獨微服務(Micro Services),每個微服務都對應了一個獨立的業務功能,也只定義了該功必須的一些操作。微服務獨自或者共同部署在多臺應用服務器上,微服務之間通過標準的Restful接口實現訪問。這樣當一個微服務出現問題時,并不會影響到其他的服務。而且,微服務可以基于資源的需求進行獨立擴展,可以被部署在更小的主機上。各個微服務使用的開發語言也可以不同,只要保持接口協議統一。
Monolithic架構天然的不具備健壯性,因為一旦某個組件出現問題,整個服務基本上就掛了。自身不具備分布式服務能力,通常需要依賴于負載均衡器、數據庫HA等來實現服務的分布化和負載分擔。相對而言,互聯網架構優勢在于分布式、去中心化,支持彈性伸縮。其核心是輕應用、微服務。
20.K8S架構:
主要由master組件丶node節點組件丶image鏡像倉庫組成
?master組件又分很多組件:
????????api server整個系統的對外接口
???????? scheduler 系統資源調度器
???????? controller manager 管理控制器
????????? etcd 負責節點間的服務發現和配置共享
?flannel 網絡插件,實現不同主機的容器間互聯互通
K8S集群管理:管理命令kubectl,啟動容器服務,查看資源,查看節點狀態等
POD:K8S中最小的部署單元,不是進程/程序,而是一個環境,包括容器,存儲,網絡,配置等.pod是臨時性的.資源文件:定義了如何啟動PDO,如何運行,啟動副本等功能的文件,叫資源文件.可以用來創建,刪除,管理資源對象.
node計算節點安裝:
????????docker-ce
????????kubelet,
????????kube-proxy,
IPVS模式,daemon.json,master主機的token值和證書.
安裝網絡插件flannel:實現不同主機的容器間互聯互通.
21.Kubectl管理命令
補全kubectl命令的Tab鍵:
\# kubectl completion bash >/etc/bash_completion.d/kubectl
\# kubeadm completion bash >/etc/bash_completion.d/kubeadm
kubectl get命令:
\#kubectl get nodes(查詢節點狀態) ?#kubectl get deployment(查詢資源名稱)
\#kubectl get pods -o wide #查詢pod容器資源和主機信息
kubectl exec命令:
\#kubectl exec -it 容器id /bin/bash ?#啟動新命令,進入一個正在運行的容器中
kubectl describe命令:
\#kubectl describe 資源類型 資源名稱 ?#查詢資源詳細信息(多用于拍錯)
kubectl logs和attach命令:
\#kubectl logs 資源名稱 ??#輸出操作日志信息
kubectl delete命令:
\#kubectl delete 資源類型 資源名稱 ?#刪除資源(直接刪除pod會自動創建pod,刪除資源則不會)
集群擴容命令:
\#kubectl scale 資源名稱 --replicas=1/2/3 ??#pod伸縮
查看K8S日志命令:
22.K8S的POD
k8s中的最小部署單元,不是一個程序/進程,而是一個環境(包括容器、存儲、網絡ip:port、容器配置)。
其中可以運行1個或多個容器(docker或其他容器),在一個pod內部的容器共享所有資源,包括共享pod的ip:port和磁盤。
pod是臨時性的,用完即丟棄的,當pod中的進程結束、node故障,或者資源短缺時,pod會被干掉。基于此,用戶很少直接創建一個獨立的pods,而會通過k8s中的controller來對pod進行管理。
23.pod的創建過程:
1)kubectl 向api server(提供各種資源對象)發起一個create pod 請求
2)api server接收到pod創建請求后,生成一個包含創建信息的yaml
3)api server將剛才的yaml信息寫入etcd數據庫
4)scheduler(資源調度器) 查看 api server,類似于通知機制
5)kubelet(node節點架構之一,監控容器的) 通過監測etcd數據庫,發現api server 中有了個新的Node;調用node中的docker api,創建容器
24.控制器-Deployment:
支持擴容/收縮,支持應用服務更新與回滾
25.K8S的監控
metrics-server:監控系統資源使用的插件,監控node節點上cpu,內存使用率等,啟用監控需要kubelet證書
Dashboard:基于網頁的Kubernetes用戶界面,可以對容器應用拍錯,管理集群資源,展示了K8S集群中的資源狀態信息和所有報錯信息.
Prometheus:監控系統和時間序列數據庫,目前常用里監控K8S容器管理系統.
總結
以上是生活随笔為你收集整理的docker与k8s面试题基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络基本面试题
- 下一篇: 监控zabbix面试题