1. K8s 是为了解决什么问题出现的和 Docker 有什么关系

随着 Docker 的普及,开发者可以轻松地打包应用为容器并在单台机器上运行。但当容器数量变多、服务之间依赖关系变复杂时,手动管理这些容器变得非常困难。Kubernetes 出现的核心目的就是:自动化部署、扩展和管理容器化应用

和Docker之间的关系:

  • Docker 提供了容器运行的基础能力:构建镜像、启动容器、隔离资源。

  • 它负责在单个主机上运行容器。

  • Kubernetes 不直接运行容器,而是调用容器运行时(如 Docker、containerd、CRI-O)来运行容器。

  • 它负责在多个节点上调度容器、保证服务高可用、自动扩缩容等。


2. K8s中有哪些核心组件,它们分别负责什么

Kubernetes(简称 K8s)的核心组件分为两个部分:控制平面组件(Control Plane Components) 和 节点组件(Node Components)。它们共同协作,实现容器化应用的自动化部署、扩展和管理。

组件

类型

功能

kube-apiserver

控制平面

提供 REST API,处理请求

etcd

控制平面

分布式数据库,保存集群状态

kube-scheduler

控制平面

将 Pod 调度到合适的工作节点

controller-manager

控制平面

运行各种控制器,保持集群状态一致

cloud-controller-manager

控制平面

对接云平台,处理云资源

kubelet

节点组件

与 API Server 通信,管理本机容器

kube-proxy

节点组件

实现 Service 的网络转发

Container Runtime

节点组件

运行容器(Docker、containerd 等)

CNI 插件

网络组件

实现 Pod 间网络互通

CoreDNS

Addon

集群内部域名解析


3. K8s中的最小单元是什么

一个 Pod 是 Kubernetes 中最小的可部署对象,它代表集群中运行的一个或多个容器的逻辑主机。这些容器共享网络、存储和运行在同一节点上。


4. 什么是容器运行时,有哪些常用的

容器运行时(Container Runtime) 是负责运行和管理容器的底层组件。它直接与操作系统内核交互,创建、启动、停止和监控容器。

Kubernetes 本身并不直接运行容器,而是通过 CRI(Container Runtime Interface) 接口调用容器运行时来完成这些操作。

容器运行时

描述

是否支持 CRI

备注

Docker Engine

最早流行的容器引擎

❌(需 cri-dockerd)

已被 Kubernetes 弃用

containerd

轻量级、高性能的容器运行时

Kubernetes 默认推荐

CRI-O

专为 Kubernetes 设计的轻量运行时

更加原生兼容 K8s

LXC / LXD

Linux 容器实现,更接近虚拟机

不适用于 Kubernetes

gVisor

Google 提供的安全沙箱容器

用于增强安全性

Kata Containers

虚拟机级别的安全容器

提供更强隔离性


5. 什么是CNI,有哪些常用的

CNI(Container Network Interface) 是 Kubernetes 中用于配置容器网络的接口规范。它的目标是为不同的网络插件提供一个统一的标准,使得各种网络方案可以无缝集成到 Kubernetes 中。

简单来说:

CNI 负责为 Pod 分配 IP 地址,并确保不同节点上的 Pod 可以互相通信。

推荐用途

是否支持网络策略

是否适合生产

Calico

平衡性最好

✅✅✅✅

Flannel

快速搭建

❌(默认)

✅✅

Weave

简单加密通信

✅✅

Cilium

高性能 + 安全

✅✅✅✅

Kube-router

一站式网络 + 负载均衡

✅✅✅


6. Pod与容器有什么区别

在 Kubernetes(K8s)中,Pod 与容器是两个不同层次的概念。理解它们之间的区别对于正确使用 Kubernetes 非常重要。

在K8S中:

  • 容器是最小的运行单元

  • Pod 是最小的部署和管理单元

对于K8S的基础概念,我们可以这么理解:

概念

类比

Container

房间里的住户(运行的应用)

Pod

一个房间(包含一个或多个住户)

Node

一栋楼(运行多个房间/Pod)

Cluster

整个小区(包含多个楼/Node)


7. 使用kubeadm安装一个Kubernetes集群

前略后略,后面将做一个教程来解释


8. 使用Nginx镜像运行一个pod

kubectl apply -f nginx-pod.yaml
kubectl run nginx-pod --image=nginx:latest --port=80


9. 如何查看此pod的事件

kubectl get pod nginx-pod -o yaml


10. 如何查看pod的日志

kubectl logs podname 可以查看Pod的日志,如果要实时查看就加上-f参数

kubectl logs -f nginx-pod


11. 如何查看Pod启动在在哪个机器上

kubectl get pod nginx-pod -o wide


12. 如何进入Pod中的容器

使用

kubectl exec -it nginx-pod -- /bin/sh


13. K8s中什么是抽象资源,什么是实例资源

1、抽象资源

抽象资源是描述系统期望状态的资源类型,通常用于定义应用程序应该如何运行,而不是当前实际运行的状态。它们通常是控制器(Controller)所依赖的模板或规范。

2、实例资源:

实例资源是指已经运行或正在运行的实际对象,它们是抽象资源被控制器实例化后的结果。你可以直接观察到这些资源的状态、IP、事件等信息。


14. Pod是抽象对象还是实例

在 Kubernetes 中,Pod 是实例资源(Concrete Resource),而不是抽象对象。


15. 有哪些方法可以访问到上面部署的Nginx

可以创建一个server,如:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080


16. Pod如何重启

可以通过删除pod,滚动更新等方式。


17. 如何删除上面创建的Pod

使用

kubectl delete pod podname


18. 这样单独创建Pod有什么缺点

1. 无法自动重启

如果 Pod 因为节点故障、容器崩溃等原因被删除或终止,Kubernetes 不会自动重新创建它。

2. 无滚动更新能力

没有控制器支持滚动更新策略,更新镜像必须手动删除并重建 Pod。

3. 无法水平扩展

你不能轻松地增加多个相同功能的 Pod 副本。

4. 生命周期管理困难

没有健康检查机制(如 livenessProbereadinessProbe),Pod 异常时无法自动恢复。

5. 与 Service 配合不够灵活

虽然可以通过 Label 选择器绑定 Service,但 Pod 一旦被删除,Service 会失去后端,直到新 Pod 创建完成。

6. 不适合 CI/CD 流程

没有模板版本控制,不利于自动化部署和回滚操作。

7. 缺乏副本保证

如果 Pod 被误删或节点宕机,服务将完全中断,没有副本保障可用性。

以他人的幸福为幸福,以他人的享乐为享乐。