当前位置: 首页 > news >正文

【kubernetes】-2 K8S的资源管理

文章目录

  • K8S的资源管理
    • 1、资源管理方式简介
      • 1.1 陈述式管理资源的方法
      • 1.2 kubernetes 集群资源管理入口
    • 2、kubectl 常用命令
      • 2.1 集群操作
      • 2.2 资源操作
      • 2.3 项目生命周期管理
        • 2.3.1 创建
        • 2.3.2 发布
        • 2.3.3 更新
        • 2.3.4 回滚
        • 2.3.5删除
    • 3、图解服务发布
        • 阶段 1:外部客户端 → 节点(Node)的 NodePort 端口
        • 阶段 2:节点 → Service 的暴露端口(8080)
        • 阶段 3:Service → Pod 的目标端口(80)
    • 4、三种更新方式
      • 4.1 滚动更新(Rolling Update)
      • 4.2 AB / 蓝绿更新(Blue-Green Deployment)
      • 4.3 金丝雀发布 / 灰度发布(Canary Release)
      • 4.4 对比总结

K8S的资源管理

1、资源管理方式简介

  • 陈述式管理:命令行管理,所有的增删改查全部使用命令完成
  • 申明式管理:使用yaml或者json配置文件,使用kubectl去执行
  • 接口式管理(API、SDK):web-ui api (restful-API 、openAPI 、 SDK)

1.1 陈述式管理资源的方法

  1. kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口
  2. kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径
  3. kubectl 的命令大全
    kubectl --help
    k8s中文文档:http://docs.kubernetes.org.cn/683.html
  4. 对资源的增、删、查操作比较方便,但对改的操作就不容易了

1.2 kubernetes 集群资源管理入口

  • Kubernetes 集群管理资源的唯一入口是通过调用 apiserver 的接口。
  • kubectl 是官方 CLI 工具,用于与 apiserver 通信,将用户命令转化为 apiserver 能识别的信息,实现对 Kubernetes 资源的管理。

2、kubectl 常用命令

2.1 集群操作

命令操作
kubectl version查看版本信息
kubectl api-resources查看资源镜像
kubectl get cs查看集群信息
kubectl get node查看节点信息
source <(kubectl completion bash)配置自动补全
journalctl -u kubelet -f查看节点日志

2.2 资源操作

#查看资源
kubectl get <resource> [-o wide|json|yaml] [-n namespace]`-n`:指定命名空间  
`-o`:指定输出格式  
`--all-namespaces``-A`:显示所有命名空间  
`--show-labels`:显示资源标签  
`-l app`:过滤标签为 `app` 的资源
`-l app=nginx `:仅显示包含app标签,且值为nginx的资源

resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all(仅展示几种核心资源,并不完整)

