【云原生】二.Kubernetes基础入门:架构详解与环境搭建

写在前面

在容器化技术日益普及的今天,Docker解决了应用的打包和运行问题,但当容器数量增多、需要跨多台服务器部署时,如何高效管理这些容器就成了新的挑战。Kubernetes(简称K8s)正是为解决这个问题而生的容器编排平台,它能够自动化部署、扩展和管理容器化应用。

本篇文章将重点讲解Kubernetes是什么、核心架构、环境搭建方法以及kubectl基础命令。

一、Kubernetes简介

1.1 什么是Kubernetes

Kubernetes是Google开源的容器编排平台,源于Google内部使用了15年的Borg系统。Kubernetes这个名字来自希腊语,意为"舵手"或"飞行员",它的logo是一个舵轮,象征着它作为容器集群"掌舵者"的角色。

Kubernetes的核心功能是自动化容器化应用的部署、扩展和管理。它提供了:

  • 服务发现与负载均衡:自动暴露容器服务,分发网络流量
  • 存储编排:自动挂载存储系统,支持多种存储后端
  • 自动部署和回滚:声明式更新应用,支持自动回滚
  • 自动装箱:根据资源需求和约束自动调度容器
  • 自我修复:重启失败容器、替换和重新调度异常节点上的容器
  • 密钥和配置管理:管理敏感信息和应用配置

1.2 为什么需要Kubernetes

当应用从单体架构转向微服务架构后,容器数量急剧增加。以一个典型的电商系统为例,可能包含用户服务、订单服务、支付服务、库存服务、网关服务等数十个微服务,每个服务可能需要多个实例。手动管理这些容器变得极其困难:

  • 如何保证服务始终运行?
  • 如何在服务器故障时自动迁移服务?
  • 如何实现服务的自动扩缩容?
  • 如何管理服务间的网络通信?

Kubernetes正是为解决这些问题而设计的。它像一个智能的运维团队,7x24小时监控和管理你的容器化应用。

1.3 Kubernetes vs Docker Swarm

|-------|---------------------|--------------|
| 对比项 | Kubernetes | Docker Swarm |
| 复杂度 | 较高,学习曲线陡峭 | 较低,上手简单 |
| 功能丰富度 | 非常丰富,企业级特性 | 基础功能,适合简单场景 |
| 生态系统 | 庞大,社区活跃 | 相对较小 |
| 自动扩缩容 | 支持HPA、VPA、CA | 不支持原生自动扩缩容 |
| 服务发现 | CoreDNS,功能强大 | 内置,功能基础 |
| 存储 | PV/PVC/StorageClass | Volume插件 |
| 适用场景 | 大规模生产环境 | 小型集群、开发测试 |

Docker Swarm适合快速入门和小规模部署,而Kubernetes则更适合企业级生产环境和复杂的微服务架构。

二、Kubernetes架构详解

Kubernetes集群采用Master-Worker架构,分为控制平面(Control Plane)和工作节点(Worker Node)两部分。

2.1 整体架构

复制代码
┌─────────────────────────────────────────────────────────────────────────┐
│                        Kubernetes集群架构                                 │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   ┌─────────────────────────────────────────────────────────────────┐  │
│   │                      Master节点(控制平面)                         │  │
│   │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐              │  │
│   │  │ API Server  │  │Scheduler   │  │Controller  │              │  │
│   │  │  API服务器   │  │  调度器     │  │Manager     │              │  │
│   │  │             │  │             │  │ 控制器管理器 │              │  │
│   │  └─────────────┘  └─────────────┘  └─────────────┘              │  │
│   │         │                                                    │  │
│   │         ▼                                                    │  │
│   │  ┌─────────────────────────────────────────────────────────┐  │  │
│   │  │                         etcd                            │  │  │
│   │  │                    分布式键值存储                          │  │  │
│   │  └─────────────────────────────────────────────────────────┘  │  │
│   └─────────────────────────────────────────────────────────────────┘  │
│                                    │                                    │
│                                    ▼                                    │
│   ┌─────────────────────────────────────────────────────────────────┐  │
│   │                      Worker节点(工作节点)                         │  │
│   │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐              │  │
│   │  │   Kubelet   │  │ Kube-proxy  │  │ Container   │              │  │
│   │  │  节点代理    │  │  网络代理    │  │ Runtime     │              │  │
│   │  │             │  │             │  │ 容器运行时   │              │  │
│   │  └─────────────┘  └─────────────┘  └─────────────┘              │  │
│   │         │                                                    │  │
│   │         ▼                                                    │  │
│   │  ┌─────────────────────────────────────────────────────────┐  │  │
│   │  │                      Pods                               │  │  │
│   │  │  ┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐           │  │  │
│   │  │  │ Pod 1 │  │ Pod 2 │  │ Pod 3 │  │ Pod 4 │           │  │  │
│   │  │  └───────┘  └───────┘  └───────┘  └───────┘           │  │  │
│   │  └─────────────────────────────────────────────────────────┘  │  │
│   └─────────────────────────────────────────────────────────────────┘  │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

