Kubernetes资源对象和Pod资源

image-20260510200535743

Kompose 是一个转换工具,可将 compose (即 Docker Compose)所组装的所有内容转换成容器编排器(Kubernetes 或 OpenShift)可识别的形式。

Kompose 官网  http://kompose.io

名称空间

内置默认名称空间

  • default

默认工作空间,不指定 namespace 时,资源都建在这里。

  • kube-system

集群系统核心组件专属空间:kube-apiserver、etcd、kube-proxy、CoreDNS、网络插件等,禁止手动删改

  • kube-public

公共只读命名空间,所有用户可访问,存放集群公共信息(如集群 ConfigMap)。

  • kube-node-lease

节点租约对象,用于节点心跳健康检测,维持节点在线状态。

常用操作命令

# 查看所有命名空间
kubectl get ns

# 创建命名空间
kubectl create ns 名称

# 指定命名空间创建/查看资源
kubectl get pod -n 名称

# 设置默认命名空间(后续不用加 -n)
kubectl config set-context --current --namespace=名称

创建Namespace资源

指令式命令创建

使用指令式命令 kubectl create 可以直接创建名称空间,只需指定名称空间名称

[root@master1 ~]#kubectl create namespace namespace-test1
namespace/namespace-test1 created
[root@master1 ~]#kubectl get namespace namespace-test1
NAME             STATUS   AGE
namespace-test1   Active   4s

注意:实际生产中不建议使用指令式命令和配置,直接使用声明式就可以。

指令式配置创建

kubectl create -f </path/to/namespace-obj.yaml 实现创建

此方式生产不建议使用,执行此命令需要指定的namespace不存在

[root@master1 ~]#cat namespace-test2.yaml
apiVersion: v1
kind: Namespace
metadata:
 name: namespace-test2
  
[root@master1 ~]#kubectl create -f namespace-test2.yaml
namespace/namespace-test1 created
声明式配置创建

范例: 方法1

[root@master1 ~]#cat namespace-test2.yaml
apiVersion: v1
kind: Namespace
metadata:
 name: namespace-test2
[root@master1 ~]#kubectl apply -f namespace-test2.yaml
namespace/namespace-test1 created
[root@master1 ~]#kubectl get namespace namespace-test2
NAME             STATUS   AGE
namespace-test2   Active   4m12s

范例: 方法2

[root@ubuntu2204 ~]#kubectl get ns default -o yaml > default-ns.yaml
[root@ubuntu2204 ~]#vim default-ns.yaml
[root@ubuntu2204 ~]#cat default-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
 name: demo
[root@ubuntu2204 ~]#kubectl apply -f default-ns.yaml
namespace/demo created
[root@ubuntu2204 ~]#kubectl get ns demo
NAME   STATUS   AGE
demo   Active   7s

删除Namespace资源

注意: 删除 Namespace 会级联删除此名称空间的所有资源,非常危险

#方法1
[root@master1 ~]#kubectl delete namespaces namespace-test1 
namespace "namespace-test1" deleted
#方法2
[root@master1 ~]#kubectl delete -f namespace-test2.yaml
namespace "namespace-test2" deleted

删除指定名称空间的资源

使用 kubectl 管理资源时,如果提供了名称空间选项,就表示此管理操作仅针对指定名称空间进行,而删除 Namespace 资源则会级联删除其包含的所有其他资源对象。

命令格式功能
kubectl delete TYPE RESOURCE -n删除指定名称空间内的指定资源
kubectl delete TYPE --all -n删除指定名称空间内的指定类型的所有资源
kubectl delete all -n删除指定名称空间内的所有资源
kubectl delete all --al删除所有名称空间中的所有资源

pod资源

Pod资源基础

什么是pod

Pod 是 K8s 最小调度单元,不是容器,是一组紧密关联容器的封装。一个 Pod 里可以跑1 个主容器(最常用)或多个协作容器。

一个 Pod 里可以跑1 个主容器(最常用)或多个协作容器。

每个Pod中的容器依赖于一个特殊名为pause容器事先创建出可被各应用容器共享的基础环境,包括Network、IPC和UTS名称空间共享给Pod中各个容器,PID名称空间也可以共享,但需要用户显式定义,Mount和User是不共享的,每个容器有独立的Mount,User的名称空间

Pod的组成形式有两种