#查看master节点状态
kubectl get cs[root@master01 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true"}
[root@master01 ~]#
#查看命名空间[root@master01 ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   23h
kube-flannel      Active   22h
kube-node-lease   Active   23h
kube-public       Active   23h
kube-system       Active   23h
[root@master01 ~]#
#查看default命名空间的所有的资源
[root@master01 ~]# kubectl get all  -n default
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PO                                                                                                RT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        44                                                                                                3/TCP   23h
[root@master01 ~]#
#创建命名空间
kubectl create ns app#删除命名空间
kubectl delete namespace app
#创建deployment
[root@master01 ~]# kubectl create deployment nginx01 --image=nginx:1.14
#描述资源详情
[root@master01 ~]# kubectl describe pod nginx01-644d98997f-6cl78
Name:         nginx01-644d98997f-6cl78
Namespace:    default
Priority:     0
Node:         node01/192.168.107.11
Start Time:   Tue, 22 Jul 2025 16:14:11 +0800
Labels:       app=nginx01pod-template-hash=644d98997f
Annotations:  <none>
Status:       Running
IP:           10.244.1.5
IPs:IP:           10.244.1.5
Controlled By:  ReplicaSet/nginx01-644d98997f
Containers:nginx:Container ID:   docker://649c42d970ee346698cbacb029cb58626964d1e46076e0141aa445780a8f7558Image:          nginx:1.14Image ID:       docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8dPort:           <none>Host Port:      <none>State:          RunningStarted:      Tue, 22 Jul 2025 16:14:13 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-kbwjz (ro)
Conditions:Type              StatusInitialized       TrueReady             TrueContainersReady   TruePodScheduled      True
Volumes:default-token-kbwjz:Type:        Secret (a volume populated by a Secret)SecretName:  default-token-kbwjzOptional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  28s   default-scheduler  Successfully assigned default/nginx01-644d98997f-6cl78 to node01Normal  Pulled     27s   kubelet            Container image "nginx:1.14" already present on machineNormal  Created    27s   kubelet            Created container nginxNormal  Started    26s   kubelet            Started container nginx#查看pod信息[root@master01 ~]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
nginx-5658bdf5d4-cqzqn     1/1     Running   0          52s
nginx01-644d98997f-6cl78   1/1     Running   0          3s#进入容器[root@master01 ~]# kubectl exec -it nginx01-644d98997f-6cl78 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx01-644d98997f-6cl78:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@nginx01-644d98997f-6cl78:/#
#查看日志[root@master01 ~]# kubectl logs nginx-5658bdf5d4-cqzqn[root@master01 ~]# kubectl logs nginx01-644d98997f-6cl78
[root@master01 ~]#
#删除相当于是重启
[root@master01 ~]# kubectl delete pod nginx-5658bdf5d4-cqzqn
pod "nginx-5658bdf5d4-cqzqn" deleted[root@master01 ~]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
nginx-5658bdf5d4-jmtpx     1/1     Running   0          17s
nginx01-644d98997f-6cl78   1/1     Running   0          24m
[root@master01 ~]#
#强制删除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#扩缩容
kubectl scale deployment <deployment-name> --replicas=<number> -n <namespace>
kubectl scale deployment nginx-wl --replicas=2 -n kube-public	# 扩容
kubectl scale deployment nginx-wl --replicas=1 -n kube-public	# 缩容#扩容[root@master01 ~]# kubectl get deployments
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
nginx     1/1     1            1           33m
nginx01   1/1     1            1           33m
[root@master01 ~]# kubectl scale deployment nginx --replicas=3
deployment.apps/nginx scaled
[root@master01 ~]# kubectl get deployments
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
nginx     3/3     3            3           34m
nginx01   1/1     1            1           34m
[root@master01 ~]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
nginx-5658bdf5d4-24zjg     1/1     Running   0          11s
nginx-5658bdf5d4-jmtpx     1/1     Running   0          9m42s
nginx-5658bdf5d4-zv48q     1/1     Running   0          11s
nginx01-644d98997f-6cl78   1/1     Running   0          34m
[root@master01 ~]##缩容
[root@master01 ~]# kubectl scale deployment nginx --replicas=1
deployment.apps/nginx scaled
[root@master01 ~]# kubectl get pod
NAME                       READY   STATUS        RESTARTS   AGE
nginx-5658bdf5d4-24zjg     1/1     Running       0          47s
nginx-5658bdf5d4-jmtpx     0/1     Terminating   0          10m
nginx01-644d98997f-6cl78   1/1     Running       0          34m
[root@master01 ~]# kubectl get deployments
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
nginx     1/1     1            1           35m
nginx01   1/1     1            1           34m[root@master01 ~]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
nginx-5658bdf5d4-24zjg     1/1     Running   0          58s
nginx01-644d98997f-6cl78   1/1     Running   0          34m
[root@master01 ~]#
#删除副本控制器
kubectl delete deployment nginx-wl -n kube-public
kubectl delete deployment/nginx-wl -n kube-public

2.3 项目生命周期管理

生命周期:创建–>发布–>更新–>回滚–>删除

2.3.1 创建

kubectl create命令

  • 创建并运行一个或多个容器镜像。
  • 创建一个deployment 或job 来管理容器
#启动 nginx 实例,暴露容器端口 80,设置副本数 3[root@master01 ~]# kubectl create deployment nginx --image=nginx:1.14 --replicas=3 --port=80
deployment.apps/nginx created
[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
nginx-d9d8cf5c7-6lhd7   1/1     Running   0          7s
nginx-d9d8cf5c7-97tkw   1/1     Running   0          7s
nginx-d9d8cf5c7-r742g   1/1     Running   0          7s
[root@master01 ~]#
2.3.2 发布

kubectl expose命令

将资源暴露为新的 Service

deploymentnginx创建service,并通过Service的8080端口转发至容器的80端口上,Service的名称为nginx-service,类型为NodePort

[root@master01 ~]# kubectl expose deployment nginx --port=8080 --target-port=80 --name=nginx-service --type=NodePort
service/nginx-service exposed
[root@master01 ~]# kubectl get pod -o  wide
NAME                    READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
nginx-d9d8cf5c7-6lhd7   1/1     Running   0          6m45s   10.244.2.10   node02   <none>           <none>
nginx-d9d8cf5c7-97tkw   1/1     Running   0          6m45s   10.244.1.9    node01   <none>           <none>
nginx-d9d8cf5c7-r742g   1/1     Running   0          6m45s   10.244.1.8    node01   <none>           <none>#查看暴露端口
[root@master01 ~]# kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          26h
nginx-service   NodePort    10.96.147.207   <none>        8080:30130/TCP   148m
[root@master01 ~]##命令行测试访问[root@master01 ~]# curl 10.244.1.10
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master01 ~]#

网页测试访问

请添加图片描述

2.3.3 更新
#将nginx版本更新为latest版本

查看现在的nginx版本

请添加图片描述

[root@master01 ~]# kubectl set image deployment/nginx nginx=nginx:latest
deployment.apps/nginx image updated
[root@master01 ~]#
##kubectl set image(镜像) deployment(控制器种类)/nginx(控制器名字) nginx=nginx:latestkubectl set image --help
Examples:
# Set a deployment's nginx container image to 'nginx:1.9.1', and its busybox container image to 'busybox'.
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
#命令行界面查看是否更新完成
[root@master01 ~]# kubectl describe pod nginx-75b69bd684-2mzjm
Name:         nginx-75b69bd684-2mzjm
Namespace:    default
Priority:     0
Node:         node02/192.168.107.12
Start Time:   Tue, 22 Jul 2025 19:51:48 +0800
Labels:       app=nginxpod-template-hash=75b69bd684
Annotations:  <none>
Status:       Running
IP:           10.244.2.13
IPs:IP:           10.244.2.13
Controlled By:  ReplicaSet/nginx-75b69bd684
Containers:nginx:Container ID:   docker://2c3c2a7e718daadc40860dbdcd0e1d01b0a4b50b11a878785ab5219e47e17e23Image:          nginx:latest

网页界面查看是否更新

请添加图片描述

2.3.4 回滚
#查看历史版本
kubectl rollout history deployment/nginx 
#执行回滚到上一个版本
kubectl rollout undo deployment/nginx
#执行回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1
#检查回滚状态
kubectl rollout status deployment/nginx
2.3.5删除
  #删除副本控制器kubectl delete deployment/nginx#删除servicekubectl delete svc/nginx-service

3、图解服务发布

请添加图片描述

阶段 1:外部客户端 → 节点(Node)的 NodePort 端口

外部客户端(如用户浏览器、其他服务器)需要通过 “节点 IP + NodePort 端口” 发起请求。
例如:客户端访问 192.168.5.10:31234192.168.5.10 是节点 IP,31234 是 K8s 分配的 NodePort)。

  • 为什么是节点 IP?
    节点是集群的 “物理 / 虚拟服务器”,拥有集群外部可访问的 IP(除非节点在私有网络,此时可能需要额外网关)。
  • 为什么是 NodePort 端口?
    NodePort 类型的 Service 会在集群所有节点上开放这个端口,无论 Pod 是否运行在该节点上(K8s 会自动处理跨节点转发)。
