【kubernetes】-2 K8S的资源管理

文章目录

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

bash 复制代码
#查看资源
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(仅展示几种核心资源,并不完整)

bash 复制代码
#查看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 ~]#
bash 复制代码
#查看命名空间

[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 ~]#
bash 复制代码
#查看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 ~]#
bash 复制代码
#创建命名空间
kubectl create ns app

#删除命名空间
kubectl delete namespace app
bash 复制代码
#创建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=nginx01
              pod-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://649c42d970ee346698cbacb029cb58626964d1e46076e0141aa445780a8f7558
    Image:          nginx:1.14
    Image ID:       docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 22 Jul 2025 16:14:13 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-kbwjz (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-kbwjz:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-kbwjz
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.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 node01
  Normal  Pulled     27s   kubelet            Container image "nginx:1.14" already present on machine
  Normal  Created    27s   kubelet            Created container nginx
  Normal  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:/#
bash 复制代码
#查看日志

[root@master01 ~]# kubectl logs nginx-5658bdf5d4-cqzqn

[root@master01 ~]# kubectl logs nginx01-644d98997f-6cl78
[root@master01 ~]#
bash 复制代码
#删除相当于是重启
[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 ~]#
bash 复制代码
#强制删除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
bash 复制代码
#扩缩容
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 ~]#
bash 复制代码
#删除副本控制器
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 来管理容器
bash 复制代码
#启动 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

bash 复制代码
[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 更新
bash 复制代码
#将nginx版本更新为latest版本

查看现在的nginx版本

bash 复制代码
[root@master01 ~]# kubectl set image deployment/nginx nginx=nginx:latest
deployment.apps/nginx image updated
[root@master01 ~]#
##kubectl set image(镜像) deployment(控制器种类)/nginx(控制器名字) nginx=nginx:latest

kubectl 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
bash 复制代码
#命令行界面查看是否更新完成
[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=nginx
              pod-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://2c3c2a7e718daadc40860dbdcd0e1d01b0a4b50b11a878785ab5219e47e17e23
    Image:          nginx:latest

网页界面查看是否更新

2.3.4 回滚
bash 复制代码
#查看历史版本
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删除
bash 复制代码
  #删除副本控制器
  kubectl delete deployment/nginx
  #删除service
  kubectl 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