前言
环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6
什么是namespace
namespace是kubernetes系统中的一种非常重要的资源,namespace的主要作用是用来实现多套环境的资源隔离,或者说是多租户的资源隔离。
默认情况下,k8s集群中所有pod都是可以相互访问的,但在实际环境中,可能不想让两个pod之间相互访问,那此时就可以将两个pod划分到不同的namespace下。k8s通过将集群内部的资源分配到不同的namespace中,可以形成逻辑上的隔离,以方便不同的资源进行隔离使用和管理。不同的命名空间可以存在同名的资源,命名空间为资源提供了一个作用域。
可以通过k8s的授权机制,将不同的namespace交给不同的租户进行管理,这样就实现了多租户的资源隔离,还可以结合k8s的资源配额机制,限定不同的租户能占用的资源,例如CPU使用量、内存使用量等等来实现租户可用资源的管理。
查看k8s系统中的namespace
namespace可以简写为ns,k8s创建之初默认会创建好几个namespace,下面查看k8s中的namespace:
[root@master ~]# kubectl get namespace #查看所有命名空间,namespace可以写成ns,即 kubectl get ns
NAME STATUS AGE
default ACTIVE 45h #所以未指定namespace的对象都被分配到default命名空间
kube-node-lease ACTIVE 45h #集群之间的心跳维护
kube-puble ACTIVE 45h #此命名空间下的所有资源可以被任何人访问,包含未认证用户
kube-system ACTIVE 45h #所有由k8s系统创建的资源都处于该命名空间
[root@master ~]# kubectl get namespace default #查看指定命名空间
创建资源对象时不指定命名空间,默认是当前上下文中指定的命名空间,k8s安装完成时默认的上下文中定义的命名空间就是default命名空间。所有,具体哪个是默认命名空间还得看当前上下文中定义的空间空间。
创建namespace
1、使用命令创建命名空间
kubectl create namespace dev
2、编写yaml文件创建命名空间
cat << 'EOF' | kubectl create -f -
apiVersion: v1
kind: Namespace
metadata:
name: dev
EOF
删除namespace
#删除dev命名空间,主要会删除该命名空间下的所有资源
kubectl delete namespace dev
#也可以通过指定yaml文件删除dev命名空间
kubectl delete -f dev_namespace.yaml
# 或者
cat << 'EOF' | kubectl delete -f -
apiVersion: v1
kind: Namespace
metadata:
name: dev
EOF
查询资源时使用-n参数指定命名空间
查看某个资源时需要指定命名空间,否则默认在default命名空间查找。
#指定命名空间查找资源
kubectl get cronjob,pods -n kube-system
#在全部命名空间查找资源
kubectl get cronjob,pods --all-namespaces
kubectl get cronjob,pods -A
删除命名空间namespace卡主,一直Terminating
# mysql-ha命名空间一直处于Terminating
[root@dev-master xenon]# kubectl get ns mysql-ha
NAME STATUS AGE
mysql-ha Terminating 125m
# 解决办法
kubectl get ns mysql-ha -o json > mysql-ha-namespace.json
vim mysql-ha-namespace.json
# 搜索finalizers找到下面这段
"spec": {
"finalizers": [
"kubernetes" # 删除这句
]
},
# 删除后就是
"spec": {
"finalizers": [
]
},
#开始一个代理
kubectl proxy --port=8888
# 另外启动一个终端执行,http段注意修改端口和命名空间
curl -k -H "Content-Type: application/json" -X PUT \
--data-binary @mysql-ha-namespace.json \
http://127.0.0.1:8888/api/v1/namespaces/mysql-ha/finalize
总结
namespace可以实现资源的逻辑隔离,namespace简写为ns。
#查看所有命名空间
kubectl get namespace
#查看所有命名空间
kubectl get ns
#命令创建一个dev命名空间
kubectl create namespace dev
#编写资源清单yaml文件创建一个命名空间
cat>> dev_namespace.yaml <<'EOF'
apiVersion: v1
kind: NameSpace
metadata:
name: dev
EOF
#应用上面的资源清单
kubectl apply -f dev_namespace.yaml
#删除dev命名空间,dev下的所有资源都会被删除
kubectl delete namespace dev
#通过资源清单文件来删除dev命名空间
kubectl delete -f dev_namespace.yaml
#指定命名空间查找资源
kubectl get cronjob,pods -n kube-system
#在全部命名空间查找资源
kubectl get cronjob,pods --all-namespaces
kubectl get cronjob,pods -A