2.2 Master节点组件

Master节点负责集群的管理和调度,是集群的"大脑"。

API Server

API Server是Kubernetes的入口,所有组件和用户都通过它进行通信。它提供了RESTful API,用于查询和修改集群状态。API Server是唯一直接与etcd通信的组件,其他组件都需要通过API Server来获取或更新数据。

复制代码
# 查看API Server状态
kubectl get componentstatuses

# 查看API Server版本
kubectl version

Scheduler(调度器)

Scheduler负责将Pod调度到合适的Worker节点上。它根据多种因素进行调度决策:

  • 资源需求(CPU、内存)

  • 硬件/软件/策略约束

  • 亲和性和反亲和性规则

  • 数据局部性要求

  • 服务间的干扰

    查看调度器日志

    kubectl logs -n kube-system kube-scheduler-master

    查看节点资源使用情况

    kubectl describe nodes

Controller Manager(控制器管理器)

Controller Manager运行着各种控制器,每个控制器负责一种资源的管理:

  • Node Controller:监控节点健康状态

  • Replication Controller:维护Pod副本数量

  • Deployment Controller:管理Deployment的滚动更新

  • Service Controller:管理Service和负载均衡器

  • Endpoint Controller:填充Service的Endpoints

    查看控制器管理器日志

    kubectl logs -n kube-system kube-controller-manager-master

etcd

etcd是一个高可用的键值存储系统,用于存储Kubernetes集群的所有数据。它是集群的"数据库",存储了:

  • 节点信息

  • Pod配置

  • Service定义

  • Secret和ConfigMap

  • 集群状态

    备份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

    查看etcd成员

    ETCDCTL_API=3 etcdctl member list
    --cacert=/etc/kubernetes/pki/etcd/ca.crt
    --cert=/etc/kubernetes/pki/etcd/server.crt
    --key=/etc/kubernetes/pki/etcd/server.key

2.3 Worker节点组件

Worker节点负责运行容器化应用,是集群的"劳动力"。

Kubelet

Kubelet是运行在每个节点上的代理,负责:

  • 监听API Server,获取分配给本节点的Pod

  • 挂载Pod所需的存储卷

  • 下载Pod所需的Secret

  • 通过容器运行时运行容器

  • 周期性向API Server汇报节点状态

    查看kubelet状态

    systemctl status kubelet

    查看kubelet日志

    journalctl -u kubelet -f

Kube-proxy

Kube-proxy维护节点上的网络规则,实现Service的负载均衡:

  • 为Service创建iptables或IPVS规则

  • 将Service的ClusterIP流量转发到后端Pod

  • 支持SessionAffinity

    查看kube-proxy日志

    kubectl logs -n kube-system kube-proxy-xxxxx

    查看iptables规则

    iptables -t nat -L KUBE-SERVICES

Container Runtime

容器运行时负责运行容器,Kubernetes支持多种容器运行时:

  • Docker:最流行的容器运行时(已弃用,使用containerd)

  • containerd:Docker的核心容器运行时

  • CRI-O:专为Kubernetes设计的轻量级运行时

  • Podman:无守护进程的容器运行时

    查看容器运行时

    kubectl describe node | grep -i "Container Runtime"

    查看运行的容器

    crictl ps

2.4 核心概念关系图

