Kubernetes 基础

核心知识点

1. Kubernetes 概述

1.1 什么是 Kubernetes

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它提供了容器编排、负载均衡、服务发现、存储编排等功能。

1.2 Kubernetes 架构

┌─────────────────────────────────────────────────────────────┐
│                  Kubernetes 集群架构                    │
├─────────────────────────────────────────────────────────────┤
│                                                      │
│  ┌─────────────────────────────────────────────┐        │
│  │          Control Plane (控制平面)        │        │
│  ├─────────────────────────────────────────────┤        │
│  │  API Server  │ Scheduler  │ Controller  │        │
│  │  etcd       │ Cloud Ctrl │ Node Ctrl   │        │
│  └─────────────────────────────────────────────┘        │
│                      │                               │
│                      ▼                               │
│  ┌─────────────────────────────────────────────┐        │
│  │          Worker Nodes (工作节点)        │        │
│  ├─────────────────────────────────────────────┤        │
│  │  Node 1     │ Node 2     │ Node 3     │        │
│  │  ┌─────┐    │ ┌─────┐    │ ┌─────┐   │        │
│  │  │Pod  │    │ │Pod  │    │ │Pod  │   │        │
│  │  └─────┘    │ └─────┘    │ └─────┘   │        │
│  │  ┌─────┐    │ ┌─────┐    │ ┌─────┐   │        │
│  │  │Pod  │    │ │Pod  │    │ │Pod  │   │        │
│  │  └─────┘    │ └─────┘    │ └─────┘   │        │
│  └─────────────────────────────────────────────┘        │
│                                                      │
└─────────────────────────────────────────────────────────────┘

2. 核心概念

2.1 Pod

Pod 是 Kubernetes 中最小的可部署单元,包含一个或多个容器。

┌─────────────────────────────────────────┐
│             Pod                     │
├─────────────────────────────────────────┤
│                                     │
│  ┌──────────┐  ┌──────────┐       │
│  │ 容器 A   │  │ 容器 B   │       │
│  │ (主容器) │  │ (辅助容器)│      │
│  └──────────┘  └──────────┘       │
│         │            │              │
│         └────┬───────┘              │
│              │                      │
│         ┌────▼────┐                │
│         │ 共享存储  │                │
│         │ 共享网络  │                │
│         └─────────┘                │
│                                     │
└─────────────────────────────────────────┘

2.2 Node

Node 是 Kubernetes 集群中的工作节点,运行 Pod。

# Node 示例
apiVersion: v1
kind: Node
metadata:
  name: node-1
  labels:
    role: worker
    zone: us-west-1a
spec:
  capacity:
    cpu: "4"
    memory: 16Gi
    pods: "110"

2.3 Namespace

Namespace 用于将集群资源划分为多个虚拟集群。

# Namespace 示例
apiVersion: v1
kind: Namespace
metadata:
  name: development
  labels:
    name: development

3. 控制平面组件

3.1 API Server

API Server 是 Kubernetes 控制平面的前端,所有内部组件和外部用户都通过 API Server 与集群交互。

# 查看 API Server 状态
kubectl get cs

# 查看 API Server 日志
kubectl logs -n kube-system kube-apiserver

# 测试 API Server 连接
kubectl cluster-info

3.2 etcd

etcd 是 Kubernetes 的键值存储,存储所有集群状态数据。

# 查看 etcd 状态
kubectl get cs etcd

# 备份 etcd 数据
ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

3.3 Scheduler

Scheduler 负责将 Pod 调度到合适的 Node 上。

# 查看 Scheduler 状态
kubectl get cs scheduler

# 查看 Scheduler 日志
kubectl logs -n kube-system kube-scheduler

3.4 Controller Manager

Controller Manager 运行各种控制器,维护集群的期望状态。

# 查看 Controller Manager 状态
kubectl get cs controller-manager

# 查看运行的控制器
kubectl get deployment -n kube-system

4. 工作节点组件

4.1 Kubelet

Kubelet 是 Node 上的代理,负责管理 Pod 生命周期。

# 查看 Kubelet 状态
systemctl status kubelet

# 查看 Kubelet 日志
journalctl -u kubelet -f

# 查看 Kubelet 配置
cat /var/lib/kubelet/config.yaml

4.2 Kube-proxy

Kube-proxy 负责维护网络规则,实现 Service 负载均衡。

# 查看 Kube-proxy 状态
kubectl get ds kube-proxy -n kube-system

# 查看 Kube-proxy 日志
kubectl logs -n kube-system kube-proxy

4.3 Container Runtime

Container Runtime 负责运行容器(如 Docker、containerd)。

# 查看 Container Runtime 信息
kubectl describe node node-1 | grep "Container Runtime"

