4、K8S-namespace资源对象
K8S-namespace资源对象文章目录K8S-namespace资源对象一、概述namespace应用场景二、namespace资源管理2.1 查看名称空间及其资源对象2.2 管理namespace资源2.3 使用yaml文件创建namespace三、namespace使用案例3.1 创建一个test命名空间3.2 切换默认查看命名空间3.3 查看哪些资源属于命名空间级别的3.4 namespace资源限额3.5 创建资源限制Pod四、NameSpace资源无法删除处理方法1、Finalizers 的作用2、Finalizers 的工作原理3、Finalizers 的常见场景4、Finalizers 的示例查看 Finalizers手动移除 Finalizers5、Finalizers 的注意事项6、总结6、总结一、概述Kubernetes 支持多个虚拟集群它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。命名空间namespace是k8s集群级别的资源可以给不同的用户、租户、环境或项目创建对应的命名空间例如可以为test、devlopment、production、deployment环境分别创建各自的命名空间。namespace应用场景命名空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群根本不需要创建或考虑命名空间。二、namespace资源管理2.1 查看名称空间及其资源对象k8s集群默认提供了几个名称空间用于特定目的例如kube-system主要用于运行系统级资源存放k8s一些组件的。而default则为那些未指定名称空间的资源操作提供一个默认值。##查看名称空间 kubectl get namespace##查看特定的名称空间的详细信息 kubectl describe namespace NAME2.2 管理namespace资源namespace资源的名称仅能由字母、数字、下划线、连接线等字符组成。删除namespace资源会级联删除其包含的所有其他资源对象。##创建名称空间 kubectl create namespace 名称##删除名称空间 kubectl delete namespace 名称2.3 使用yaml文件创建namespaceapiVersion: v1 kind: Namespace metadata: name: myns2三、namespace使用案例3.1 创建一个test命名空间[rootk8s-master01 ~]# kubectl create ns test3.2 切换默认查看命名空间[rootk8s-master01 ~]# kubectl config set-context --current --namespacekube-system#注意:切换命名空间后kubectl get pods 如果不指定-n查看的就是kube-system命名空间的资源了。3.3 查看哪些资源属于命名空间级别的[rootk8s-master01 ~]# kubectl api-resources --namespacedtrueNAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1trueBinding configmaps cm v1trueConfigMap endpoints ep v1trueEndpoints events ev v1trueEvent limitranges limits v1trueLimitRange persistentvolumeclaims pvc v1truePersistentVolumeClaim pods po v1truePod podtemplates v1truePodTemplate replicationcontrollers rc v1trueReplicationController resourcequotasquotav1trueResourceQuota secrets v1trueSecret serviceaccounts sa v1trueServiceAccount services svc v1trueService controllerrevisions apps/v1trueControllerRevision daemonsets ds apps/v1trueDaemonSet deployments deploy apps/v1trueDeployment replicasets rs apps/v1trueReplicaSet statefulsets sts apps/v1trueStatefulSet localsubjectaccessreviews authorization.k8s.io/v1trueLocalSubjectAccessReview horizontalpodautoscalers hpa autoscaling/v2trueHorizontalPodAutoscaler cronjobs cj batch/v1trueCronJobjobsbatch/v1trueJob leases coordination.k8s.io/v1trueLease networkpolicies crd.projectcalico.org/v1trueNetworkPolicy networksets crd.projectcalico.org/v1trueNetworkSet endpointslices discovery.k8s.io/v1trueEndpointSlice events ev events.k8s.io/v1trueEvent pods metrics.k8s.io/v1beta1truePodMetrics ingresses ing networking.k8s.io/v1trueIngress networkpolicies netpol networking.k8s.io/v1trueNetworkPolicy poddisruptionbudgets pdb policy/v1truePodDisruptionBudget rolebindings rbac.authorization.k8s.io/v1trueRoleBinding roles rbac.authorization.k8s.io/v1trueRole csistoragecapacities storage.k8s.io/v1trueCSIStorageCapacity3.4 namespace资源限额namespace是命名空间里面有很多资源那么我们可以对命名空间资源做个限制防止该命名空间部署的资源超过限制。如何对namespace资源做限额呢[[rootk8s-master01 ~]# vim namespace-quota.yamlapiVersion:v1kind:ResourceQuotametadata:name:mem-cpu-quotanamespace:testspec:hard:requests.cpu:2requests.memory:2Gilimits.cpu:4limits.memory:4Gi####解析#####创建的ResourceQuota对象将在test名字空间中添加以下限制#每个容器必须设置内存请求memory request内存限额memory limitcpu请求cpu request和cpu限额cpu limit。##所有容器的内存请求总额不得超过2GiB。##所有容器的内存限额总额不得超过4GiB。##所有容器的CPU请求总额不得超过2CPU。##所有容器的CPU限额总额不得超过4CPU。##应用配额文件并查看命名空间是否收到了限制[rootk8s-master01 ~]# kubectl apply -f namespace-quota.yaml[rootk8s-master01 ~]# kubectl describe ns testName:testResource Quotas Name: mem-cpu-quota Resource Used Hard -------- --- --- limits.cpu04limits.memory04Gi requests.cpu02requests.memory02Gi3.5 创建资源限制Pod创建pod时候可以不用设置资源限额如下[rootk8s-master01 ~]# vim pod-test.yamlapiVersion:v1kind:Podmetadata:name:pod-testnamespace:myns1labels:app:nginx129spec:containers:-name:nginx129ports:-containerPort:80image:nginx:latestimagePullPolicy:IfNotPresent[rootk8s-master01 ~]# kubectl apply -f pod-test.yamlError from server(Forbidden): error when creatingpod-test.yaml:podspod-testis forbidden: failed quota: mem-cpu-quota: must specify limits.cpu for: nginx1;limits.memory for: nginx1;requests.cpu for: nginx1;requests.memory for: nginx1##发现无法正常启动修改一下资源配置清单[rootk8s-master01 ~]# cat pod-test.yamlapiVersion:v1kind:Podmetadata:name:pod-test namespace:test labels:app:tomcat-pod-testspec:containers:-name:tomcat-test ports:-containerPort:8080image:tomcat:8.5-jre8-alpine imagePullPolicy:IfNotPresent resources:requests:cpu:0.5memory:1024Mi limits:cpu:0.5memory:1024Mi再次执行[rootk8s-master01 ~]# kubectl apply -f pod-test.yaml##查看pod正常运行了[rootk8s-master01 ~]# kubectl get pod -n testNAME READY STATUS RESTARTS AGE pod-test1/1 Running015s四、NameSpace资源无法删除处理方法在 Kubernetes 中Finalizers是一种机制用于确保资源在删除之前完成特定的清理操作。它们主要用于防止资源被意外删除直到所有依赖的资源或操作都已完成。1、Finalizers 的作用资源清理在删除资源如 Pod、Namespace、PersistentVolume 等时Finalizers 会确保相关的清理操作如释放存储、断开网络、删除依赖资源等已完成。防止意外删除Finalizers 可以防止资源被意外删除直到所有依赖的资源或操作都已完成。顺序删除在复杂的资源依赖关系中Finalizers 可以确保资源按正确的顺序删除。2、Finalizers 的工作原理资源删除流程当用户请求删除一个资源时Kubernetes 会检查该资源是否包含 Finalizers。如果存在 FinalizersKubernetes 会将该资源标记为Terminating状态但不会立即删除。Kubernetes 会等待所有 Finalizers 被移除后才会真正删除该资源。Finalizers 的移除Finalizers 通常由控制器Controller或 Operator 负责移除。控制器会在完成清理操作后从资源的metadata.finalizers字段中移除对应的 Finalizer。3、Finalizers 的常见场景Namespace 删除在删除 Namespace 时Kubernetes 会确保该 Namespace 下的所有资源如 Pod、Service、ConfigMap 等都已被删除。PersistentVolume 删除在删除 PersistentVolume 时Kubernetes 会确保关联的存储资源已被释放。自定义资源CRD在删除自定义资源时Operator 可能会使用 Finalizers 来确保相关的清理操作已完成。4、Finalizers 的示例查看 Finalizerskubectl get namespacenamespace-name-ojson|jq.metadata.finalizers手动移除 Finalizers如果 Finalizers 卡住导致资源无法删除可以手动移除 Finalizers导出资源定义kubectl get namespacenamespace-name-ojsonns.json编辑ns.json移除spec.finalizers字段{metadata:{finalizers:[]}}更新资源kubectl replace--raw/api/v1/namespaces/namespace-name/finalize-fns.json5、Finalizers 的注意事项不要随意移除 Finalizers手动移除 Finalizers 可能会导致资源未完成清理就被删除从而引发问题如资源泄漏。Finalizers 卡住的原因如果 Finalizers 长时间未移除可能是控制器未正常运行或者清理操作未完成。需要检查相关控制器的日志。Finalizers 的设计在开发自定义控制器或 Operator 时应合理设计 Finalizers确保清理操作的原子性和可靠性。6、总结Finalizers 是 Kubernetes 中用于资源清理和删除顺序控制的重要机制。它们确保资源在删除之前完成所有必要的操作避免资源泄漏或不一致的状态。然而如果 Finalizers 未正确移除可能会导致资源卡在Terminating状态此时需要手动干预。zers 卡住的原因**如果 Finalizers 长时间未移除可能是控制器未正常运行或者清理操作未完成。需要检查相关控制器的日志。Finalizers 的设计在开发自定义控制器或 Operator 时应合理设计 Finalizers确保清理操作的原子性和可靠性。6、总结Finalizers 是 Kubernetes 中用于资源清理和删除顺序控制的重要机制。它们确保资源在删除之前完成所有必要的操作避免资源泄漏或不一致的状态。然而如果 Finalizers 未正确移除可能会导致资源卡在Terminating状态此时需要手动干预。