杰瑞科技汇

Kubernetes教程,如何快速入门掌握?

Kubernetes 教程:从入门到实践

目录

  1. 第一部分:基础概念
    • 什么是 Kubernetes?
    • 为什么需要 Kubernetes?
    • Kubernetes 的核心术语
  2. 第二部分:环境搭建
    • 本地开发环境:Minikube / Kind
    • 云上实验环境:Playground
    • 生产级环境:云服务商提供的 K8s
  3. 第三部分:核心对象详解
    • Pod:最小的部署单元
    • Deployment:声明式管理 Pod
    • Service:为 Pod 提供网络访问
    • ConfigMap & Secret:配置管理
    • Volume:数据持久化
  4. 第四部分:进阶与实战
    • Namespace:资源隔离
    • Helm:Kubernetes 的包管理器
    • Ingress:集群入口流量管理
    • Kubectl 常用命令速查
  5. 第五部分:学习路径与资源推荐

第一部分:基础概念

什么是 Kubernetes?

Kubernetes(常简称为 K8s,因为 K 和 s 之间有 8 个字母)是一个开源的,用于自动部署、扩展和管理容器化应用程序的系统。

Kubernetes教程,如何快速入门掌握?-图1
(图片来源网络,侵删)

你可以把它想象成“数据中心的操作系统”,它负责管理你所有的容器化应用,确保它们按预期运行,并处理扩展、故障恢复、负载均衡等复杂问题。

为什么需要 Kubernetes?

假设你手动管理几十个、上百个容器:

  • 手动扩缩容:流量高峰时,你需要手动启动新容器;低谷时,手动关闭,非常繁琐且不及时。
  • 故障自愈:如果一个容器挂了,你需要手动发现并重启它。
  • 服务发现:新容器如何找到其他容器?如何管理它们的网络?
  • 配置管理:如何统一管理所有应用的环境变量、配置文件?

Kubernetes 通过自动化解决了以上所有问题。

Kubernetes 的核心术语

理解这些术语是学习 K8s 的第一步:

术语 中文解释 核心作用
Node 节点 K8s 集群中的一台物理机或虚拟机,分为 Master Node 和 Worker Node。
Cluster 集群 由多个 Node 组成的整体,是 K8s 的管理边界。
Pod 容器组 K8s 中最小的部署单元,一个 Pod 可以包含一个或多个紧密相关的容器,它们共享网络和存储。
Deployment 部署 用于声明式地管理 Pod 和 ReplicaSet,你可以通过它来描述你期望的应用状态(3个副本),K8s 会自动帮你维持这个状态。
Service 服务 为一组功能相同的 Pod 提供一个统一的网络入口和负载均衡,它有一个固定的虚拟 IP (ClusterIP),即使 Pod 重建 IP 变了,Service 的 IP 也不变。
Label & Selector 标签与选择器 Label 是附加到 K8s 资源上的键值对,用于对资源进行分类,Selector 是用来选择带有特定 Label 的资源,这是 K8s 组合和筛选的核心机制。
Namespace 命名空间 在一个 Cluster 内部创建虚拟的“子集群”,用于实现资源隔离(开发、测试、生产环境)。
ConfigMap 配置映射 用于存储非机密的配置数据(如环境变量、配置文件)。
Secret 密钥 用于存储敏感数据(如密码、API Token),数据会被 Base64 编码。
Volume 为 Pod 提供持久化存储,Pod 中的容器重启或销毁后,Volume 中的数据可以保留。

第二部分:环境搭建

在学习 K8s 时,拥有一个实验环境至关重要。

本地开发环境

  • Minikube: 最流行的本地单节点 K8s 集,非常适合初学者和日常开发。
  • Kind (Kubernetes in Docker): 使用 Docker 容器作为 K8s 节点,启动速度快,非常适合 CI/CD 测试。

云上实验环境

  • Playground: 无需安装,直接在浏览器中体验 K8s。

生产级环境

  • 云服务商:
    • Google Kubernetes Engine (GKE)
    • Amazon Elastic Kubernetes Service (EKS)
    • Azure Kubernetes Service (AKS)
  • 自建: 使用 kubeadm 工具在自有服务器上搭建,适合有一定运维经验的企业。

必备工具: kubectl - K8s 的命令行工具,用于与集群交互。

# macOS
brew install kubectl
# Linux (Ubuntu/Debian)
sudo apt-get update && sudo apt-get install -y kubectl
# Windows (使用 Chocolatey)
choco install kubernetes-cli

第三部分:核心对象详解

我们将通过一个 Nginx "Hello World" 示例来学习。

Pod

Pod 是最小的调度单元,我们很少直接创建 Pod,因为它的生命周期很短,挂了不会自动重启。

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest # 使用官方的 Nginx 镜像
    ports:
    - containerPort: 80 # 容器暴露的端口

应用:

kubectl apply -f pod.yaml

