Kubernetes的名称空间03.md
1、概念
kubernetes集群提供对内部资源进行"软隔离"的机制,以方便用户管理和组织集群资源

kubernetes创建后,自带默认的几个名称空间,分别是:
1、default
2、kube-system
3、kube-public
4、kube-node-lease
kubectl get namespaces
kubectl get ns
kubectl get ns default -o yaml
两层级别,不允许嵌套:
有些资源直接创建在集群里,不能创建在nameaspaces里
有些资源创建在namespaces,不能直接创建在集群里
namespaces本身也是资源就是直接创建在集群里的,不能创建在namespaces下
kubectl api-resources

👆上图中NAMESPACED,true就表示只能创建在namespace下的,不能直接创建在集群里。必须指定namespace,不指也有一个default namespace。
false就是必须直接创建在集群里,不能创建在namespace下,指了也没用,不会隶属于namespace。
delete create get 不指定 -n 就是默认的default namesapce
kube-system是至关重要的一个namespace,一般不用动它,很多集群自身组件及系统组件都在里面。
kube-public一般用不到,空置状态,一般都是default
kube-node-lease,①分布式锁控制平面HA,其中有两个组件(controller-manager和scheduler)是通过抢占分布式锁对的方式来选出谁是mater的。这两个组件就会创建到这个namespaces下。②租约这个namespace主要是放节点租约的。

比如三个controller-manager在这个namespace下,该namespace下就会生成一个锁,三个谁抢到谁是领导,抢那个资源就是节点租约资源
控制平面管理各个节点,怎么知道节点挂了?节点会周期在节点同名的节点租约namespace下更新老化时间之类的东西。
root@k8s-master01:~# kubectl get leases -n kube-node-lease
NAME HOLDER AGE
k8s-master01 k8s-master01 4d19h
k8s-master02 k8s-master02 4d18h
k8s-master03 k8s-master03 4d18h
k8s-node01 k8s-node01 4d18h
k8s-node02 k8s-node02 4d18h
k8s-node03 k8s-node03 4d18h
所有系统级的namespaces均不能进行删除操作;除了default外,其他三个也不应该用作业务应用的部署。
root@k8s-master01:~# kubectl create namespace demo --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
spec: {}
status: {}
# 说明:因为namespace不用spec和status,这些多余的信息都可以删掉
# 创建一个准生产/预发环境
root@k8s-master01:~# kubectl create namespace demo --dry-run=client -o yaml > namespace-demo.yaml
root@k8s-master01:~# vim namespace-demo.yaml
root@k8s-master01:~# cat namespace-demo.yaml
apiVersion: v1
kind: Namespace
metadata:
name: stage
labels:
enviorment: stage
root@k8s-master01:~#
#在stage这个namespace下创建nginx-demo这个pod,注意同名的pod在default下也有3个👇
root@k8s-master01:~# kubectl create deployment nginx-demo --image=nginx:alpine -n stage
deployment.apps/nginx-demo created
root@k8s-master01:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-79f8849978-z2q4p 1/1 Running 0 3d
nginx-demo-6dbf7cbd6f-4qztw 1/1 Running 0 3d17h
nginx-demo-6dbf7cbd6f-66d94 1/1 Running 0 3d17h
nginx-demo-6dbf7cbd6f-v8jsv 1/1 Running 0 3d17h
whoami-7fd8895794-6szhw 1/1 Running 0 2d20h
whoami-7fd8895794-dhk6k 1/1 Running 0 2d20h
root@k8s-master01:~# kubectl get pods -n stage
NAME READY STATUS RESTARTS AGE
nginx-demo-6dbf7cbd6f-cxq7p 1/1 Running 0 23s
root@k8s-master01:~#
删除namespace会一并删除其下所有资源,及其危险!
使用名称空间的场景
环境管理
在同一Kubernetes集群上隔离研发、预发和生产等环境。
隔离
多个团队的不同产品线需要部署在同一个kubernetes上。
资源控制
类似vsphere的资源组,作为资源配额的承载单位,从而限制其内部所有应用使用CPU/Memory/PV等资源总和。
在产品线或团队等隔离目标上分配各自总体使用的资源配额。
权限控制
基于RBAC鉴权体系,在名称空间级别仅限权限配置。
提高集群性能
进行资源搜索时,名称空间有利于Kubernetes API缩小查找范围,从而提高搜索效率。
scale只支持对工作负载型控制器做scale,涉及:deployment, replicaset, or statefulset
root@k8s-master01:~# kubectl scale -h
Set a new size for a deployment, replica set, replication controller, or stateful set.
Scale also allows users to specify one or more preconditions for the scale action.
# 👆scale只支持对工作负载型控制器做scale,replication controller不用了
kubectl scale --replicas=5 tc/foo rc/bar rc/baz # 针对多个进行scale
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 当前是2个的时候才会扩成3个,当前不是2个,不改变。