kubernetes雲原生紀元:徹底理解(k8s)Namespace

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

  1. 修改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
  1. 選擇上下文
[root@master-001 ~]# kubectl	config use-context ctx-dev --kubeconfig=/root/.kube/config
  1. 測試是否只能看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 參數指定也是不行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章