检查:

kubectl get pods
kubectl describe pod nginx-pod

Deployment

Deployment 管理着 Pod 的副本集,Pod 挂了,Deployment 会自动创建一个新的。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3 # 希望有 3 个副本
  selector:
    matchLabels:
      app: nginx # 选择所有 label 为 app=nginx 的 Pod
  template:
    metadata:
      labels:
        app: nginx # Pod 的模板,也会被打上这个 label
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

应用:

kubectl apply -f deployment.yaml

检查:

kubectl get deployment
kubectl get pods # 你会看到 3 个 nginx-pod-xxxx 的 Pod

Service

现在我们有 3 个 Nginx Pod,但它们各自的 IP 地址可能会变,Service 为我们提供一个稳定的访问点。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx # 选择所有 label 为 app=nginx 的 Pod,将流量转发给它们
  ports:
    - protocol: TCP
      port: 80 # Service 对外暴露的端口
      targetPort: 80 # 流量要转发到的 Pod 容器端口
  type: ClusterIP # 默认类型,只在集群内部可访问

应用:

kubectl apply -f service.yaml

检查:

kubectl get service
# NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
# nginx-service   ClusterIP   10.108.12.222   <none>        80/TCP    10s

访问 Service:

# 在集群内部访问
kubectl run -it --rm --restart=Never --image=busybox curl-pod -- curl http://nginx-service
# 应该会看到 Nginx 的欢迎页面
# 在集群外部访问(本地环境需要端口转发)
kubectl port-forward service/nginx-service 8080:80
# 然后在浏览器访问 http://localhost:8080

ConfigMap & Secret

将配置与镜像解耦。

ConfigMap:

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  index.html: |
    <h1>Hello from Kubernetes ConfigMap!</h1>

Secret:

# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: nginx-secret
type: Opaque
data:
  # 注意:这里的值是 base64 编码的
  # echo -n 'my-super-secret-password' | base64
  password: bXktc3VwZXItc2VjcmV0LXBhc3N3b3Jk

Volume

让数据持久化。

# pv-pvc.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/nginx-pv # 使用宿主机上的路径
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

然后将这个 PVC 挂载到 Deployment 的 Pod 中。


第四部分:进阶与实战

Namespace

# 创建命名空间
kubectl create namespace dev
# 在特定命名空间下部署
kubectl apply -f deployment.yaml -n dev
# 查看
kubectl get pods -n dev

Helm

手动管理 YAML 文件非常繁琐,Helm 是 K8s 的“包管理器”,它将相关的资源打包成一个 Chart

# 安装 Helm
# macOS: brew install helm
# Linux: curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list && sudo apt-get update && sudo apt-get install helm
# 添加一个 Chart 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 使用 Chart 安装一个应用(WordPress)
helm install my-wordpress bitnami/wordpress --namespace wordpress --create-namespace

Ingress

Service 的 type: LoadBalancer 在云上会创建一个外部负载均衡器,成本较高,Ingress 提供了更灵活的 HTTP/HTTPS 路由规则,通常配合 Ingress Controller (如 Nginx Ingress Controller) 使用。

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: myapp.local # 假设这个域名指向你的 Ingress Controller
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service # 转发到我们之前创建的 Service
            port:
              number: 80

Kubectl 常用命令速查

命令 作用
kubectl get <resource> 获取资源列表,如 pods, deployments, services
kubectl describe <resource> <name> 显示特定资源的详细信息
kubectl logs <pod-name> 查看 Pod 的日志
kubectl exec -it <pod-name> -- <command> 在 Pod 内执行命令,如 sh
kubectl apply -f <file.yaml> 应用/更新 YAML 文件中的配置
kubectl delete -f <file.yaml> 删除 YAML 文件中定义的资源
kubectl get pods -o wide 显示更多 Pod 的信息,如节点 IP
kubectl top pods 显示 Pod 的资源使用情况

第五部分:学习路径与资源推荐

学习路径建议

  1. 理论入门: 理解 K8s 的核心概念(第一部分)。
  2. 动手实践: 搭建本地 Minikube 环境,跟着第三部分的教程,亲手创建 Deployment, Service 等资源。
  3. 掌握常用命令: 熟练使用 kubectl 的基本命令。
  4. 学习进阶概念: 学习 Namespace, ConfigMap, Secret, Volume 的实际应用。
  5. 拥抱工具: 学习使用 Helm 管理应用,简化部署。
  6. 深入网络: 学习 Ingress 的使用,理解集群内外流量如何访问。
  7. 探索生态: 了解 Operators, Service Mesh (如 Istio), Prometheus 监控等更高级的主题。

推荐资源

祝你学习愉快!K8s 是一个强大的工具,虽然学习曲线较陡,但一旦掌握,你将能够高效地管理现代云原生应用。

分享:
扫描分享到社交APP
上一篇
下一篇