简介
本全面教程旨在帮助你为 Kubernetes 技术面试做好准备。通过掌握本指南中涵盖的基本概念和实践技能,你将有充分的准备自信地应对与 Kubernetes 相关的面试问题,并展示你在这个快速发展领域的专业知识。
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
- 在 Ubuntu 22.04 上安装 Kubernetes 组件(例如
kubeadm、kubelet、kubectl)。 - 使用
kubeadm初始化 Kubernetes 集群。 - 将工作节点加入集群。
- 配置
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[外部流量]
- Pod:每个 Pod 都有自己唯一的 IP 地址,Pod 内的容器可以使用
localhost相互通信。 - 服务:为访问一组 Pod 提供稳定的端点,抽象底层网络拓扑。
- 入口:为服务提供负载均衡、SSL 终止和基于名称的虚拟主机功能。
Kubernetes 存储
- 卷:提供一种存储数据的方式,这些数据在 Pod 的生命周期之外仍然存在。
- 持久卷(PV):表示集群中的一块存储,独立于 Pod 的生命周期。
- 持久卷声明(PVC):请求存储资源,可由一个或多个持久卷满足。
部署和管理 Kubernetes 集群
部署 Kubernetes 集群
kubeadm:一个用于引导创建最小可行 Kubernetes 集群的工具。
## 初始化控制平面 ## 将工作节点加入集群Minikube:一个用于在本地机器上创建单节点 Kubernetes 集群以进行开发和测试的工具。
## 启动 Minikube 集群 minikube start
管理 Kubernetes 集群
- kubectl:用于与 Kubernetes API 进行交互的命令行工具。
- Kubernetes 仪表板:一个用于管理 Kubernetes 集群的基于 Web 的用户界面。
- Helm:一个 Kubernetes 包管理器,可简化应用程序的部署和管理。
升级 Kubernetes 集群
kubeadm upgrade:将 Kubernetes 集群升级到新版本。
## 升级控制平面 sudo kubeadm upgrade plan sudo kubeadm upgrade apply v1.21.0 ## 升级工作节点 sudo kubeadm upgrade node托管 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 中:
- 环境变量:在容器内将数据作为环境变量公开。
- 卷挂载:将数据作为文件挂载到容器内。
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 知识和实践技能有扎实的理解。