单容器Pod:除Pause容器外,仅含有一个容器

多容器Pod:除Pause容器外,含有多个具有“超亲密”关系的容器,一般由主容器和辅助容器(比如:sidecar容器)构成

pod的特点
  1. 同一 Pod 内所有容器:
  • 共享网络命名空间(同 IP、同端口、互通用localhost
  • 共享存储卷 Volume
  • 调度、启停原子化:一起创建、一起销毁、一起调度到同一节点
  1. 生命周期短暂:随时可能被重建、迁移,不持久化业务数据
  2. 不会自愈,靠控制器管理(Deployment/StatefulSet 等),不直接裸用 Pod
Pod 生命周期状态

Pending:已创建,未调度 / 镜像拉取中

Running:已调度到节点,容器正常运行

Succeeded:一次性任务跑完,正常退出

Failed:容器异常退出

Unknown:节点失联,状态未知

探针(健康检查)

存活探针 livenessProbe:容器死了就重启 Pod

就绪探针 readinessProbe:没就绪就不接入流量

探测方式:HTTPGet、TCPSocket、Exec 命令

Pod 资源限制

requests:调度最低需要的 CPU / 内存(调度依据)

limits:最大可用上限,超了会被限流 / 杀掉

pod网络

每个 Pod独占集群独立 IP

集群内 Pod 之间直接互通,无需端口映射

Pod 完整生命周期流程

创建 Pod → 提交 yaml 到 apiserver

调度调度器 → 选出合适 Node 节点

节点拉取镜像 → 下载容器镜像

初始化容器 InitContainer 依次执行,全部成功才往下走

启动主业务容器

就绪探针 readinessProbe 检测通过 → 加入 Service 接收流量

运行中:存活探针 livenessProbe 持续巡检

删除 Pod → 先执行优雅终止(默认 30s),停止容器、清理资源

节点故障后不具有自动调度至其它节点的故障自愈能力

由Workload Controller 管控的 Pod

比如: 由Deployment控制器管理的Pod

节点故障后具有自动调度至其它节点的故障自愈能力

静态 Pod

由kubelet加载配置信息后,自动在对应的节点上创建的Pod

用于实现Master节点上的系统组件API Server 、Controller-Manager 、Scheduler 和Etcd功能的Pod

相关配置存放在控制节点的 /etc/kubernetes/manifests 目录下

自主式 Pod

自主式Pod是由Pod本身去控制本身,不受其它资源如控制器控制的 Pod

这种Pod本身不具有自我修复功能,当自主式Pod被创建后,都会被Kubernetes调度到集群的Node上。

不论是否故障,都会在此Node节点上存在,直到Pod的进程终止和被删掉

中间如果Pod即使出了故障, Pod也不会被调度至其它节点实现自愈

可以支持三种方法创建自主式pod

指令式命令

指令式对象配置文件

声明式对象配置文件

指令式命令创建 Pod

通过kubectl 命令行工具指定选项创建 Pod,适合临时性工作

基本语法

kubectl run NAME --image=image [--port=port] [--replicas=replicas] 
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dryrun=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...] 
[options]
#参数详解
--image='' #指定容器要运行的镜像
--port='' #设定容器暴露的端口
--dry-run=true #以模拟的方式来进行执行命令
--env=[] #执行的时候,向对象中传入一些变量
--labels='' #设定pod对象的标签
--limits='cpu=200m,memory=512Mi' #设定容器启动后的资源配置
--replicas=n #设定pod的副本数量,新版不再支持
--command=false     #设为true,将 -- 后面的字符串做为命令代替容器默认的启动命令,而非做为默认启动命令的参数
-it            #打开交互终端
--rm           #即出即删除容器
--restart=Never #不会重启

范例:

#初始化一个Pod对象,包含一个nginx容器
[root@master1 ~]#kubectl run nginx01 --image=registry.cn-beijing.aliyuncs.com/wangxiaochun/nginx:1.20.0
pod/nginx01 created
#查看pod状态
[root@master1 ~]#kubectl get pod nginx01 
NAME     READY   STATUS             RESTARTS   AGE
nginx01   0/1     ContainerCreating   0         19s
#创建Busybox的Pod,默认busybox没有前台进程,需要指定前台程序才能持继运行
[root@master1 ~]#kubectl run busybox --image registry.cnbeijing.aliyuncs.com/wangxiaochun/busybox:1.32.0 -- sleep 3600
[root@master1 ~]#kubectl get pod busybox
NAME     READY   STATUS   RESTARTS   AGE
busybox   1/1     Running   0         9m37s