阶段 2:节点 → Service 的暴露端口(8080)

节点接收到 31234 端口的流量后,会通过 K8s 的 kube-proxy 组件转发到 nginx-service8080 端口--port=8080 指定)。

  • kube-proxy 的作用
    运行在每个节点上的网络代理,负责维护 Service 与 Pod 的网络规则(如 iptables 或 IPVS 规则)。当 nginx-service 创建后,kube-proxy 会自动生成规则:将节点上 31234 端口的流量转发到 Service 的 8080 端口。
  • Service 的 “虚拟 IP”(ClusterIP)
    Service 创建时会被分配一个内部虚拟 IP(ClusterIP,例如 10.96.123.45),8080 端口是该虚拟 IP 上的监听端口。此时流量实际路径为:节点:31234 → Service ClusterIP:8080
阶段 3:Service → Pod 的目标端口(80)

Service 接收到 8080 端口的流量后,会根据自身的 标签选择器 找到关联的 Pod,并将流量转发到 Pod 的 80 端口--target-port=80 指定,即 Nginx 容器实际监听的端口)。

  • 标签选择器的作用
    Service 通过标签选择器(例如 app: nginx)匹配 Pod。假设 nginx Deployment 创建的 Pod 都带有 app: nginx 标签,Service 会自动关联这些 Pod,无需手动配置。
  • 负载均衡(默认)
    如果有多个 nginx Pod(例如 Deployment 副本数为 3),Service 会通过轮询等策略将流量分发到不同 Pod,实现简单的负载均衡。
  • Pod 网络
    流量从 Service 到 Pod 依赖 K8s 的 Pod 网络插件(如 Calico、Flannel),确保集群内 Pod 之间能通过各自的 IP 直接通信(Pod 有独立 IP,例如 10.244.1.5)。此时流量路径为:Service ClusterIP:8080 → Pod IP:80

