K8S 基础
概述
Kubernetes (简称 K8s)是一个开源的容器编排平台,用于自动化管理容器化应用。就像容器的"调度和管理中心",让应用更高效、可扩展、可靠运行。
核心概念
集群架构组件
Master 节点(控制平面)
- API Server:集群的统一入口,接收和处理所有 REST 请求
- etcd:分布式键值存储,保存集群的所有配置信息
- Controller Manager:运行控制器进程,管理集群状态
- Scheduler:负责将 Pod 调度到合适的 Node 上
Worker 节点
- kubelet:在每个节点上运行的代理,管理容器的生命周期
- kube-proxy:维护网络规则,实现服务的网络代理
- Container Runtime:容器运行时(如 Docker、containerd)
核心资源对象
- Pod:K8s 中最小的部署单元,包含一个或多个紧密相关的容器
- Service:为 Pod 提供稳定的网络访问入口
- Deployment:管理 Pod 的部署和更新
- ConfigMap:存储非敏感的配置数据
- Secret:存储敏感数据如密码、token
- Namespace:提供资源隔离的虚拟集群
基本操作
kubectl 命令行工具
kubectl 是 K8s 的命令行客户端,用于与集群交互。
常用命令:
bash
# 查看集群信息
kubectl cluster-info
# 查看节点
kubectl get nodes
# 查看所有 Pod
kubectl get pods --all-namespaces
# 查看特定命名空间的资源
kubectl get pods -n kube-system
# 创建资源
kubectl apply -f deployment.yaml
# 删除资源
kubectl delete -f deployment.yaml
# 查看 Pod 日志
kubectl logs pod-name
# 进入 Pod 内部
kubectl exec -it pod-name -- /bin/bash
# 端口转发
kubectl port-forward pod-name 8080:80
# 查看资源详细信息
kubectl describe pod pod-name实践示例
创建一个简单的 Nginx 部署
yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80创建 Service 暴露应用
yaml
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer部署步骤:
bash
# 1. 创建部署
kubectl apply -f nginx-deployment.yaml
# 2. 创建服务
kubectl apply -f nginx-service.yaml
# 3. 查看部署状态
kubectl get deployments
kubectl get pods
kubectl get services
# 4. 测试访问
kubectl get service nginx-service网络模型
Pod 网络
- 每个 Pod 都有唯一的 IP 地址
- Pod 内的容器共享网络命名空间
- Pod 之间可以直接通信
Service 网络
- ClusterIP:集群内部访问(默认)
- NodePort:通过节点端口访问
- LoadBalancer:通过云提供商的负载均衡器访问
- ExternalName:将服务映射到外部域名
Ingress
- 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由
- 可以提供负载均衡、SSL 终止和基于名称的虚拟主机
存储管理
Volume 类型
- emptyDir:Pod 生命周期内的临时存储
- hostPath:挂载宿主机目录
- persistentVolume:持久化存储
- configMap:挂载配置文件
- secret:挂载敏感数据
持久化存储
yaml
# PersistentVolume 示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/pv-example配置管理
ConfigMap 示例
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
database.host=localhost
database.port=5432
log-level: "INFO"Secret 示例
yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: YWRtaW4= # base64 编码的 'admin'
password: MWYyZDFlMmU2N2Rm # base64 编码的密码最佳实践
资源限制
- 为容器设置 CPU 和内存的 requests 和 limits
- 使用 ResourceQuota 限制命名空间资源使用
健康检查
- 配置 livenessProbe 检测容器是否正常运行
- 配置 readinessProbe 检测容器是否准备好接收流量
安全性
- 使用非 root 用户运行容器
- 设置 Pod Security Standards
- 使用 RBAC 控制访问权限
监控和日志
- 使用 Prometheus 进行监控
- 集中化日志收集(如 ELK Stack)
- 设置告警规则
常见问题排查
Pod 无法启动
bash
# 查看 Pod 状态和事件
kubectl describe pod pod-name
# 查看容器日志
kubectl logs pod-name -c container-name
# 查看节点资源使用情况
kubectl top nodes
kubectl top pods网络连通性问题
bash
# 测试 Pod 间网络
kubectl exec -it pod1 -- ping pod2-ip
# 测试服务访问
kubectl exec -it pod-name -- nslookup service-name
# 查看 Service 端点
kubectl get endpoints service-name存储问题
bash
# 查看 PV 和 PVC 状态
kubectl get pv
kubectl get pvc
# 查看存储类
kubectl get storageclass学习资源
官方文档
在线实践
推荐书籍
- 《Kubernetes in Action》
- 《Kubernetes 权威指南》
本文档涵盖了 Kubernetes 的基础概念和实践操作,建议结合实际项目进行学习和练习。