从入门到实践:Kubernetes(K8s)完全指南

一、Kubernetes 是什么?

Kubernetes(简称 K8s) 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它诞生于谷歌,借鉴了其内部十多年的大规模容器管理经验,旨在解决容器化应用在部署、弹性伸缩、服务发现、故障恢复等方面的复杂性问题。

核心优势:

  1. 自动化部署与扩缩容:一键部署应用,根据负载自动调整副本数量。
  2. 高可用性:自动修复故障容器,确保应用始终运行。
  3. 资源高效利用:通过调度算法优化资源分配,降低硬件成本。
  4. 多云/混合云支持:统一管理不同基础设施上的容器集群。

二、核心概念快速入门

在学习使用 K8s 前,需理解以下核心术语:

1. 容器与 Pod

  • 容器(Container):封装应用及其依赖的轻量级运行单元(如 Docker 容器)。
  • Pod:K8s 中最小的部署单元,一个 Pod 可包含一个或多个紧密关联的容器(通常是一个主容器 + 辅助容器),共享网络和存储资源。

2. 控制器(Controller)

  • Deployment:最常用的控制器,用于管理 Pod 的副本数量、更新策略(如滚动更新)。
  • StatefulSet:用于有状态应用(如数据库),保证 Pod 的顺序启动和唯一标识。
  • DaemonSet:确保每个节点运行一个指定 Pod(如日志收集、监控代理)。

3. 服务与网络

  • Service:为一组 Pod 提供稳定的网络接口,支持负载均衡(如 ClusterIP、NodePort、LoadBalancer)。
  • Ingress:管理集群外部到内部服务的 HTTP/HTTPS 路由,类似反向代理。

4. 存储

  • Volume:为 Pod 提供持久化存储(支持本地存储、NFS、云存储等)。
  • PersistentVolume(PV):集群级别的存储资源,独立于 Pod 存在。
  • PersistentVolumeClaim(PVC):Pod 对 PV 的申请和绑定。

5. 集群组件

  • Master 节点:控制平面,包含 API Server(集群统一入口)、Scheduler(调度 Pod 到 Node)、Controller Manager(管理控制器)、etcd(分布式键值存储,保存集群状态)。
  • Worker 节点:运行 Pod 的计算节点,包含 kubelet(节点代理,与 Master 通信)、Container Runtime(如 Docker、CRI-O)、kube-proxy(实现 Service 网络代理)。

三、快速搭建 K8s 环境

1. 本地开发环境(适合入门)

使用 Minikube 在单节点上运行 K8s 集群:

# 安装 Minikube(以 macOS 为例)
brew install minikube

# 启动集群(默认使用 Docker 作为容器运行时)
minikube start

# 安装 kubectl 命令行工具(K8s 客户端)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

2. 生产环境部署

使用 kubeadm 工具快速搭建高可用集群(简化版步骤):

# 初始化 Master 节点
kubeadm init --apiserver-advertise-address=<Master节点IP>

# 配置 kubectl(非 root 用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 添加 Worker 节点(在 Worker 节点执行)
kubeadm join <Master节点IP>:6443 --token <令牌> --discovery-token-ca-cert-hash sha256:<哈希值>

四、实战:部署第一个应用

以部署一个 Nginx 服务为例,演示 K8s 核心操作流程。

1. 创建 Deployment(管理 Pod 副本)

# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3  # 运行 3 个 Nginx Pod
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.23  # 使用 Nginx 镜像
        ports:
        - containerPort: 80  # 容器监听 80 端口

应用部署:

kubectl apply -f nginx-deployment.yaml

2. 查看部署状态

# 查看 Deployment
kubectl get deployments

# 查看 Pod(等待状态变为 Running)
kubectl get pods -o wide  # -o wide 显示节点信息

3. 创建 Service 暴露服务

# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort  # 通过节点端口暴露服务(本地环境可用)
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80        # 服务端口
    targetPort: 80  # Pod 端口
    nodePort: 30080 # 可选,未指定时自动分配(30000-32767)