范例:在命令行创建pod 引用环境变量,之后可以通过$(VAR_NAME)在容器中获取变量

#运行pod时定义一个变量
[root@master1 ~]#kubectl run pod-conf --image=registry.cnbeijing.aliyuncs.com/wangxiaochun/nginx:1.20.0 --env="NAME=wangxiaochun"
#验证变量
[root@master1 ~]#kubectl exec -it pod-conf -- sh
# echo $NAME
wangxiaochun
[root@master1 ~]#kubectl delete pod pod-conf

创建时用户通过 kubectl apply/create 命令将创建请求提交到 API server 并将其保存至集群状态存储系统 etcd 中,而后由调度器将创建请求调度到最佳的目标 node,并被运行于该 node 的 kubelet 借助于容器引擎创建并启动 pod。

创建pod资源清单文件

手动创建pod资源清单文件

[root@master1 ~]#vim pod-test1.yaml 
[root@master1 ~]#cat pod-test1.yaml 
apiVersion: v1   #指定API版本,此为固定值
kind: Pod        #指定资源类型 pod
metadata:        #元数据类型
 name: pod-test1       # 指定pod名称
 namespace: default    #指定名称空间,如果不指定为default
spec:            #表述信息
 containers:    #容器信息
  - name: nginx-web01    #容器名称为APP
   image: registry.cn-beijing.aliyuncs.com/wangxiaochun/nginx:1.20.0   #运行的是nginx 镜像,可以同时运行多个容器

自己编写资源定义文件有些繁琐,可以利用现有的pod生成yaml清单文件,再修改即可

[root@master1 ~]#kubectl get pod pod-test1 -o yaml --export > pod-test1-export.yaml
#命令解析
-o yaml #以yaml的格式显示当前资源的所有属性信息。
--export #在导出信息的时候,会忽略掉有系统生成的信息,这个功能在1.19版本之后被移除了
#修改生成的文件,只保留需要的内容
[root@master1 ~]#vim pod-test1-export.yaml
[root@master1 ~]#cat pod-test1-export.yaml
apiVersion: v1
kind: Pod
metadata:
 name: pod-test2
spec:
 containers:
  - image: registry.cn-beijing.aliyuncs.com/wangxiaochun/nginx:1.20.0
   name: nginx-web02

扩容和缩容

#把myweb扩容到3个
kubectl scale deployment myweb --replicas=3
#把myweb缩容容到1个
kubectl scale deployment myweb --replicas=1

deployment-test

范例: 基于声明清单文件实现升级和降级

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: rs-test
  template:
    metadata:
      labels:
        app: rs-test
    spec:
      containers:
      - name: pod-test
        image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1

起了三个pod

image-20260512212221138

查看版本

image-20260512212301440

升级版本

把image更换成v0.2

image-20260512212637397

回滚上一个版本

#回滚上一个操作
[root@master1 ~]#kubectl rollout undo deployment deployment-test 
deployment .apps/deployment-test rolled back
确认回滚

image-20260512213314826

image-20260512213341313

[root@master1 pod]# kubectl annotate deployment deployment-test kubernetes.io/change-cause="v1.0" --overwrite
deployment.apps/deployment-test annotated
[root@master1 pod]# 
[root@master1 pod]# 
[root@master1 pod]# kubectl rollout history deployment deployment-test
deployment.apps/deployment-test 
REVISION  CHANGE-CAUSE
5         <none>
6         <none>
7         v1.0

[root@master1 pod]#

是 老版本 Kubernetes(1.24 及以下) 用 --record=true 才会出来的效果!

[root@master1 pod]# kubectl annotate deployment deployment-test kubernetes.io/change-cause='kubectl set image deployment/deployment-test pod-test=registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.3 --record=true' --overwrite
deployment.apps/deployment-test annotated
[root@master1 pod]# 
[root@master1 pod]# kubectl rollout history deployment deployment-test
deployment.apps/deployment-test 
REVISION  CHANGE-CAUSE
5         <none>
6         <none>
7         kubectl set image deployment/deployment-test pod-test=registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.3 --record=true


image-20260512214208126

更多推荐