复制代码
┌─────────────────────────────────────────────────────────────────────────┐
│                        Kubernetes核心概念关系                              │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   Namespace(命名空间)                                                  │
│   ┌─────────────────────────────────────────────────────────────────┐  │
│   │                                                                 │  │
│   │   Deployment(部署)                                             │  │
│   │   ┌─────────────────────────────────────────────────────────┐  │  │
│   │   │                                                         │  │  │
│   │   │   ReplicaSet(副本集)                                    │  │  │
│   │   │   ┌─────────────────────────────────────────────────┐  │  │  │
│   │   │   │                                                 │  │  │  │
│   │   │   │   Pod(最小调度单元)                              │  │  │  │
│   │   │   │   ┌─────────────────────────────────────────┐  │  │  │  │
│   │   │   │   │  Container(容器)                       │  │  │  │  │
│   │   │   │   │  ┌─────────┐  ┌─────────┐              │  │  │  │  │
│   │   │   │   │  │ 容器1   │  │ 容器2   │              │  │  │  │  │
│   │   │   │   │  └─────────┘  └─────────┘              │  │  │  │  │
│   │   │   │   └─────────────────────────────────────────┘  │  │  │  │
│   │   │   │                                                 │  │  │  │
│   │   │   └─────────────────────────────────────────────────┘  │  │  │
│   │   │                                                         │  │  │
│   │   └─────────────────────────────────────────────────────────┘  │  │
│   │                                                                 │  │
│   │   Service(服务)                                               │  │
│   │   ┌─────────────────────────────────────────────────────────┐  │  │
│   │   │  ClusterIP / NodePort / LoadBalancer                    │  │  │
│   │   │  ──────────────────────────────────────────────         │  │  │
│   │   │  选择器(Selector)→ Pod标签匹配                          │  │  │
│   │   └─────────────────────────────────────────────────────────┘  │  │
│   │                                                                 │  │
│   └─────────────────────────────────────────────────────────────────┘  │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

三、本地开发环境搭建

学习Kubernetes需要一个实验环境,以下是几种常用的本地开发环境搭建方式。

3.1 Minikube

Minikube是最流行的本地Kubernetes环境,适合学习和开发测试。

安装Minikube(Windows):

复制代码
# 使用Chocolatey安装
choco install minikube

# 或者手动下载
# 访问 https://minikube.sigs.k8s.io/docs/start/ 下载安装包

安装Minikube(macOS):

复制代码
# 使用Homebrew安装
brew install minikube

安装Minikube(Linux):

复制代码
# 下载并安装
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

启动Minikube:

复制代码
# 使用Docker驱动启动(推荐)
minikube start --driver=docker

# 指定Kubernetes版本
minikube start --kubernetes-version=v1.28.0

# 分配更多资源
minikube start --memory=4096 --cpus=4

# 查看状态
minikube status

# 停止集群
minikube stop

# 删除集群
minikube delete

常用Minikube命令:

复制代码
# 打开Kubernetes Dashboard
minikube dashboard

# SSH进入节点
minikube ssh

# 查看节点IP
minikube ip

# 挂载本地目录到节点
minikube mount /host/path:/vm/path

# 查看插件列表
minikube addons list

# 启用插件
minikube addons enable ingress
minikube addons enable metrics-server

3.2 Kind

Kind(Kubernetes in Docker)是在Docker容器中运行Kubernetes的工具,启动速度快,适合CI/CD场景。

安装Kind(macOS/Linux):

复制代码
# macOS
brew install kind

# Linux
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

安装Kind(Windows):

复制代码
# 使用Chocolatey
choco install kind

创建集群:

复制代码
# 创建默认集群
kind create cluster

# 指定集群名称
kind create cluster --name my-cluster

# 使用配置文件创建多节点集群
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF

kind create cluster --config kind-config.yaml

# 查看集群列表
kind get clusters

# 删除集群
kind delete cluster --name my-cluster

3.3 k3s

k3s是Rancher出品的轻量级Kubernetes,二进制文件不到100MB,适合边缘计算和IoT场景。

安装k3s(Linux):

复制代码
# 安装k3s
curl -sfL https://get.k3s.io | sh -

# 查看节点状态
sudo k3s kubectl get nodes

# 获取kubeconfig
sudo cat /etc/rancher/k3s/k3s.yaml

# 停止k3s
sudo systemctl stop k3s

