K8s Namespace:隔离集群资源的基础方法

好的,各位看官,欢迎来到今天的K8s大讲堂!今天咱们要聊的,是Kubernetes(简称K8s)里一个非常基础,但又极其重要的概念——Namespace。 🚀

什么?你听说过Namespace,觉得它就是个“文件夹”? 🙅‍♂️ 那你就太小看它了!Namespace可不是简单的文件夹,它更像是K8s集群里的“虚拟宇宙”,让你的应用在其中安家落户,互不干扰。想象一下,如果没有Namespace,你的所有应用都挤在一个“房间”里,那画面太美,我不敢看! 😱

所以,今天咱们就来好好扒一扒K8s Namespace的底裤,不对,是底细!让大家彻底明白它是什么,能干什么,以及如何正确使用它。系好安全带,发车啦! 💨

一、Namespace:集群资源的“楚河汉界”

首先,我们来给Namespace下一个定义。简单来说,Namespace提供了一种在单个Kubernetes集群中划分资源的方式。它可以将集群资源分割成多个逻辑隔离的空间,每个Namespace中的资源相互独立,互不影响。

你可以把K8s集群想象成一个大型的公寓楼,而Namespace就是楼里的一个个独立的房间。每个房间可以住不同的住户(应用),他们可以在自己的房间里随意折腾,不会影响到其他住户的生活。

更形象一点,你可以把它比作不同国家的领土。每个国家(Namespace)都有自己的法律、货币、文化,等等,彼此独立。即使两个国家相邻,它们的资源、政策也是完全隔离的。

那么,为什么要用Namespace呢? 难道仅仅是为了让应用“住得舒服”吗?当然不是!Namespace存在的意义远不止于此。

1. 资源隔离: 这是Namespace最核心的功能。通过Namespace,我们可以将不同团队、不同环境的应用隔离开来。例如,可以将开发环境、测试环境、生产环境分别放在不同的Namespace中,避免互相干扰。

2. 资源配额: Namespace可以限制其内部资源的用量,例如CPU、内存等。这样可以防止某个Namespace中的应用过度消耗资源,影响到其他Namespace中的应用。这就像是给每个房间分配了水电额度,避免浪费。

3. 权限控制: 可以为不同的Namespace设置不同的权限,例如,只允许某些用户访问特定的Namespace。这保证了资源的安全性,防止未经授权的访问。

4. 多租户支持: 对于需要支持多租户的场景,Namespace是必不可少的。每个租户可以拥有自己的Namespace,互不干扰。

5. 简化管理: 通过Namespace,我们可以将复杂的集群资源划分为更小的、更易于管理的单元。这就像是将一个大型项目分解为多个模块,每个模块由不同的团队负责。

功能特点 作用 形象比喻
资源隔离 将不同应用隔离开来,避免互相干扰 公寓楼里的独立房间
资源配额 限制Namespace内部资源的用量 每个房间的水电额度
权限控制 为不同Namespace设置不同的权限 国家之间的边境管理
多租户支持 为每个租户提供独立的资源空间 不同的国家
简化管理 将复杂的集群资源划分为更小的单元 大型项目分解为多个模块

二、Namespace:K8s世界的“默认规则”

在K8s中,有一些默认的Namespace,它们承担着特殊的使命。我们来认识一下这些“老朋友”:

  • default: 这是默认的Namespace,如果你没有指定Namespace,那么你的资源就会被创建到这个Namespace中。就像是“默认收货地址”,如果你不指定,东西就寄到这里。

  • kube-system: 这个Namespace是K8s系统组件的家,例如kube-dns、kube-proxy等。这些组件是K8s集群正常运行的基础,所以千万不要随意修改或删除这个Namespace中的资源! 🙅‍♀️ 这就像是房子的地基,动了它,房子就塌了。

  • kube-public: 这个Namespace是公开的,所有用户都可以访问。通常用于存放一些公共的配置信息,例如ConfigMap。

  • kube-node-lease: 这个Namespace用于节点的心跳检测。每个节点会定期向这个Namespace发送心跳信息,告诉Master节点自己还活着。

我们可以通过以下命令查看集群中的所有Namespace:

kubectl get namespaces

输出结果类似于:

NAME              STATUS   AGE
default           Active   2d
kube-node-lease   Active   2d
kube-public       Active   2d
kube-system       Active   2d

三、Namespace:创建和使用“小宇宙”

了解了Namespace的概念和作用,接下来我们来学习如何创建和使用Namespace。

1. 创建Namespace:

创建Namespace有两种方式:

  • 通过命令行:

    kubectl create namespace my-namespace

    这条命令会创建一个名为“my-namespace”的Namespace。是不是很简单? 😄

  • 通过YAML文件:

    创建一个名为“my-namespace.yaml”的文件,内容如下:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: my-namespace

    然后执行以下命令:

    kubectl apply -f my-namespace.yaml

    这种方式更灵活,可以设置Namespace的更多属性,例如labels、annotations等。

2. 指定Namespace:

