介紹
1、k8s 中的命名空間與容器(或pod)中的命名空間是不一樣的,k8s 中的命名空間指的是提供了一個作用域,而后者是linux內核提供的命名空間(主機名、網絡、文件系統、進程等各個維度),所謂的作用域,例如通過建立service 訪問pod 時,如果service 的命名空間不指定正確,那么就無法通過標簽關聯到pod 。其他資源也是如此。
2、與標簽選擇器相比,標簽選擇器把資源分組后各組之間資源可以有重疊,命名空間不可以重疊,命名空間具有隔離資源的效果,不同命名空間的同名資源是不同的東西。
3、所謂的隔離指的是在作用域的作用下任何對資源的操作都是在某一個命名空間下的,而不是針對於全局。例如對命名空間層面的資源進行增上改查的時候需要指定命名空間,否則無法找到資源。
4、命名空間不會隔離不同空間下的Pod 之間的網絡通訊,除非針對命名空間加了相應的安全策略。
命名空間的使用需求
1、在使用多個namespace 的前提下,我們可以將包含大量組件的復雜系統拆分為更小的不同組,這些不同組也可以用於在多租戶環境中分配資源,將資源分配為生產、開發和 環境,或者以其他任何你需要的方式分配資源。
2、資源名稱只需在命名空間內保持唯一即可,因此兩個不同的命名空間可以包含同名的資源。雖然大多數類型的資源都與命名空間相關(pod,service,ingress),但仍有一些與它無關,其中之一便是全局且未被約束於單一命名空間的節點資源。
3、namespace 使我們能夠將不屬於一組的資源分到不重疊的組中。如果有多個用戶或用戶組正在使用同Kubernetes集群,並且它們都各自管理自己獨特的資源集合,那么它們就應該分別使用各自的命名空間這樣,它們就不用特別擔無意中修改或刪除其他用戶的資源,也無須關心名稱沖突。
4、除了隔離資源,命名空間還可用於僅允許某些用戶訪問某些特定資源,甚至限制單個用戶可用的計算資源數量
相關操作
列出所有命名空間
kubectl get ns
列出命名空間下的資源(pod,service,ingress)
kubectl get pods --namespace或-n kube-system #如果不指定命名空間,默認就是在default 命名空間內操作,包括其他更改資源的操作,都需要只能命名空間,否則都是在默認命名空間default 下的操作
創建命名空間
方式一
vi ns.yaml
apiVersion vl kind : Namespace metadata : name: custom-namespace #這是命名空間的名稱
kubectl create -f ns.yaml
方式二
kubectl create namespace custom-namespace
Tips: 命名空間名字和另外幾個不允許包含點號
在已創建的命名空間中創建資源
kubectl create -f kubia-manual.yaml -n custom-namespace
默認命名空間與當前上下文
在列出描述、修改或刪除其他命名空間中的對象時需要給 kubectl 命令傳遞-- name space (或 -n) 選項如果不指定命名空間,kubect 將在當前上下文中配置的默認命名空間中執行操作 。而當前上下文的命名空間和當前上下文本身都可以通過 kubectl config命令進行更改
命名空間提供的隔離
解釋一下命名空間不提供什么一一至少不是開箱即用的 。盡管命名空 將對象分隔到不同的組,只 許你對屬於特定命名空間的對象進行操作但實際上命名空間之間並不提供對正在運行的對象的任何隔離
例如,你可能會認為當不同的用戶在不同的命名空間中部署pod時,這些pod應該彼 隔離,並且無法通信,但事實卻並非如此。命名空間之間是否提供網絡隔離取決於 Kubemetes 所使用的網絡解決方案。當該解決方案不提供命名空間間的網絡隔離時-,如果命名空間中的某個pod知道命名空間 bar po IP 地址,那它就可以將流量( 例如 HTT 請求)發送到另一 pod