kubernetes云原生纪元:彻底理解(k8s)Namespace
彻底理解(k8s)Namespace文章目录彻底理解(k8s)Namespace作用创建自己的Namespace使用Namespace测试隔离性默认指定命名空间访问作用Namespace(命名空间 )核心作用 隔离资源对象的隔离:ServiceDeploymet Pod资源配额的隔离:CPU Memory(内存)kubernetes 集群启动回默认创建一个default默认命...
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
参数指定也是不行。
更多推荐
所有评论(0)