命名空间、资源限制和Pod简介

Namespace 命名空间

1.资源的分组管理;

2.资源限制;

 # 创建命名空间
 kubectl create namespace/ns test;
 # 查看所有命名空间
 kubectl get ns
 ​
 NAME              STATUS   AGE
 default           Active   25h
 kube-flannel      Active   25h
 kube-node-lease   Active   25h
 kube-public       Active   25h
 kube-system       Active   25h
 work              Active   87m

 * default 默认命名空间,查询资源时默认显示。
 * kube-flannel flannel网络插件的命名空间。
      kubectl get all -n kube-flannel
 * kube-node-lease 是K8s集群中用于节点租约(Node Lease)的一个命名空间。
 * kube-public 所有用户(包括未经过身份验证的用户)都可以读取。
 * kube-system K8s服务的命名空间,K8s的组件。

 # 删除命名空间,会将命名空间中的所有资源全部删除
 kubectl delete ns test
 ​
 # 指定资源的namespace
 cp 01-nginx-pod.yaml 04-test-nginx-ns.yaml
 cat 04-test-nginx-ns.yaml
 vim 04-test-nginx-ns.yaml
 apiVersion: v1
 kind: Pod
 metadata:
   creationTimestamp: null
   labels:
     run: myapp
   name: myapp
   namespace: work      # 创建资源时,指定namespace
 spec:
   containers:
   - image: nginx:1.26
     name: myapp
     resources:         # resources字段是在资源限制时必须添加的
       requests:        # 缩进在resources下
         memory: "64Mi"
         cpu: "250m"
       limits:          # 缩进在resources下
         memory: "128Mi"
         cpu: "500m"
   dnsPolicy: ClusterFirst  # 注意:这个字段属于spec,要和containers同级缩进
   restartPolicy: Always
 status: {}
 # 创建Pod
 kubectl apply -f 04-test-nginx-ns.yaml
 # 指定命名空间查看Pod(显示这样就成功了)
 kubectl get pod -n work
 NAME    READY   STATUS    RESTARTS   AGE
 myapp   1/1     Running   0          8m50s
 # 如果报错可以查看Pod详细信息,重点关注Events部分,它会提示调度失败的具体原因
 kubectl describe pod <pod-name> -n <namespace> 

K8s资源限制

Namespace的资源限制主要通过两种资源对象实现:

  • ResourceQuota(资源配额)

  • LimitRange(限制范围)

它们共同作用于Namespace级别,用于控制资源使用、防止资源滥用,并确保集群资源的合理分配。

配置示例(ResourceQuota)

 # resource-quota.yaml
 apiVersion: v1
 kind: ResourceQuota
 metadata:
   name: ns-resource-quota
   namespace: work    # 目标Namespace
 spec:
   hard:  # 硬限制(不可突破)
     # 计算资源总限制
     requests.cpu: "1"        # 所有Pod的CPU请求总和≤1核
     requests.memory: "1Gi"   # 所有Pod的内存请求总和≤1Gi
     limits.cpu: "2"          # 所有Pod的CPU限制总和≤2核
     limits.memory: "2Gi"     # 所有Pod的内存限制总和≤2Gi
 ​
     # 存储资源限制
     requests.storage: "5Gi"  # 所有PVC的存储请求总和≤5Gi
     persistentvolumeclaims: "3"  # 最多创建3个PVC
 ​
     # 对象数量限制
     pods: "10"               # 最多创建10个Pod
     services: "5"            # 最多创建5个Service
     configmaps: "10"         # 最多创建10个ConfigMap
     
     resources:
       requests:
         memory: "64Mi"
         cpu: "250m"
       limits:
         memory: "128Mi"
         cpu: "500m"

配置示例(LimitRange)

 # limit-range.yaml
 apiVersion: v1
 kind: LimitRange
 metadata:
   name: ns-limit-range
   namespace: work # 目标Namespace
 spec:
   limits:
   - type: Container       # 对容器的限制
     default:              # 容器未指定时的默认limits
       cpu: "500m"         # 默认CPU限制:0.5核
       memory: "512Mi"     # 默认内存限制:512Mi
     defaultRequest:       # 容器未指定时的默认requests
       cpu: "100m"         # 默认CPU请求:0.1核
       memory: "128Mi"     # 默认内存请求:128Mi
     min:                  # 容器资源的最小值(不能低于此值)
       cpu: "50m"
       memory: "64Mi"
     max:                  # 容器资源的最大值(不能超过此值)
       cpu: "1000m"
       memory: "1Gi"
   - type: Pod             # 对Pod的限制(所有容器的资源总和)
     max:
       cpu: "2000m"        # 单个Pod的总CPU限制≤2核
       memory: "2Gi"       # 单个Pod的总内存限制≤2Gi

