雪明老师 發表於 2025-5-3 12:26:00

K8s新手系列之namespace

<h2 id="概述">概述</h2>
<p>官方文档地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/namespaces/</p>
<p>namespace是K8s系统中的一种非常重要的资源,它的主要作用是用来<strong>实现多套环境的资源隔离或者多租户的资源隔离</strong>。</p>
<p>默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。</p>
<p>可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。<br>
<img src="https://img2024.cnblogs.com/blog/3468887/202505/3468887-20250502202532784-2099748673.png" alt="image" loading="lazy"></p>
<p>对于资源隔离,有的资源支持名称空间的,我们称之为局部资源。比如: po,svc,rc,...</p>
<p>而对于不支持名称空间的,我们称之为全局(集群)资源。比如: cs,no,ns...</p>
<h2 id="查看k8s中哪些资源是否支持namespace">查看K8s中哪些资源是否支持namespace</h2>
<p>通过<code>kubectl api-resources</code>字段来查看。如下图:<br>
可以查看NAMESPACED字段,当NAMESPACED为true时,则对应的该资源支持名称空间,称为局部资源;为false时则不支持名称空间,称为全局资源。<br>
<img src="https://img2024.cnblogs.com/blog/3468887/202505/3468887-20250502202753759-1728749984.png" alt="image" loading="lazy"></p>
<h2 id="查看namespace">查看namespace</h2>
<pre><code># 查看所有的namespace
# kubectl get namespace
NAME               STATUS   AGE
calico-apiserver   Active   6d6h
calico-system      Active   6d6h
default            Active   6d6h
kube-node-lease    Active   6d6h
kube-public      Active   6d6h
kube-system      Active   6d6h
tigera-operator    Active   6d6h
</code></pre>
<p>初始状态下,Kubernetes 具有四个namespace:</p>
<ul>
<li>default:默认的namespace,创建的资源未指定namespace时就在default空间下</li>
<li>kube-node-lease 此namespace保存与每个节点关联的租约(Lease)对象。 节点租约允许 kubelet 发送心跳, 以便控制平面可以检测节点故障。</li>
<li>kube-public 自动创建且被所有用户可读的namespace(包括未经身份认证的)。 此namespace通常在某些资源在整个集群中可见且可公开读取时被集群使用。 此namespace的公共方面只是一个约定,而不是一个必要条件。</li>
<li>kube-system 由 Kubernetes 系统创建的对象的namespace</li>
</ul>
<h2 id="创建namespace">创建namespace</h2>
<p>避免使用前缀 <code>kube-</code> 创建namespace,因为它是为 Kubernetes 系统namespace保留的。</p>
<h3 id="通过资源清单创建namespace">通过资源清单创建namespace</h3>
<pre><code># 创建资源清单
# cat dev.yaml
apiVersion: v1
kind: Namespace
metadata:
    name: dev

# 创建namespace
# kubectl apply -f dev.yaml
namespace/dev created

# 查看namespace
# kubectl get namespace dev
NAME   STATUS   AGE
dev    Active   11s
</code></pre>
<h3 id="通过命令创建namespace">通过命令创建namespace</h3>
<p>语法:</p>
<pre><code>kubectl create namespace &lt;namespace-name&gt;
</code></pre>
<p>示例:</p>
<pre><code># 创建名称为sit的namespace
# kubectl create namespace sit
namespace/sit created

# 验证是否创建成功
# kubectl get namespace sit
NAME   STATUS   AGE
sit    Active   13s
</code></pre>
<h2 id="删除namespace">删除namespace</h2>
<p>删除namespace时会删除namespace下的所有内容!一般不建议删除namespace。<br>
删除namespace是异步的,所以有一段时间你会看到namespace处于 <code>Terminating</code> 状态。</p>
<p>语法:</p>
<pre><code>kubectl delete namespaces &lt;namespace-name&gt;
</code></pre>
<p>示例:</p>
<pre><code># 删除sit的namespace
# kubectl delete namespace sit
namespace "sit" deleted
# 验证是否删除成功
# kubectl get namespace sit
Error from server (NotFound): namespaces "sit" not found
</code></pre>
<h2 id="创建k8s资源在指定的namespace">创建K8s资源在指定的namespace</h2>
<p>创建局部资源时(例如Pod、ConfigMap...)可以在<code>metadata.namespace</code>指定该资源属于哪一个namespace。</p>
<p>示例:</p>
<pre><code># 定义资源清单
# cat namespace-pod.yaml
# 创建namespace
apiVersion: v1
kind: Namespace
metadata:
    name: sit-pod
---
# 创建Pod
apiVersion: v1
kind: Pod
metadata:
name: namespace-pod
# 指定所属的名称空间
namespace: sit-pod
spec:
containers:
- name: container-nginx
    image: nginx:latest

# 创建namespace和对应的Pod
# kubectl apply -f namespace-pod.yaml
namespace/sit-pod created
pod/namespace-pod created
# 查看namespace
# kubectl get namespace sit-pod
NAME      STATUS   AGE
sit-pod   Active   49s
# 查看sit-pod下的Pod
# kubectl get po -n sit-pod
NAME            READY   STATUS    RESTARTS   AGE
namespace-pod   1/1   Running   0          65s
</code></pre>
<h2 id="查看指定namespace下的k8s资源">查看指定namespace下的K8s资源</h2>
<p>如果不指定namespace时,默认查看的是default空间下对应的资源</p>
<h3 id="查看指定namespace下所有的资源">查看指定namespace下所有的资源</h3>
<p>语法:</p>
<pre><code>kubectl get all -n &lt;namespace-name&gt;
</code></pre>
<h3 id="查看所有namespace下指定的资源">查看所有namespace下指定的资源</h3>
<p>语法:</p>
<pre><code>kubectl get &lt;resource-type&gt; --all-namepsace
# 或者
kubectl get &lt;resource-type&gt; -A
</code></pre>
<h3 id="查看指定namespace下指定的资源">查看指定namespace下指定的资源</h3>
<p>语法:</p>
<pre><code>kubectl get &lt;resource-type&gt; -n &lt;namespace-name&gt;
</code></pre>
<h3 id="总结">总结</h3>
<p>整体来说,在生产环境中查看资源的相关信息时,可以通过<code>-n</code>选项指定对应的namespace</p>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18857796,微信Vac6666666,欢迎交流</p><br><br>
来源:https://www.cnblogs.com/huangSir-devops/p/18857796
頁: [1]
查看完整版本: K8s新手系列之namespace