kubernetes雲原生紀元:徹底理解(k8s)Namespace
作用
Namespace(命名空間 )核心作用 隔離
- 資源對象的隔離:Service Deploymet Pod
- 資源配額的隔離:CPU Memory(內存)
kubernetes 集羣啓動回默認創建一個
default
默認命名空間,如果我們創建的Service、Deploymet 、 Pod 不指定命名空間都會放在這個默認的default
命名空間。
我們查看下:
[root@master-001 ~]# kubectl get namespaces
NAME STATUS AGE
default Active 13d
ingress-nginx Active 13d
kube-node-lease Active 13d
kube-public Active 13d
kube-system Active 13d
查看默認的命名空間下的pod:
[root@master-001 ~]# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
rntibp-deployment-84d77f8f78-f99pp 0/1 CrashLoopBackOff 22 12d
tomcat-demo-5f4b587679-7mpz9 1/1 Running 3 12d
創建自己的Namespace
namespace也是可以通過yml文件創建的
我們先寫一個namespace-dev.yaml文件:
apiVersion: v1
kind: Namespace
metadata:
name: dev
在主節點創建:
[root@master-001 ~]# kubectl apply -f kubenetes-dev.yaml
namespace/dev created
[root@master-001 ~]# kubectl get namespaces
NAME STATUS AGE
default Active 13d
dev Active 13s
ingress-nginx Active 13d
kube-node-lease Active 13d
kube-public Active 13d
kube-system Active 13d
使用Namespace
使用創建的namepase,只需要yaml的在metadata:
下增加namespace: {namepsce名字}
用一個web-demo演示,以下配置信息有 Service、Deploymet、Ingress 每個的都增加了namespace配置。
Web.demo.yaml:
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev
spec:
selector:
matchLabels:
app: web-demo
replicas: 1
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-demo
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-demo
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-demo
namespace: dev
spec:
rules:
- host: web.demo.com
http:
paths:
- path: /
backend:
serviceName: web-demo
servicePort: 80
創建web-demo應用:
[root@master-001 ~]# kubectl apply -f web-demo.yaml
deployment.apps/web-demo created
service/web-demo created
ingress.extensions/web-demo created
查看:
[root@master-001 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
rntibp-deployment-84d77f8f78-f99pp 0/1 CrashLoopBackOff 35 12d
tomcat-demo-5f4b587679-7mpz9 1/1 Running 4 12d
指定命名空間查看,需要加 -n {namespace名字}
,查看dev 下所有的信息
[root@master-001 ~]# kubectl get all -n dev
NAME READY STATUS RESTARTS AGE
pod/web-demo-58cd855cb7-gj5m4 1/1 Running 0 17m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/web-demo ClusterIP 10.105.152.212 <none> 80/TCP 17m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/web-demo 1/1 1 1 17m
NAME DESIRED CURRENT READY AGE
replicaset.apps/web-demo-58cd855cb7 1 1 1 17m
默認 查看只能看到default 命名空間下的東西必須加入
-n
才能查看指定的命名空間下的東西
測試隔離性
同一個命名空間下pod 彼此訪問是可以相通的
tomcat-demo在defult, web-demo在dev
但是如果跨命名空間是不可取的
名字``DNS
都不行
[root@master-001 ~]# kubectl exec -it web-demo-58cd855cb7-gj5m4 -n dev bash
bash-4.4# ping tomcat-demo-5f4b587679-7mpz9
^C## 無法訪問
bash-4.4# cat /etc/resolv.conf
nameserver 10.96.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5
但是不同命名空間下的serviceIP是可以互相訪問的
使用web-demo的pod ping tomcat-demo的serviceIP是通的,serviceIP跟命名空間無關。
[root@master-001 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
rntibp-service ClusterIP 10.109.60.4 <none> 9902/TCP 12d
tomcat-demo ClusterIP 10.111.185.214 <none> 80/TCP 12d
[root@master-001 ~]# kubectl exec -it web-demo-58cd855cb7-gj5m4 -n dev bash
bash-4.4# ping 10.111.185.214
PING 10.111.185.214 (10.111.185.214): 56 data bytes #
64 bytes from 10.111.185.214: seq=0 ttl=64 time=0.073 ms
64 bytes from 10.111.185.214: seq=1 ttl=64 time=0.203 ms
跨命名空間 Pod IP也是可以訪問的:
[root@master-001 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-demo-5f4b587679-7mpz9 1/1 Running 4 12d 192.168.93.101 node-001 <none> <none>
[root@master-001 ~]# kubectl exec -it web-demo-58cd855cb7-gj5m4 -n dev bash
bash-4.4# wget 192.168.93.101:8080
Connecting to 192.168.93.101:8080 (192.168.93.101:8080)
index.html 100% |*****************************************************| 11230 0:00:00 ETA
總結:
namesapace是對名字的隔離,並不是物理的隔離,這樣設計比較靈活讓開發人員有更多的空間。
默認指定命名空間訪問
如果默認指定訪問命名空間需指定上下文
而真正的權限只是讓訪問固定的namespace 需要從一開始設置用戶開始
把默認 查看的default 換成dev
-
修改kubectl 默認上下文配置文件
/root/.kube/config
修改 上下文名字set-context ctx-dev
指定用戶 –user=kubernetes-admin
修改 命名空間名字==–namespace=dev==
[root@master-001 ~]# cp .kube/config .kube/config.backup #備份
[root@master-001 ~]# kubectl config set-context ctx-dev \
--cluster=kubernetes \
--user=kubernetes-admin \
--namespace=dev \
--kubeconfig=/root/.kube/config
- 選擇上下文
[root@master-001 ~]# kubectl config use-context ctx-dev --kubeconfig=/root/.kube/config
- 測試是否只能看dev命名空間下的東西
[root@master-001 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-demo-58cd855cb7-gj5m4 1/1 Running 0 81m
[root@master-001 ~]# kubectl get pods -n defult
No resources found in defult namespace.
只能看到dev 下的而且用-n
參數指定也是不行。