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 参数指定也是不行。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