准备 Kubernetes 技术面试

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本全面教程旨在帮助你为 Kubernetes 技术面试做好准备。通过掌握本指南中涵盖的基本概念和实践技能,你将有充分的准备自信地应对与 Kubernetes 相关的面试问题,并展示你在这个快速发展领域的专业知识。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/CoreConceptsGroup(["Core Concepts"]) kubernetes(("Kubernetes")) -.-> kubernetes/ClusterInformationGroup(["Cluster Information"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/CoreConceptsGroup -.-> kubernetes/architecture("Architecture") kubernetes/ClusterInformationGroup -.-> kubernetes/cluster_info("Cluster Info") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/version("Version") subgraph Lab Skills kubernetes/architecture -.-> lab-393032{{"准备 Kubernetes 技术面试"}} kubernetes/cluster_info -.-> lab-393032{{"准备 Kubernetes 技术面试"}} kubernetes/describe -.-> lab-393032{{"准备 Kubernetes 技术面试"}} kubernetes/config -.-> lab-393032{{"准备 Kubernetes 技术面试"}} kubernetes/version -.-> lab-393032{{"准备 Kubernetes 技术面试"}} end

Kubernetes 基础

什么是 Kubernetes?

Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。它最初由谷歌设计,现在由云原生计算基金会(Cloud Native Computing Foundation,CNCF)维护。

Kubernetes 关键概念

  • Pod:Kubernetes 中最小的可部署单元,代表一个或多个一起运行的容器。
  • 节点:运行 Kubernetes 容器的物理机或虚拟机。
  • 部署:管理一组 Pod 期望状态的声明式方式。
  • 服务:定义一组 Pod 的逻辑集合以及访问它们的策略的抽象。
  • :提供一种存储数据的方式,这些数据在 Pod 的生命周期之外仍然存在。
  • ConfigMap 和 Secret:分别提供一种存储和管理配置数据以及敏感信息的方式。

Kubernetes 架构

graph TD A[主节点] --> B[工作节点] A --> C[工作节点] B --> D[Pod] B --> E[Pod] C --> F[Pod] C --> G[Pod]

安装和配置 Kubernetes

  1. 在 Ubuntu 22.04 上安装 Kubernetes 组件(例如 kubeadmkubeletkubectl)。
  2. 使用 kubeadm 初始化 Kubernetes 集群。
  3. 将工作节点加入集群。
  4. 配置 kubectl 以与 Kubernetes 集群进行交互。

部署一个简单应用

## 创建一个部署
kubectl create deployment nginx --image=nginx

## 将部署暴露为服务
kubectl expose deployment nginx --port=80 --type=LoadBalancer

## 扩展部署
kubectl scale deployment nginx --replicas=3

Kubernetes 架构与组件

Kubernetes 主组件

  • API 服务器:中央控制平面,它公开 Kubernetes API 并处理 RESTful 请求。
  • 调度器:负责在集群中可用的节点之间分配工作负载或容器。
  • 控制器管理器:负责维护集群的期望状态,例如复制 Pod 和处理节点故障。
  • etcd:一个分布式键值存储,用于存储 Kubernetes 集群的状态。

Kubernetes 工作节点组件

  • kubelet:在每个节点上运行的主要“节点代理”,负责与 Kubernetes 主节点通信。
  • kube-proxy:在每个节点上维护网络规则,实现服务与 Pod 之间的通信。
  • 容器运行时:负责运行容器的软件,如 Docker 或 containerd。

Kubernetes 网络

graph TD A[Pod] --> B[服务] B --> C[入口] C --> D[外部流量]
  1. Pod:每个 Pod 都有自己唯一的 IP 地址,Pod 内的容器可以使用 localhost 相互通信。
  2. 服务:为访问一组 Pod 提供稳定的端点,抽象底层网络拓扑。
  3. 入口:为服务提供负载均衡、SSL 终止和基于名称的虚拟主机功能。

Kubernetes 存储

  • :提供一种存储数据的方式,这些数据在 Pod 的生命周期之外仍然存在。
  • 持久卷(PV):表示集群中的一块存储,独立于 Pod 的生命周期。
  • 持久卷声明(PVC):请求存储资源,可由一个或多个持久卷满足。

部署和管理 Kubernetes 集群

部署 Kubernetes 集群

  1. kubeadm:一个用于引导创建最小可行 Kubernetes 集群的工具。

    ## 初始化控制平面
    
    ## 将工作节点加入集群
  2. Minikube:一个用于在本地机器上创建单节点 Kubernetes 集群以进行开发和测试的工具。

    ## 启动 Minikube 集群
    minikube start

管理 Kubernetes 集群

  • kubectl:用于与 Kubernetes API 进行交互的命令行工具。
  • Kubernetes 仪表板:一个用于管理 Kubernetes 集群的基于 Web 的用户界面。
  • Helm:一个 Kubernetes 包管理器,可简化应用程序的部署和管理。

升级 Kubernetes 集群

  1. kubeadm upgrade:将 Kubernetes 集群升级到新版本。

    ## 升级控制平面
    sudo kubeadm upgrade plan
    sudo kubeadm upgrade apply v1.21.0
    
    ## 升级工作节点
    sudo kubeadm upgrade node
  2. 托管 Kubernetes 服务:如 GKE、EKS 和 AKS 等平台会自动处理升级过程。

扩展 Kubernetes 集群

  • 水平 Pod 自动缩放器 (HPA):根据 CPU 利用率或其他指标自动扩展部署中的 Pod 数量。
  • 集群自动缩放器:通过添加或删除节点自动调整 Kubernetes 集群的大小。

Kubernetes 网络与服务

Kubernetes 网络模型

  • Pod 网络:每个 Pod 都有其唯一的 IP 地址,并且 Pod 内的容器可以使用 localhost 相互通信。
  • 服务网络:为访问一组 Pod 提供稳定的端点,抽象底层网络拓扑。

Kubernetes 服务

  • ClusterIP:在集群内部 IP 地址上公开服务,该地址仅在集群内部可访问。
  • NodePort:在每个节点的 IP 地址上的静态端口公开服务。
  • LoadBalancer:使用云提供商的负载均衡器在外部公开服务。
  • ExternalName:通过返回 CNAME 记录将服务映射到 externalName 字段的内容。
graph TD A[Pod] --> B[ClusterIP 服务] B --> C[NodePort 服务] C --> D[LoadBalancer 服务] D --> E[外部流量]

入口

入口是一个 API 对象,用于管理对 Kubernetes 集群中服务的外部访问,通常是 HTTP 访问。

## 创建一个入口资源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80

Kubernetes 存储与卷

Kubernetes 卷

Kubernetes 卷提供了一种存储数据的方式,这些数据在 Pod 的生命周期之外仍然存在。它们可以挂载到 Pod 内的容器中。

卷的类型

  • emptyDir:一个临时目录,只要 Pod 在节点上运行就会存在。
  • hostPath:将主机节点文件系统中的文件或目录挂载到 Pod 中。
  • NFS:将 NFS 共享挂载到 Pod 中。
  • 持久卷声明(PersistentVolumeClaim,PVC):请求存储资源,这些资源可以由一个或多个持久卷来满足。

持久卷(PV)

持久卷表示集群中的一块存储,独立于 Pod 的生命周期。它们可以由管理员静态配置,也可以使用存储类动态配置。

apiVersion: v1
kind: 持久卷
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/my-pv

持久卷声明(PVC)

持久卷声明请求存储资源,这些资源可以由一个或多个持久卷来满足。

apiVersion: v1
kind: 持久卷声明
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

动态配置

Kubernetes 支持使用存储类对持久卷进行动态配置。这允许持久卷声明自动得到满足,而无需手动创建持久卷。

Kubernetes 配置与密钥管理

配置映射(ConfigMaps)

配置映射用于存储非敏感的配置数据,例如应用程序设置,这些数据可以作为环境变量注入到 Pod 中,或者作为文件挂载。

apiVersion: v1
kind: 配置映射
metadata:
  name: app-config
data:
  APP_COLOR: blue
  APP_ENV: production

密钥(Secrets)

密钥用于以安全的方式存储敏感信息,例如密码、API 密钥或证书。

apiVersion: v1
kind: 密钥
metadata:
  name: app-secret
type: Opaque
data:
  DB_PASSWORD: dXNlcnBhc3N3b3Jk
  API_KEY: YXBpa2V5

注入配置和密钥

配置和密钥可以通过以下方式注入到 Pod 中:

  1. 环境变量:在容器内将数据作为环境变量公开。
  2. 卷挂载:将数据作为文件挂载到容器内。
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
    - name: app-container
      image: myapp:v1
      env:
        - name: APP_COLOR
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: APP_COLOR
      envFrom:
        - secretRef:
            name: app-secret
      volumeMounts:
        - name: config
          mountPath: /etc/app
  volumes:
    - name: config
      configMap:
        name: app-config

Kubernetes 中的监控与日志记录

Kubernetes 中的监控

Kubernetes 提供了多个内置监控工具,并支持与各种第三方监控解决方案集成。

指标服务器(Metrics Server)

指标服务器是一个可扩展、高效且基于 RESTful 的 API 服务器,它从集群中的所有节点和 Pod 收集资源使用数据。

## 安装指标服务器
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Prometheus

Prometheus 是一个广受欢迎的开源监控和警报系统,可与 Kubernetes 集成以收集和存储指标。

graph TD A[Kubernetes 集群] --> B[Prometheus] B --> C[Alertmanager] B --> D[Grafana]

Kubernetes 中的日志记录

Kubernetes 支持各种日志记录解决方案,包括与第三方日志管理系统集成。

Kubernetes 日志记录架构

  • 容器日志:容器生成的日志会写入容器的标准输出(stdout)和标准错误(stderr)。
  • 节点日志:Kubernetes 组件(例如 kubelet、kube-proxy)生成的日志存储在节点的文件系统上。

集中式日志记录

Kubernetes 支持与集中式日志记录解决方案集成,例如 Elasticsearch、Fluentd 或 Loki,以聚合和管理集群中所有节点和 Pod 的日志。

graph TD A[Kubernetes 集群] --> B[Fluentd] B --> C[Elasticsearch] C --> D[Kibana]

保障 Kubernetes 的安全并控制对其的访问

认证

Kubernetes 支持多种认证方法,包括:

  • X.509 客户端证书:客户端出示有效的 X.509 证书进行认证。
  • 承载令牌:客户端在 Authorization 头部中出示承载令牌。
  • 基本认证:客户端提供用户名和密码。

授权

Kubernetes 使用基于角色的访问控制(RBAC)模型在集群内授权操作。

RBAC 资源

  • 角色/集群角色:定义一组权限。
  • 角色绑定/集群角色绑定:将角色/集群角色与用户、组或服务账户相关联。
apiVersion: rbac.authorization.k8s.io/v1
kind: 角色
metadata:
  namespace: 默认
  name: pod-读取器
rules:
  - apiGroups: [""] ## "" 表示核心 API 组
    resources: ["pods"]
    verbs: ["get", "watch", "list"]

网络策略

Kubernetes 网络策略允许你控制 Pod 之间以及与外部资源的通信方式。

apiVersion: networking.k8s.io/v1
kind: 网络策略
metadata:
  name: 拒绝外部访问
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: myapp

准入控制器

准入控制器是拦截对 Kubernetes API 服务器请求的插件,使你能够实施自定义策略和验证。

总结

在本教程中,你将深入了解 Kubernetes 的核心方面,包括其架构、部署、网络、存储、配置、监控和安全。到最后,你将对在下次 Kubernetes 技术面试中脱颖而出所需的基本 Kubernetes 知识和实践技能有扎实的理解。