# 查看 Docker 状态
systemctl status docker

5. 安装 Kubernetes

5.1 使用 Minikube(本地开发)

# 安装 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 启动 Minikube
minikube start

# 查看状态
minikube status

# 查看仪表板
minikube dashboard

# 停止 Minikube
minikube stop

# 删除 Minikube
minikube delete

5.2 使用 kubeadm(生产环境)

# 在所有节点上安装 Docker
sudo apt-get update
sudo apt-get install -y docker.io

# 在所有节点上安装 kubeadm、kubelet、kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

# 初始化控制平面(仅在主节点)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 配置 kubectl(在主节点)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 安装网络插件(在主节点)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 加入工作节点(在工作节点)
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

# 验证集群状态
kubectl get nodes

6. kubectl 基础命令

6.1 集群管理

# 查看集群信息
kubectl cluster-info

# 查看节点状态
kubectl get nodes

# 查看节点详细信息
kubectl describe node node-1

# 查看命名空间
kubectl get namespaces

# 创建命名空间
kubectl create namespace development

6.2 Pod 管理

# 查看 Pod
kubectl get pods

# 查看 Pod 详细信息
kubectl describe pod my-pod

# 查看 Pod 日志
kubectl logs my-pod

# 进入 Pod
kubectl exec -it my-pod -- /bin/bash

# 删除 Pod
kubectl delete pod my-pod

6.3 资源管理

# 查看所有资源
kubectl get all

# 查看特定类型的资源
kubectl get deployments
kubectl get services
kubectl get configmaps

# 查看资源详细信息
kubectl get pod my-pod -o yaml

# 查看资源使用情况
kubectl top nodes
kubectl top pods

实用案例分析

案例 1:部署第一个应用

场景描述

在 Kubernetes 集群中部署一个 Nginx 应用。

操作步骤

# 1. 创建部署文件
cat > nginx-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80
EOF

# 2. 创建服务文件
cat > nginx-service.yaml << 'EOF'
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
EOF

# 3. 部署应用
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml

# 4. 查看部署状态
kubectl get deployments
kubectl get pods

# 5. 查看服务
kubectl get services

# 6. 访问应用
minikube service nginx-service

# 7. 查看 Pod 日志
kubectl logs -l app=nginx

# 8. 清理资源
kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml

案例 2:多副本部署

场景描述

部署多副本应用,实现高可用。

操作步骤

# 1. 创建多副本部署
cat > multi-replica-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 5
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.21
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
EOF

# 2. 部署应用
kubectl apply -f multi-replica-deployment.yaml

# 3. 查看 Pod 分布
kubectl get pods -o wide

# 4. 扩展副本数
kubectl scale deployment web-app --replicas=10

# 5. 查看扩展后的 Pod
kubectl get pods

# 6. 查看部署事件
kubectl describe deployment web-app

# 7. 清理资源
kubectl delete -f multi-replica-deployment.yaml

案例 3:命名空间隔离

场景描述

使用命名空间隔离不同环境的应用。

操作步骤

# 1. 创建命名空间
kubectl create namespace development
kubectl create namespace staging
kubectl create namespace production

# 2. 查看命名空间
kubectl get namespaces

# 3. 在不同命名空间部署应用
kubectl apply -f nginx-deployment.yaml -n development
kubectl apply -f nginx-deployment.yaml -n staging
kubectl apply -f nginx-deployment.yaml -n production

# 4. 查看各命名空间的 Pod
kubectl get pods -n development
kubectl get pods -n staging
kubectl get pods -n production

# 5. 设置默认命名空间
kubectl config set-context --current --namespace=development

# 6. 查看当前命名空间的资源
kubectl get pods

# 7. 切换到其他命名空间
kubectl config set-context --current --namespace=production

# 8. 清理资源
kubectl delete namespace development
kubectl delete namespace staging
kubectl delete namespace production

最佳实践

  1. 使用命名空间隔离环境:开发、测试、生产环境分开管理。

  2. 设置资源限制:防止单个应用耗尽集群资源。

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"
  1. 配置健康检查:确保应用正常运行。
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
  1. 使用标签和选择器:便于管理和查询资源。
metadata:
  labels:
    app: web
    environment: production
    version: v1.0
  1. 定期备份 etcd:确保集群数据安全。
# 备份 etcd
ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

总结

本教程介绍了 Kubernetes 的基础概念、架构原理和核心组件。通过实际案例,我们学习了如何部署应用、管理多副本以及使用命名空间隔离环境。掌握这些基础知识后,可以继续学习 Kubernetes 的 Pod、Deployment、Service 等高级功能。

« 上一篇 Docker Compose 下一篇 » Pod 与 Deployment