4、三种更新方式

4.1 滚动更新(Rolling Update)

特点:逐步替换旧版本实例,每次更新少量 Pod(如 1-2 个),直到全部替换为新版本。

  • 优势:无停机时间,更新过程中服务始终可用;若出现问题可快速回滚。
  • 风险:新旧版本共存可能引发兼容性问题(如 API 版本不兼容)。
  • 适用场景:稳定性要求高、需平滑过渡的场景(如 Web 应用、微服务)。

4.2 AB / 蓝绿更新(Blue-Green Deployment)

特点:同时维护两套环境(蓝 / 绿),旧版本(蓝)提供服务,新版本(绿)就绪后直接切换流量。

  • 优势:切换速度极快(秒级),可快速回滚(切回旧环境);测试环境与生产环境完全一致。
  • 风险:资源成本翻倍(需两套环境);切换瞬间可能有流量丢失。
  • 适用场景:需要严格验证新版本稳定性的场景(如核心交易系统、高并发接口)。

4.3 金丝雀发布 / 灰度发布(Canary Release)

特点:先将新版本部署到少量实例(如 5% 用户),观察无问题后逐步扩大范围至全量。

  • 优势:可精准控制风险,通过部分用户反馈验证新版本;支持 A/B 测试(对比新旧版本性能)。
  • 风险:需复杂的流量路由机制(如按用户 ID、地域分流);若灰度范围过小,可能漏检边缘问题。
  • 适用场景:新功能验证、性能敏感型应用(如移动端 App 后端)。

4.4 对比总结

更新方式停机时间回滚速度资源成本风险控制典型工具(Kubernetes)
滚动更新逐步替换,风险分散Deployment 的 rollingUpdate 策略
AB / 蓝绿更新极短极快全量切换,风险集中双 Deployment + Ingress 路由切换
金丝雀发布按比例放量,精准控制Istio/Linkerd + Gateway API
http://www.lryc.cn/news/596514.html

相关文章:

  • Java数据结构——ArrayList
  • 【黑马SpringCloud微服务开发与实战】(五)微服务保护
  • 嵌入式学习-土堆目标检测(3)-day27
  • 【自定义一个简单的CNN模型】——深度学习.卷积神经网络
  • 【Java】SVN 版本控制软件的快速安装(可视化)
  • 洛谷刷题7..22
  • (Arxiv-2025)HiDream-I1:一种高效图像生成基础模型,采用稀疏扩散Transformer
  • CMake实践:CMake3.30版本之前和之后链接boost的方式差异
  • Day20-二叉树基础知识
  • 智能Agent场景实战指南 Day 18:Agent决策树与规划能力
  • Java 动态导出 Word 登记表:多人员、分页、动态表格的最佳实践
  • IntelliJ IDEA (2024.3.1)优雅导入 Maven 项目的两种方式详解
  • 【IDEA】如何在IDEA中通过git创建项目?
  • IDEA-通过IDEA导入第三方的依赖包
  • Spring5的IOC原理
  • Node.js:Web模块、Express框架
  • Java自动拆箱机制
  • day059-zabbix自定义监控与自动发现
  • 支付网关系统前后端鉴权方案
  • Linux笔记1——简介安装
  • 【实时Linux实战系列】实时文件系统的特性与优化
  • RK3568 Linux驱动学习——SDK烧录
  • Pandas核心数据结构详解
  • 拉普拉斯变换的理解
  • 【Lucene】架构
  • React 项目性能瓶颈分析
  • 力扣刷题 -- 572.另一颗树的子树
  • rk平台(rv1126/rk3588)音视频-交叉编译FFmpeg7.1
  • 蔚来汽车视觉算法面试30问全景精解
  • 【OpenCV篇】OpenCV——01day.图像基础