Skip to content

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 的基础概念和实践操作,建议结合实际项目进行学习和练习。

小小棱镜,无限可能 | CC BY-NC-SA 4.0 协议