# 卸载k3s
sudo /usr/local/bin/k3s-uninstall.sh

3.4 环境对比

|-------|----------|---------|---------|
| 特性 | Minikube | Kind | k3s |
| 启动速度 | 较慢 | 快 | 最快 |
| 资源占用 | 中等 | 低 | 最低 |
| 多节点支持 | 支持(需配置) | 支持 | 支持 |
| 适用场景 | 学习开发 | CI/CD测试 | 边缘计算、生产 |
| 易用性 | 最好 | 好 | 好 |

四、kubectl命令基础

kubectl是Kubernetes的命令行工具,用于与Kubernetes集群交互。

4.1 安装kubectl

安装kubectl(macOS):

复制代码
# 使用Homebrew
brew install kubectl

# 或者使用curl下载
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/

安装kubectl(Linux):

复制代码
# 使用curl下载
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

安装kubectl(Windows):

复制代码
# 使用Chocolatey
choco install kubernetes-cli

# 或者使用curl下载
curl -LO "https://dl.k8s.io/release/v1.28.0/bin/windows/amd64/kubectl.exe"
# 将kubectl.exe添加到PATH

4.2 配置kubeconfig

kubeconfig文件用于配置kubectl访问集群的凭证。

复制代码
# 查看当前配置
kubectl config view

# 查看当前上下文
kubectl config current-context

# 切换上下文
kubectl config use-context minikube

# 查看所有上下文
kubectl config get-contexts

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

kubeconfig文件结构:

复制代码
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority: /path/to/ca.crt
    server: https://kubernetes-api-server:6443
  name: my-cluster
contexts:
- context:
    cluster: my-cluster
    namespace: default
    user: my-user
  name: my-context
current-context: my-context
users:
- name: my-user
  user:
    client-certificate: /path/to/client.crt
    client-key: /path/to/client.key

4.3 常用命令详解

4.3.1 查看资源
复制代码
# 查看节点
kubectl get nodes
kubectl get nodes -o wide

# 查看Pod
kubectl get pods
kubectl get pods -n kube-system
kubectl get pods -o wide
kubectl get pods --show-labels

# 查看所有命名空间的Pod
kubectl get pods -A

# 查看Deployment
kubectl get deployments
kubectl get deploy

# 查看Service
kubectl get services
kubectl get svc

# 查看所有资源
kubectl get all
kubectl get all -A
4.3.2 创建资源
复制代码
# 使用命令行创建Deployment
kubectl create deployment nginx --image=nginx

# 使用YAML文件创建资源
kubectl apply -f deployment.yaml

# 创建命名空间
kubectl create namespace my-namespace

# 创建ConfigMap
kubectl create configmap my-config --from-literal=key1=value1

# 创建Secret
kubectl create secret generic my-secret --from-literal=password=mypassword
4.3.3 描述资源
复制代码
# 查看节点详情
kubectl describe node node-name

# 查看Pod详情
kubectl describe pod pod-name

# 查看Deployment详情
kubectl describe deployment deployment-name

# 查看Service详情
kubectl describe service service-name
4.3.4 日志和调试
复制代码
# 查看Pod日志
kubectl logs pod-name

# 实时查看日志
kubectl logs -f pod-name

# 查看指定容器的日志
kubectl logs pod-name -c container-name

# 查看之前容器的日志(容器重启后)
kubectl logs pod-name --previous

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

# 进入指定容器
kubectl exec -it pod-name -c container-name -- /bin/bash

# 端口转发
kubectl port-forward pod-name 8080:80

# 端口转发Service
kubectl port-forward svc/service-name 8080:80
4.3.5 删除资源
复制代码
# 删除Pod
kubectl delete pod pod-name

# 删除Deployment
kubectl delete deployment deployment-name

# 使用YAML文件删除资源
kubectl delete -f deployment.yaml

# 删除命名空间(会删除命名空间下所有资源)
kubectl delete namespace my-namespace

# 强制删除Pod
kubectl delete pod pod-name --force --grace-period=0
4.3.6 编辑资源
复制代码
# 编辑Deployment
kubectl edit deployment deployment-name

# 编辑Service
kubectl edit service service-name

# 编辑ConfigMap
kubectl edit configmap configmap-name

4.4 命令速查表