使用流程

1.创建目标Namespace:

 kubectl create namespace my-namespace

2.应用ResourceQuota:

 kubectl apply -f resource-quota.yaml
 # 如果之前有旧的就先删除再更新

3.应用LimitRange:

 kubectl apply -f limit-range.yaml

4.查看配置:

 # 查看资源配额
 kubectl get resourcequota -n my-namespace
 kubectl describe resourcequota ns-resource-quota -n my-namespace
 ​
 # 查看限制范围
 kubectl get limitrange -n my-namespace
 kubectl describe limitrange ns-limit-range -n my-namespace

注意事项

  • 若仅配置ResourceQuota而无LimitRange,用户创建Pod时必须显式指定资源requestslimits,否则会被拒绝(无法满足配额约束)。

  • LimitRange的默认值仅对新创建的对象生效,不影响已存在的对象。

  • 资源限制需根据集群实际容量和业务需求合理配置,避免过松(资源滥用)或过紧(业务无法运行)。

通过这两种机制,可以实现Namespace级别的精细化资源管控,确保Kubernetes集群的稳定性和资源利用率。

Pod:K8s中最小的运行管理单元

Pod:(豆荚),K8s中最小的运行管理单元,它包含一个或多个容器,并共享网络和存储资源。

当我们启动一个 Pod 以后,每个 Pod 内都会有一个 Pause 的容器

Pause容器:给其他业务容器共享网络、共享数据卷、数据通信等;

同一个Pod中的所有容器可以使用127.0.0.1或localhost进行通信;

创建Pod的流程

用户 → API Server(认证/授权/准入校验)→ etcd(存Pod配置,状态Pending) → Scheduler(过滤→打分→选节点,绑定到节点)→ etcd(更新节点信息) → 目标节点kubelet(调用容器运行时拉镜像、配网络/存储、启动容器) → kubelet(健康检查,向API Server上报状态)→ etcd(更新为Running) → 用户(通过kubectl查看到Running状态)

Pod 的网络

  • 每个Pod都有独立的IP地址;

  • 同一个Pod共享IP和端口,端口号不能冲突,通过localhost通信;

  • K8s集群中的不同Pod,通过IP+端口进行网络通信。

Pod的生命周期

常见的几种状态:

1.Pending:等待调度状态;(调度已经完成,但容器尚未启动)

2.Running:正常运行状态;(调度成功)

3.Succeeded:正常完成任务;(一次性任务完成,并且不会再次启动)

4.Failed:任务未完成;(容器因为非零退出状态而失败)

5.Unknown:未知状态,例如,节点通信故障(K8s无法获取Pod的状态)

6.Initialized:所有初始化容器,初始化成功;

7.Ready:就绪状态,可以响应请求;

8.ContainersReady:所有容器就绪;(所有容器都已经成功启动)

9.PodScheduled:Pod调度成功;(还没有Running)

创建 Pod

操作命令
创建kubectl create -f 文件名.yaml kubectl run pod名称 参数
查询运行状态kubectl get pods -n 空间名称,如果不指定则默认显示default空间内的 pod
查询详情kebectl describe pod Pod名称 -n 空间名称,如果不指定则默认显示default空间内的 pod
删除kubectl delete pod Pod名称 / kubectl delete pod --all
更新(不常用)kubectl replace 文件名.yaml
 # 使kubectl命令直接生成yaml文件
 kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx-deployment.yaml
 # 导出某个pod的信息并生成yaml文件
 kubectl get pod <pod名称> -o yaml > pod.yaml
 # 导出所有pods的yaml信息
 kubectl get pods --all-namespaces -o yaml > pods.yaml