创建了Namespace之后,我们需要告诉K8s,我们要在这个Namespace中创建资源。有以下几种方式可以指定Namespace:

  • 通过命令行参数:

    在执行kubectl命令时,使用-n--namespace参数指定Namespace。例如:

    kubectl create deployment my-app --image=nginx -n my-namespace

    这条命令会在“my-namespace”中创建一个名为“my-app”的Deployment。

  • 通过YAML文件:

    在YAML文件中,通过metadata.namespace字段指定Namespace。例如:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
      namespace: my-namespace
    spec:
      ...
  • 通过Context:

    Context是kubectl的配置,可以指定默认的Namespace。通过以下命令可以设置Context:

    kubectl config set-context --current --namespace=my-namespace

    设置之后,所有kubectl命令都会默认在“my-namespace”中执行,除非你显式指定了其他Namespace。

3. 查看Namespace中的资源:

可以使用以下命令查看特定Namespace中的资源:

kubectl get pods -n my-namespace

这条命令会列出“my-namespace”中的所有Pod。

4. 删除Namespace:

可以使用以下命令删除Namespace:

kubectl delete namespace my-namespace

注意: 删除Namespace会删除其中所有的资源,所以请谨慎操作! ⚠️ 这就像是拆房子,房子没了,里面的东西也就都没了。

四、Namespace:进阶用法“十八般武艺”

掌握了Namespace的基本用法,我们再来学习一些进阶用法,让你的Namespace玩得更溜!

1. ResourceQuota:限制资源的“紧箍咒”

ResourceQuota可以限制Namespace中资源的用量,例如CPU、内存、Pod数量等。这可以防止某个Namespace中的应用过度消耗资源,影响到其他Namespace中的应用。

创建一个名为“resource-quota.yaml”的文件,内容如下:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-resource-quota
  namespace: my-namespace
spec:
  hard:
    pods: "10"
    requests.cpu: "2"
    requests.memory: "4Gi"
    limits.cpu: "4"
    limits.memory: "8Gi"

这个ResourceQuota限制了“my-namespace”中:

  • Pod数量不能超过10个
  • CPU请求总量不能超过2核
  • 内存请求总量不能超过4Gi
  • CPU限制总量不能超过4核
  • 内存限制总量不能超过8Gi

然后执行以下命令:

kubectl apply -f resource-quota.yaml

如果Namespace中的资源用量超过了ResourceQuota的限制,K8s会拒绝创建新的资源。

2. LimitRange:设置默认值的“保护伞”

LimitRange可以为Namespace中的Pod和Container设置默认的CPU、内存请求和限制。这可以帮助开发者更好地管理资源,避免资源浪费。

创建一个名为“limit-range.yaml”的文件,内容如下:

apiVersion: v1
kind: LimitRange
metadata:
  name: my-limit-range
  namespace: my-namespace
spec:
  limits:
  - default:
      cpu: 500m
      memory: 1Gi
    defaultRequest:
      cpu: 250m
      memory: 512Mi
    type: Container

这个LimitRange为“my-namespace”中的Container设置了:

  • 默认的CPU限制为500m
  • 默认的内存限制为1Gi
  • 默认的CPU请求为250m
  • 默认的内存请求为512Mi

如果开发者在创建Pod或Container时没有指定CPU和内存的请求和限制,K8s会自动使用这些默认值。

3. NetworkPolicy:构建网络“防火墙”

NetworkPolicy可以控制Namespace中的Pod之间的网络流量。这可以提高集群的安全性,防止恶意攻击。

创建一个名为“network-policy.yaml”的文件,内容如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: my-namespace
spec:
  podSelector:
    matchLabels:
      app: my-app
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: my-other-app

这个NetworkPolicy允许“my-namespace”中带有标签“app=my-other-app”的Pod访问带有标签“app=my-app”的Pod。其他Pod无法访问。

4. Role和RoleBinding:赋予访问权限的“钥匙”

Role和RoleBinding可以控制用户或ServiceAccount对Namespace中资源的访问权限。这可以保证资源的安全性,防止未经授权的访问.

例如,创建一个Role,允许用户读取Pod:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: my-namespace
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

然后创建一个RoleBinding,将这个Role绑定到某个用户:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: my-namespace
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

这样,用户“jane”就拥有了读取“my-namespace”中Pod的权限。

五、Namespace:最佳实践“葵花宝典”

最后,我们来总结一些Namespace的最佳实践,帮助你更好地使用Namespace:

  • 不要把所有应用都放在default Namespace中! 🙅‍♂️ 这就像是把所有东西都堆在一个房间里,时间长了会乱成一团。
  • 为不同的环境(开发、测试、生产)创建不同的Namespace。
  • 使用ResourceQuota限制Namespace中资源的用量。
  • 使用LimitRange为Namespace中的Pod和Container设置默认的资源请求和限制。
  • 使用NetworkPolicy控制Namespace中的Pod之间的网络流量。
  • 使用Role和RoleBinding控制用户和ServiceAccount对Namespace中资源的访问权限。
  • 定期清理不再使用的Namespace。

记住,Namespace是K8s集群资源管理的基础,用好Namespace,可以大大提高集群的效率和安全性。

六、总结:Namespace,K8s的“基石”

好了,今天的K8s Namespace大讲堂就到这里了。希望通过今天的讲解,大家对Namespace有了更深入的了解。

Namespace就像是K8s集群的“基石”,它提供了一种隔离、管理和控制集群资源的方式。掌握了Namespace,你就掌握了K8s资源管理的关键。

希望大家在实际应用中能够灵活运用Namespace,让你的K8s集群更加高效、安全、可靠!

下次再见! 👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注