|------------------------|--------|
| 命令 | 说明 |
| kubectl get | 列出资源 |
| kubectl describe | 显示资源详情 |
| kubectl create | 创建资源 |
| kubectl apply | 应用配置文件 |
| kubectl delete | 删除资源 |
| kubectl edit | 编辑资源 |
| kubectl logs | 查看日志 |
| kubectl exec | 执行命令 |
| kubectl port-forward | 端口转发 |
| kubectl cp | 复制文件 |
| kubectl scale | 扩缩容 |
| kubectl rollout | 管理滚动更新 |
| kubectl label | 管理标签 |
| kubectl annotate | 管理注解 |
| kubectl top | 查看资源使用 |

五、第一个Kubernetes应用

让我们通过一个完整的示例,体验Kubernetes的部署流程。

5.1 创建Deployment

复制代码
# 创建nginx deployment
kubectl create deployment nginx --image=nginx:1.21

# 查看deployment状态
kubectl get deployments

# 查看pod状态
kubectl get pods

# 查看pod详情
kubectl describe pod nginx-xxxxx

5.2 扩容应用

复制代码
# 扩容到3个副本
kubectl scale deployment nginx --replicas=3

# 查看扩容结果
kubectl get pods

# 查看扩容状态
kubectl get deployment nginx

5.3 暴露服务

复制代码
# 创建Service
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

# 查看Service
kubectl get services

# 获取访问地址
minikube service nginx --url

# 或者使用端口转发
kubectl port-forward svc/nginx 8080:80

5.4 更新应用

复制代码
# 更新镜像版本
kubectl set image deployment/nginx nginx=nginx:1.22

# 查看滚动更新状态
kubectl rollout status deployment/nginx

# 查看更新历史
kubectl rollout history deployment/nginx

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

# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1

5.5 清理资源

复制代码
# 删除Service
kubectl delete service nginx

# 删除Deployment
kubectl delete deployment nginx

5.6 使用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.21
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: NodePort

使用YAML文件部署:

复制代码
# 应用配置
kubectl apply -f nginx-deployment.yaml

# 查看部署结果
kubectl get all

# 删除资源
kubectl delete -f nginx-deployment.yaml

总结

这篇文章介绍了Kubernetes的基础知识,主要内容包括:

  1. Kubernetes简介:了解了Kubernetes的定义、核心功能和与Docker Swarm的对比
  2. 架构详解:深入理解了Master节点和Worker节点的组件及其职责
  3. 环境搭建:掌握了Minikube、Kind、k3s三种本地开发环境的搭建方法
  4. kubectl命令:学会了kubectl的安装配置和常用命令
  5. 第一个应用:通过部署nginx应用体验了Kubernetes的完整工作流程

Kubernetes的学习曲线虽然陡峭,但掌握基础知识后,后续的学习会变得顺畅。下一篇文章将深入讲解Kubernetes的核心对象------Pod和Label,这是理解Kubernetes工作原理的关键。

相关推荐
志栋智能2 小时前
智能巡检自动化解决方案:从“人海战术”到“AI智巡”的效能革命
大数据·运维·人工智能·网络安全·云原生·自动化
only_Klein2 小时前
kubernetes-Service
云原生·容器·kubernetes
切糕师学AI2 小时前
成本治理(Cloud Cost Governance)是什么?
云原生·云计算
志栋智能2 小时前
AI驱动的监控系统自动化巡检:从“告警噪音”到“业务洞察”的智能跃迁
运维·人工智能·网络安全·云原生·自动化
匀泪5 小时前
云原生(nginx实验(4))
运维·nginx·云原生
阿寻寻10 小时前
【云原生技术】API 网关主动探测的通常是“域入口”(srpcgw),不是直接探测后端 Pod,也不是通过 srpcsrv/Consul 来判域健康
网络·云原生·consul
DeeplyMind15 小时前
第14章 挂载宿主机目录(Bind Mount)(最常用,重要)
运维·docker·云原生·容器·eureka
MonkeyKing_sunyuhua15 小时前
找到占用80的端口应用并关闭掉
云原生
无心水16 小时前
5、微服务快速启航:基于Pig与BladeX构建高可用分布式系统实战
服务器·分布式·后端·spring·微服务·云原生·架构