应用服务:

kubectl apply -f nginx-service.yaml

访问服务:

# 本地环境(Minikube)使用以下命令打开浏览器
minikube service nginx-service

4. 弹性扩缩容

# 扩展到 5 个副本
kubectl scale deployment nginx-deployment --replicas=5

# 查看实时扩缩容状态(需安装 kubectl-dashboard 或使用 watch)
kubectl get pods --watch

5. 滚动更新与回滚

# 更新 Nginx 镜像版本
kubectl set image deployment nginx-deployment nginx=nginx:1.24

# 查看更新状态
kubectl rollout status deployment nginx-deployment

# 回滚到上一版本
kubectl rollout undo deployment nginx-deployment

五、进阶功能:存储与网络

1. 持久化存储(以本地路径为例)

# pv-pvc.yaml
# 定义 PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce  # 单节点读写
  hostPath:
    path: "/data/k8s"  # 节点本地路径

# 定义 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

将 PVC 挂载到 Pod:

# 在 Deployment 的 Pod 模板中添加 volumes 和 volumeMounts
volumes:
- name: data-volume
  persistentVolumeClaim:
    claimName: local-pvc
containers:
- name: nginx
  ...
  volumeMounts:
  - name: data-volume
    mountPath: "/usr/share/nginx/html"  # 容器内挂载路径

2. 网络策略(限制 Pod 通信)

使用 NetworkPolicy 控制 Pod 间的网络流量:

# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 3306  # 允许前端 Pod 访问后端数据库端口

六、K8s 最佳实践

1. 资源配置优化

  • 资源限制:为容器设置 requests(最小资源)和 limits(最大资源),避免资源竞争:
    resources:
      requests:
        cpu: "0.5"  # 0.5 核 CPU
        memory: "512Mi"
      limits:
        cpu: "1"
        memory: "1Gi"
    
  • 亲和性与反亲和性:通过 nodeAffinity 控制 Pod 调度到特定节点,或通过 podAntiAffinity 避免同类型 Pod 部署在同一节点。

2. 监控与日志

  • 核心工具
    • Prometheus + Grafana:监控集群指标(节点资源、Pod 状态、API 调用)。
    • EFK 栈(Elasticsearch + Fluentd + Kibana):集中管理容器日志。
  • 命令行查看日志
    kubectl logs <pod-name>  # 查看单个 Pod 日志
    kubectl logs -f <pod-name>  # 实时跟踪日志
    

3. 安全性

  • 服务账户(ServiceAccount):为 Pod 分配最小权限,避免使用默认 default 账户。
  • HTTPS 加密:通过 Ingress + Let’s Encrypt 实现服务端加密,保护数据传输。
  • 网络策略:限制非必要端口暴露,隔离敏感组件(如数据库服务)。

七、总结:K8s 的适用场景

  • 微服务架构:统一管理数十到数千个微服务容器。
  • CI/CD 集成:与 Jenkins、ArgoCD 等工具结合,实现自动化部署流水线。
  • 弹性负载场景:电商促销、实时数据处理等需要动态扩缩容的业务。
  • 多云部署:通过 K8s 实现跨云厂商的统一管理,避免厂商锁定。

八、学习资源推荐

  • 官方文档Kubernetes Documentation(权威但需一定基础)。
  • 交互式教程Kubernetes Playground(浏览器内实战环境)。
  • 书籍:《Kubernetes 权威指南》《Kubernetes in Action》。
  • 社区:K8s 官方 Slack、Stack Overflow(标签 kubernetes)。

通过以上步骤,你已掌握 K8s 的核心概念和基础操作。记住,K8s 的强大在于其生态的丰富性(如 Helm 包管理、Knative Serverless 框架),建议从实际项目需求出发,逐步深入学习调度策略、自定义资源(CRD)、服务网格(如 Istio)等进阶主题。开始你的 K8s 之旅吧! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值