Linux — 认识下 Kubernetes

认识下 Kubernetes

一、Kubernetes 体系架构 #

1.1 核心架构概述 #

Kubernetes 采用主从架构,主要由控制平面(Control Plane)工作节点(Worker Nodes) 组成。

┌─────────────────────────────────────────────────────────────┐
│                   控制平面 (Control Plane)                   │
│  ┌─────────────┐  ┌──────────┐  ┌─────────────┐  ┌────────┐ │
│  │  API Server │  │  etcd    │  │  Scheduler  │  │Controller││
│  │             │  │          │  │             │  │ Manager ││
│  └─────────────┘  └──────────┘  └─────────────┘  └────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│                   工作节点 (Worker Nodes)                    │
│  ┌─────────────┐  ┌──────────┐  ┌─────────────┐             │
│  │   kubelet   │  │ kube-proxy│  │ 容器运行时  │             │
│  │             │  │          │  │ (Docker等)  │             │
│  └─────────────┘  └──────────┘  └─────────────┘             │
│  ┌───────────────────────────────────────────────────────┐  │
│  │                      Pod (容器组)                     │  │
│  │  ┌──────────────┐  ┌──────────────┐                   │  │
│  │  │   容器1      │  │   容器2      │                   │  │
│  │  │  (应用)      │  │  (边车等)    │                   │  │
│  │  └──────────────┘  └──────────────┘                   │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

1.2 控制平面组件 #

  • API Server: 所有操作的入口点,处理REST请求
  • etcd: 分布式键值存储,保存集群状态
  • Scheduler: 将Pod调度到合适的节点
  • Controller Manager: 运行控制器,确保集群处于期望状态

1.3 工作节点组件 #

  • kubelet: 节点代理,与API Server通信
  • kube-proxy: 网络代理,处理服务发现和负载均衡
  • 容器运行时: 运行容器的软件(Docker, containerd等)

二、核心概念 #

2.1 Pod #

最小的部署单元,包含一个或多个容器,共享存储和网络

2.2 Deployment #

管理Pod副本的声明式方式,支持滚动更新和回滚

2.3 Service #

定义一组Pod的访问策略,提供稳定的网络端点

2.4 Namespace #

虚拟集群,用于资源隔离和组织

三、基本使用方法 #

3.1 安装和设置 #

# 安装 kubectl (Kubernetes 命令行工具)
# macOS
brew install kubectl

# Ubuntu
sudo apt-get update && sudo apt-get install -y kubectl

# 查看集群信息
kubectl cluster-info

# 查看节点状态
kubectl get nodes

3.2 部署第一个应用 #

# 创建一个 Deployment
kubectl create deployment nginx-deployment --image=nginx:1.19

# 查看 Deployment
kubectl get deployments

# 查看 Pod
kubectl get pods

# 创建 Service 暴露应用
kubectl expose deployment nginx-deployment --port=80 --type=NodePort

# 查看 Service
kubectl get services

3.3 使用 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.19
        ports:
        - containerPort: 80

应用配置文件:

kubectl apply -f nginx-deployment.yaml
kubectl get pods

3.4 常用命令 #

# 查看资源
kubectl get pods
kubectl get services
kubectl get deployments

# 查看详细信息
kubectl describe pod <pod-name>
kubectl describe service <service-name>

# 查看日志
kubectl logs <pod-name>

# 进入容器
kubectl exec -it <pod-name> -- /bin/bash

# 扩展 Deployment
kubectl scale deployment nginx-deployment --replicas=5

# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.20

# 回滚更新
kubectl rollout undo deployment/nginx-deployment

# 删除资源
kubectl delete deployment nginx-deployment
kubectl delete service nginx-service

四、实际应用示例 #

4.1 多容器 Pod 示例 #

创建 multi-container-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.19
    ports:
    - containerPort: 80
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'while true; do echo "Hello Kubernetes!"; sleep 5; done']

4.2 完整应用部署示例 #

创建 web-app.yaml:

# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web-app
        image: nginx:1.19
        ports:
        - containerPort: 80
        env:
        - name: ENVIRONMENT
          value: "production"
---
# Service
apiVersion: v1
kind: Service
metadata:
  name: web-app-service
spec:
  selector:
    app: web-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

五、进阶概念 #

5.1 ConfigMap 和 Secret #

# ConfigMap 示例
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_url: "mysql://localhost:3306"
  log_level: "INFO"

5.2 持久化存储 #

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

六、学习资源 #

  1. 官方文档: https://kubernetes.io/docs/
  2. 交互式教程: https://kubernetes.io/docs/tutorials/
  3. Play with Kubernetes: 在线实践环境
  4. Minikube: 本地单节点Kubernetes集群

七、总结 #

Kubernetes 提供了强大的容器编排能力,主要特点包括:

  • 自动部署和扩展: 轻松管理容器化应用
  • 服务发现和负载均衡: 自动分配网络流量
  • 自我修复: 自动替换失败容器
  • 密钥和配置管理: 安全地管理敏感信息
  • 存储编排: 自动挂载存储系统

通过掌握这些基础概念和命令,您已经具备了使用 Kubernetes 的基本能力。建议从单节点环境(如 Minikube)开始实践,逐步深入了解更高级的功能。

参考 #

kubernetes in Action

官方文档 https://kubernetes.io/zh/docs/home/

本文共 1779 字,创建于 Oct 9, 2022

相关标签: DevOps, Kubernetes, Tools, Linux