完整资源清单模板:(需要多少粘多少)

 apiVersion: v1          #必选,版本号,例如v1
 kind: Pod               #必选,Pod
 metadata:               #必选,元数据
   name: string          #必选,Pod名称
   namespace: string     #创建资源所属于的命名空间,不写的话默认创建在default空间
   labels:               #自定义标签
     - name: string      #自定义标签名字
   annotations:          #自定义注释列表
     - name: string
 spec:                   #必选,Pod中容器的详细定义
   containers:           #必选,Pod中容器列表
   - name: string        #必选,容器名称
     image: string       #必选,容器的镜像名称
     imagePullPolicy: [Always | Never | IfNotPresent]    #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
     command: [string]    #容器的启动命令列表,如不指定,使用打包时使用的启动命令
     args: [string]          #容器的启动命令参数列表
     workingDir: string      #容器的工作目录
     volumeMounts:           #挂载到容器内部的存储卷配置
     - name: string                                  #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
       mountPath: string   #存储卷在容器内mount的绝对路径,应少于512字符
       readOnly: boolean         #是否为只读模式
     ports:                  #端口号名称
       containerPort: int        #容器需要监听的端口号
       hostPort: int             #容器所在主机需要监听的端口号,默认与Container相同
       protocol: string      #端口协议,支持TCP和UDP,默认TCP
     env:                            #容器运行前需设置的环境变量列表
     - name: string                     #环境变量名称
       value: string                     #环境变量的值
     resources:                          #资源限制和请求的设置
       limits:                       #资源限制的设置
         cpu: string                     #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
         memory: string                  #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
       requests:                         #资源请求的设置
         cpu: string                     #Cpu请求,容器启动的初始可用数量
         memory: string                  #内存清楚,容器启动的初始可用数量
     livenessProbe:                      #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
       exec:                         #对Pod容器内检查方式设置为exec方式
         command: [string]               #exec方式需要制定的命令或脚本
       httpGet:                          #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
         path: string
         port: number
         host: string
         scheme: string
         HttpHeaders:
         - name: string
           value: string
       tcpSocket:                        #对Pod内个容器健康检查方式设置为tcpSocket方式
          port: number
        initialDelaySeconds: 0               #容器启动完成后首次探测的时间,单位为秒
        timeoutSeconds: 0                #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
        periodSeconds: 0                 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
        successThreshold: 0
        failureThreshold: 0
        securityContext:
          privileged:false
     restartPolicy: [Always | Never | OnFailure]     #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
     nodeSelector: obeject               #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
     imagePullSecrets:                   #Pull镜像时使用的secret名称,以key:secretkey格式指定
     - name: string
     hostNetwork:false                   #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
     volumes:                        #在该pod上定义共享存储卷列表
     - name: string                                  #共享存储卷名称 (volumes类型有很多种)
       emptyDir: {}                      #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
       hostPath: string                  #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
         path: string                    #Pod所在宿主机的目录,将被用于同期中mount的目录
       secret:                       #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
         scretname: string
         items:
         - key: string
           path: string
       configMap:                        #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
         name: string
         items:
         - key: string
           path: string

常见错误及排错方法

  1. ImagePullBackOff :镜像拉取失败;(一开始就失败)可能原因有镜像仓库无法连接、镜像不存在或者权限不足等。

    1. 确保镜像能够在集群中访问

    2. 检查镜像仓库是否可连接

    3. 确保镜像名称和标签正确

    4. 检查镜像拉取的凭证是否正确

  2. CrashLoopBackOff :容器重复启动和崩溃;可能原因是应用程序内部错误、配置问题或者资源不足等。

    1. 检查容器日志以找出导致容器崩溃的问题

    2. 检查应用程序配置和资源使用情况

    3. 确保容器运行时参数正确

  3. ErrImagePull :拉取镜像失败;(拉取过程中失败)通常是镜像无效、镜像仓库无法连接或者权限问题等。

    1. 检查镜像是否存在

    2. 检查镜像仓库是否可连接

    3. 检查拉取镜像的权限

  4. CreateContainerConfigError :当 Pod 创建容器配置失败时会出现这个报错。可能是容器配置文件错误、命令错误或者环境变量设置问题等;

    1. 检查容器配置文件是否正确

    2. 确保容器命令和参数正确

    3. 检查环境变量的设置是否正确

  5. PodInitializing :表示 Pod 正在初始化;这通常是因为容器启动需要时间,可以耐心等待。

    1. 等待 Pod 初始化完成

  6. Pending :Pod 处于待定状态,长时间Pending时需要检查节点状态;可能是因为节点资源不足或者调度问题等。可以使用 kubectl describe pod 命令查看具体原因。

    1. 检查节点资源是否充足

    2. 检查调度器是否有足够的资源可用来调度 Pod

  7. Error :Pod 出错,网络、权限、容器运行错误;可能是由于容器无法运行、网络问题或者权限问题等。可以使用 kubectl logs 命令查看容器日志获取更多信息。

    1. 检查容器是否能够正常运行

    2. 检查网络是否正常

    3. 检查权限是否正确配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值