Kubernetes使用教程(结合实践理解关键概念)

k8s使用教程

是什么?

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用

  • 自动部署容器(如 Docker 容器)
  • 实现服务自动扩容/缩容
  • 监控容器状态,自动重启失败的容器
  • 负载均衡和服务发现
  • 滚动升级和回滚
  • 管理配置(ConfigMap)、密钥(Secret

可以把 Kubernetes 理解为:管理成百上千个 Docker 容器的“集群管理工具”。

组成部分

集群图

在这里插入图片描述

KubernetesK8s)集群主要由两个大部分组成:控制平面(Control Plane)和 工作节点(Node

控制平面(Control Plane

负责 集群的管理和调度决策,相当于“大脑”。

组件作用
kube-apiserver集群的唯一入口,所有操作都通过它进行(REST API 网关)
etcd存储整个集群的状态数据。(键值数据库)
kube-scheduler决定 Pod 运行在哪个节点上
kube-controller-manager负责各种控制器(如副本控制器、节点控制器)
cloud-controller-manager(可选)管理云平台资源(如负载均衡、存储等)
etcd

etcd 是一个 分布式键值存储系统,简单来说,它就像 Kubernetes 的「数据库」,存储整个集群的状态数据:

  • 所有 PodDeploymentService 的定义
  • 节点状态、事件日志
  • 配置(如 ConfigMapSecrets
  • 网络、存储、权限信息等

工作节点(Node

运行用户的容器化应用

组件作用
kubeletkube-apiserver 通信,负责启动/停止 Pod
kube-proxy负责服务发现和网络转发
容器运行时(如 containerd真正运行容器的引擎
Pod(用户的应用)每个 Pod 里包含一个或多个容器
containerd

containerd 是一个 容器运行时(Container Runtime),它负责 拉取镜像、创建容器、运行容器、管理容器的生命周期

在每个 Kubernetes 节点上,kubelet 需要一个容器运行时来真正运行 Pod 中的容器。containerd 就是这个运行时之一。

常见的容器运行时有:

  • containerd (主流,轻量,K8s 推荐)
  • CRI-ORed Hat 系推荐)
  • Docker(现在已不直接支持,被拆分)

从 Kubernetes 1.20 起,官方推荐使用 containerd 替代 Docker

Pod

Kubernetes 中,Pod最小的部署单元,它表示一个或多个容器的集合。简单来说,Pod 是 容器的宿主,它包含了需要一起运行的容器、存储卷、网络设置等。Pod 中的容器共享相同的网络和存储资源

一个用户的应用可以对应一个pod;假设我们有一个 Nginx 和一个后台应用(如 springboot)组成的 Pod:

  • Nginx 容器用来接收请求,springboot 容器处理请求。
  • 这两个容器在同一个 Pod 中,它们共享一个 IP 地址,可以直接通过 localhost 相互通信。

Kubernetes简单实践

在这里插入图片描述

创建一个Kubernetes集群

创建 Kubernetes 集群的方式主要有两大类:本地部署云端部署,各自适用于开发测试和生产环境。下面是常见方式汇总:

本地部署(适合学习/开发)
工具特点
Minikube最常用的本地单节点集群工具,适合入门
Kind (Kubernetes IN Docker)Docker 容器中运行 K8s,适合快速测试
K3s轻量级 Kubernetes,资源占用小
MicroK8sUbuntu 推出的轻量化 K8s,可快速安装
云端托管服务(适合生产)
云平台服务名称特点
阿里云ACK集成阿里云资源,企业用得多
腾讯云TKE易于和腾讯云服务打通
华为云CCE华为生态集成
Google CloudGKE官方出品,稳定强大
AWSEKS和 AWS 服务深度集成
AzureAKS微软 Azure 平台上的 K8s 服务
使用 Minikube 创建集群

本教程使用Minikube创建集群

安装Minikube

安装步骤:https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Fx86-64%2Fstable%2Fhomebrew

本机是macOS,安装非常简单

brew install minikube
创建 Minikube 集群
 minikube start

部署一个应用

安装 kubectl

这是一个命令行工具,用于操作 K8s 集群

brew install kubectl

kubectl 命令的常见格式是:kubectl action resource

这会对指定的资源(类似 nodedeployment)执行指定的操作(类似 createdescribedelete

全称简写
podpo
servicesvc
deploymentdeploy
namespacens
configmapcm
secretsecret
Deployment

DeploymentKubernetes 中用于声明式管理 Pod 的控制器。它描述了一个期望的 Pod 运行状态,Kubernetes持续确保实际状态匹配期望状态

Deployment → 创建 ReplicaSet → 生成多个 Pod → 每个 Pod 被调度到一个 Node 上运行

Deployment的主要功能

  • 创建和维护所需数量的 Pod 副本;
  • 在镜像或配置变更时进行 滚动升级
  • 在失败时 自动回滚
  • 确保 Pod 高可用(Pod 挂了会自动重建)。

Deployment 的完整结构说明

deployment_nginx.yml为例

apiVersion: apps/v1              # 使用的 API 版本
kind: Deployment                 # 表示资源的类型是 Deployment
metadata:                        # 元数据
  name: my-app                   # Deployment 的名称
spec:                            # 具体的部署规则
  replicas: 3                    # Pod 副本数
  selector:                      # 选择器,匹配下面模板中 Pod 的标签
    matchLabels:
      app: my-app
  template:                      # Pod 模板,定义每个 Pod 的样子
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container       # 容器名称
        image: nginx:1.25        # 容器镜像
        ports:
        - containerPort: 80      # 容器暴露端口

  • replicas: 指定要运行的 Pod 副本数
  • selector: 用于匹配要管理的 Pod(必须与 Pod 模板中的标签匹配)
  • template:定义 Pod 的模板
    • metadata.labels: Pod 的标签
    • spec: Pod 的具体规格
部署应用

创建 Deployment

kubectl apply -f deployment_nginx.yml
# 或
kubectl create -f deployment_nginx.yml

二者的区别

命令行为
kubectl create仅创建,资源已存在则报错
kubectl apply创建或更新,推荐用于持续部署

刚刚通过创建 Deployment 部署了第一个应用。这个过程中执行了以下一些操作:

  1. 创建 Deployment
  2. 创建 ReplicaSetDeployment 内部用来控制 Pod 副本数的控制器
  3. 创建 Pod:实际运行容器的单元(比如 nginx:1.25)
  4. 调度 Pod 到节点运行:自动选择合适的节点来运行容器
  5. 持续监控与自愈:Pod 异常时自动重建;副本数量不对时自动调整

探索你的应用

输入kubectl get all 查看所有资源(Pod/Deployment/Service 等)
在这里插入图片描述

kubectl describe pod <pod-name> 查看详细运行信息

kubectl logs <pod-name> 查看日志输出

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

公开发布你的应用

Kubernetes 推荐使用 Service 来暴露 Deployment,使其可以被集群内外访问。

ServiceKubernetes 中的服务抽象对象,提供一组 Pod 的稳定访问入口(IP 和端口),实现负载均衡和服务发现。核心作用:

  1. 稳定 IP:为一组 Pod 提供一个固定虚拟 IP
  2. 负载均衡:请求会平均分配给后端多个 Pod
  3. 服务发现:其他 Pod 可以通过 DNS 名称访问这个 Service
  4. 跨主机访问:支持不同 Node 上 Pod 的通信

YAML 文件 nginx-service.yaml示例

apiVersion: v1                   # API 版本,定义使用的是 v1 版本的 Service
kind: Service                    # 资源类型,这里是一个 Service(服务)
metadata:
  name: my-service               # Service 的名称,可用于 kubectl 管理

spec:
  selector:                      # 选择器,匹配具有以下标签的 Pod
    app: my-app                  # 会选择所有具有 app=my-app 标签的 Pod

  ports:
    - protocol: TCP              # 使用的协议,这里是 TCP
      port: 80                   # Service 对外暴露的端口(集群内访问时使用)
      targetPort: 80             # 后端 Pod 容器监听的端口(如 Nginx 的端口)
      nodePort: 30080            # (仅 NodePort 类型)映射到物理节点的端口,外部访问入口

  type: NodePort                 # Service 类型

字段解释:

  • selector:选择哪一组 Pod(根据标签)作为后端
  • portService 的端口,集群内部访问时用这个
  • targetPort: Pod 实际监听的端口
  • typeService 类型
    • ClusterIP(默认):集群内访问
    • NodePort:集群外访问
    • LoadBalancer:公网访问,仅在云平台使用,会自动向云平台申请一个 公网负载均衡器 IP
    • ExternalName:集群内的应用想访问外部的服务,将外部服务映射到该服务

创建Servic

通过yaml文件创建

kubectl apply -f nginx-service.yaml

通过kubectl expose创建

kubectl expose deployment my-app \
  --port=80 \          # Service 暴露的端口(集群内访问)
  --target-port=80 \   # Pod 的端口(默认与 --port 相同)
  --type=NodePort \    # Service 类型
  --name=my-service    # 可选:自定义 Service 名称

kubectl expose 不支持直接指定 nodePort,所以如果你需要自定义 nodePort,必须使用 YAML 文件。

在这里插入图片描述

访问 Nginx

minikube 上运行的话,可以用:

minikube service my-service

这条命令会自动打开浏览器访问 Nginx 首页
在这里插入图片描述

或者自己手动

http://<Node IP>:30080

Node IP可以通过 minikube ip命令得到。如果你是使用docker启动的minikube需要提前将30080端口映射到本机。使用http://localhost:30080访问。

总结

  • Deployment 负责运行多个 Nginx 实例(Pod);
  • Service 统一暴露访问口(Cluster 内或外部);
  • NodePort 让你从宿主机访问集群内的服务。

扩大你的应用规模

手动扩缩容

修改pod副本的数量

kubectl scale deployment <deployment-name> --replicas=5
自动扩缩容(Horizontal Pod Autoscaler,HPA)

HPA(Horizontal Pod AutoscalerKubernetes 提供的机制,用于根据资源使用情况(如 CPU 或内存)自动调整 Deployment/ReplicaSet/StatefulSet 的副本数量

首先需要安装Metrics Server

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

这样安装会报TLS 证书验证失败,具体错误是:

tls: failed to verify certificate: x509: cannot validate certificate for 192.168.49.2 because it doesn’t contain any IP SANs
这表明 Kubelet 的 TLS 证书没有包含 192.168.49.2 这个 IP 地址作为 ​​Subject Alternative Name (SAN)​​,导致 Metrics Server 无法验证证书的有效性。

所有我们可以先把它下载下来

kind:deployment这块加上一行
在这里插入图片描述

kubectl apply -f components.yaml

验证安装是否成功:

kubectl top pods

在这里插入图片描述

使用kubectl autoscale进行自动扩缩容

kubectl autoscale deployment <deployment-name> \
  --cpu-percent=60 \
  --min=2 \
  --max=10
  • HPA 会定时从 Metrics Server 获取 Pod 的资源使用情况
  • 如果当前平均 CPU 使用率 > 设定阈值(如 60%),就增加副本
  • 如果 < 60%,则减少副本
  • HPA 控制器默认每 15 秒检查一次,约每 30 秒更新一次副本数

查看hpa状态

kubectl get hpa

NAME     REFERENCE           TARGETS              MINPODS   MAXPODS   REPLICAS   AGE
my-app   Deployment/my-app   cpu: <unknown>/60%   2         10        0          9s

更新你的应用

Kubernetes 中,滚动更新(Rolling Update)Deployment 的默认更新策略,它会逐个或按比例替换旧 Pod 为新 Pod,确保服务不中断,允许在更新过程中实现零停机。

触发滚动更新的方式
  • 修改镜像版本

    kubectl set image deployment/<name> <container-name>=<new-image>
    kubectl set image deployment/my-app my-container=nginx:1.27
    
  • 修改 YAML 配置

    修改yaml文件中

    kubectl apply -f deployment.yaml
    
查看滚动更新过程
kubectl rollout status deployment/<name>
查看更新历史
kubectl rollout history deployment/<name>
回滚更新

回滚到上一个版本

kubectl rollout undo deployment/<name>

回滚到指定版本(需先查版本号)

kubectl rollout history deployment/<name>
kubectl rollout undo deployment/<name> --to-revision=<版本号>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liubo666_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值