【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.mfbz.cn/a/2638.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AWS PrivateLink方式访问Redis

问题 现在有两个不同的aws云账号&#xff0c;而且&#xff0c;这两个不同云账号&#xff0c;其中一个拥有Redis服务&#xff08;elasticache&#xff09;。现在需要通过另外一个账号的vpc内网访问另外一个账号的内网的redis服务。 解决 AWS PrivateLink方式。这样就可以通过…

数据库—修改某字段默认值

前言有时候&#xff0c;数据库的字段默认值没有正确设置&#xff0c;这时候需要改默认值。以下是我做的改默认值的记录&#xff0c;希望对网友有所帮助。1.SQL SERVER下面的示例假设你要修改名为 YourColumnName 的字段&#xff0c;并为其设置一个新的默认值 NewDefaultValue。…

Go语言切片(Slice)与数组(Array)深度解析:避坑指南与最佳实践

在Go语言中&#xff0c;切片(slice)和数组(array)是两种基础但常被混淆的数据结构。本文将深入剖析它们的核心区别&#xff0c;揭示常见陷阱&#xff0c;并提供实战解决方案。一、本质区别&#xff1a;固定大小 vs 动态容器 数组(Array)&#xff1a;固定长度的连续内存块 // 声…

2025乐彩V8影视系统技术解析:双端原生架构与双H5免签封装实战 双端原生+双H5免签封装+TV级性能优化,一套代码打通全终端生态

1. 双端原生实现方案 Android端&#xff1a;基于Kotlin Jetpack Compose架构&#xff0c;深度优化ExoPlayer内核&#xff0c;支持4K HDR硬解与DRM加密流 iOS端&#xff1a;Swift SwiftUI构建&#xff0c;集成AVFoundation定制播放器&#xff0c;实现画中画与杜比全景声支持 …

【Dij】P1807 最长路

题意 设 GGG 为有 nnn 个顶点的带权有向无环图&#xff0c;GGG 中各顶点的编号为 111 到 nnn&#xff0c;请设计算法&#xff0c;计算图 GGG 中 1,n1, n1,n 间的最长路径。 输入格式 输入的第一行有两个整数&#xff0c;分别代表图的点数 nnn 和边数 mmm。 第 222 到第 (m1…

【数据结构初阶】--双向链表(二)

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

一个月掌握数据结构与算法:高效学习计划

一个月掌握数据结构与算法&#xff1a;高效学习计划掌握数据结构与算法是成为优秀程序员的关键一步。虽然一个月时间紧凑&#xff0c;但通过高效学习完全可以掌握核心内容。以下是一个系统化的学习计划&#xff1a;第一周&#xff1a;基础数据结构目标&#xff1a;掌握数组、链…

Linux物理地址空间入门:从硬件到内核内存的基石

目录 一、物理地址空间是什么&#xff1f; 二、物理地址空间的构成&#xff1a;不仅仅是内存 三、Linux内核如何管理物理地址空间 &#xff08;1&#xff09;物理内存的碎片化问题 &#xff08;2&#xff09;物理地址的分区管理 &#xff08;3&#xff09;物理地址与内核…

解决win10下Vmware虚拟机在笔记本睡眠唤醒后ssh连接不上的问题

背景 在使用Vmware虚拟机时经常会遇到这样一个问题&#xff1a;当笔记本电脑从睡眠状态唤醒后【关掉笔记本盖子一段时间&#xff0c;再打开电脑】&#xff0c;ssh连接不上虚拟机&#xff0c;需要将Vmware的网卡在控制面板中禁用再重启才可以。 解决方法 使用Win10的任务计划程序…

20250721

P5357 【模板】AC 自动机 - 洛谷 主要是构建fail树 /* 我们可以知道的是&#xff0c;当访问一个点x时&#xff0c;接下来需要跳转其fail[x]&#xff0c;以此类推&#xff0c;如果在某个fail[x]上出现了一个字符串&#xff0c;那么相应的统计次数应该加1&#xff0c;然后当访…

Maven

目录 1 什么是 Maven 2 Maven 核心功能 项目构建 依赖管理 Maven Help 插件 3 Maven 仓库 本地仓库 中央仓库 私有服务器&#xff08;简称私服&#xff09; 4 Maven 设置国内源 配置当前项目 setting 设置新项目的 setting 1 什么是 Maven Maven 是一个项目管理工…

RabbitMQ核心组件浅析:从Producer到Consumer

作为分布式系统中异步通信的扛把子&#xff0c;RabbitMQ 凭借其高可靠、灵活路由的特性&#xff0c;几乎是每个后端开发者的"必备技能"。但很多新手刚接触时&#xff0c;常被各种组件名称绕晕——Broker、Exchange、Queue、vhost…这些"术语炸弹"到底啥关系…