Kubernetes:命名空间(namespace 创建、删除,pod中设置namespace,命名空间首选项设置set-context --current --namespace)
参考:https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/namespaces/
一,什么是命名空间?
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 他们可以为您和您的团队提供组织,安全甚至性能方面的帮助!
二,何时使用多个命名空间?
1:命名空间适用于存在很多跨多个团队或项目的用户的场景。
对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间。当需要名称空间提供的功能时,请开始使用它们。
2:命名空间为名称提供了一个范围。
资源的名称需要在命名空间内是唯一的,但不能跨命名空间。命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。
3:命名空间是在多个用户之间划分集群资源的一种方法(通过资源配额)。
4:在 Kubernetes 未来版本中,相同命名空间中的对象默认将具有相同的访问控制策略。
5:不需要使用多个命名空间来分隔轻微不同的资源,例如同一软件的不同版本:使用 labels 来区分同一命名空间中的不同资源。
三,使用命名空间
3.1 查看命名空间
kubectl get namespace
-
NAME STATUS AGE
-
default Active 39m
-
kube- public Active 39m
-
kube-system Active 39m
也可以使用 ns 代替,效果与namespace 一样
kubectl get ns
Kubernetes 会创建三个初始命名空间:
* default
没有指明使用其它命名空间的对象所使用的默认命名空间
* kube-system
Kubernetes 系统创建对象所使用的命名空间
* kube-public
这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。这个命名空间的公共方面只是一种约定,而不是要求。
3.2 创建命名空间
-
kubectl create namespace oopxiajun- test
-
namespace/oopxiajun-ns- test created
当然也可以使用yaml来处理
-
vim kube-ns-test.yaml
-
-
kind: Namespace #类型为Namespace
-
apiVersion: v1 #版本号为v1
-
metadata:
-
name: oopxiajun-ns-test
-
labels:
-
name: label-test-v1
-
kubectl apply -f kube-ns-test.yaml
-
namespace/ oopxiajun- ns- test created
查看命名空间
-
kubectl get namespace
-
-
NAME STATUS AGE
-
default Active 50m
-
kube- public Active 51m
-
kube-system Active 51m
-
oopxiajun-ns-test Active 20s
3.3 pod使用命名空间
在metadata 下面加一个namespace
-
vim first-pod.yml
-
-
apiVersion: v1 #版本号
-
kind: Pod
-
metadata:
-
name: my-first-pod
-
namespace: oopxiajun-ns-test
-
labels:
-
app: bash
-
tir: backend
-
spec:
-
containers:
-
- name: bash-container
-
image: docker.io/busybox
-
command: [ 'sh', '-c', 'echo Hello myFirstPod! && sleep 3600']
-
kubectl create -f first-pod.yml
-
pod/my- first-pod created
-
kubectl get pods -n=oopxiajun-ns-test
-
NAME READY STATUS RESTARTS AGE
-
my-first-pod 1/ 1 Running 0 3m10s
3.4 设置命名空间首选项
当我们需要获得pod 相关信息时,不带命名空间 ,你会发现我们刚刚所构建的pod 查不到。
-
kubectl get pod
-
No resources found in default namespace.
-
-
kubectl get pods
-
No resources found in default namespace.
当前默认的名称空间为default
我们需要设置命名空间首选项
-
kubectl config set- context --current --namespace=oopxiajun-ns-test
-
Context "kubernetes-admin@kubernetes" modified.
-
kubectl get pod
-
NAME READY STATUS RESTARTS AGE
-
my-first-pod 1/ 1 Running 0 34m
3.5 并非所有对象都在命名空间中
大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些命名空间中。但是命名空间资源本身并不在命名空间中。而且底层资源,例如 nodes 和持久化卷不属于任何命名空间。
查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中:
-
# 在命名空间中的资源
-
kubectl api-resources --namespaced= true
-
-
# 部在命名空间中的资源
-
kubectl api-resources --namespaced= false
-
kubectl api-resources --namespaced= true
-
-
NAME SHORTNAMES APIGROUP NAMESPACED KIND
-
bindings true Binding
-
configmaps cm true ConfigMap
-
endpoints ep true Endpoints
-
events ev true Event
-
limitranges limits true LimitRange
-
persistentvolumeclaims pvc true PersistentVolumeClaim
-
pods po true Pod
-
podtemplates true PodTemplate
-
replicationcontrollers rc true ReplicationController
-
resourcequotas quota true ResourceQuota
-
secrets true Secret
-
serviceaccounts sa true ServiceAccount
-
services svc true Service
-
controllerrevisions apps true ControllerRevision
-
daemonsets ds apps true DaemonSet
-
deployments deploy apps true Deployment
-
replicasets rs apps true ReplicaSet
-
statefulsets sts apps true StatefulSet
-
localsubjectaccessreviews authorization.k8s.io true LocalSubjectAccessReview
-
horizontalpodautoscalers hpa autoscaling true HorizontalPodAutoscaler
-
cronjobs cj batch true CronJob
-
jobs batch true Job
-
leases coordination.k8s.io true Lease
-
endpointslices discovery.k8s.io true EndpointSlice
-
events ev events.k8s.io true Event
-
ingresses ing extensions true Ingress
-
ingresses ing networking.k8s.io true Ingress
-
networkpolicies netpol networking.k8s.io true NetworkPolicy
-
poddisruptionbudgets pdb policy true PodDisruptionBudget
-
rolebindings rbac.authorization.k8s.io true RoleBinding
-
roles rbac.authorization.k8s.io true Role
-
ubectl api-resources --namespaced= false
-
NAME SHORTNAMES APIGROUP NAMESPACED KIND
-
componentstatuses cs false ComponentStatus
-
namespaces ns false Namespace
-
nodes no false Node
-
persistentvolumes pv false PersistentVolume
-
mutatingwebhookconfigurations admissionregistration.k8s.io false MutatingWebhookConfiguration
-
validatingwebhookconfigurations admissionregistration.k8s.io false ValidatingWebhookConfiguration
-
customresourcedefinitions crd,crds apiextensions.k8s.io false CustomResourceDefinition
-
apiservices apiregistration.k8s.io false APIService
-
tokenreviews authentication.k8s.io false TokenReview
-
selfsubjectaccessreviews authorization.k8s.io false SelfSubjectAccessReview
-
selfsubjectrulesreviews authorization.k8s.io false SelfSubjectRulesReview
-
subjectaccessreviews authorization.k8s.io false SubjectAccessReview
-
certificatesigningrequests csr certificates.k8s.io false CertificateSigningRequest
-
ingressclasses networking.k8s.io false IngressClass
-
runtimeclasses node.k8s.io false RuntimeClass
-
podsecuritypolicies psp policy false PodSecurityPolicy
-
clusterrolebindings rbac.authorization.k8s.io false ClusterRoleBinding
-
clusterroles rbac.authorization.k8s.io false ClusterRole
-
priorityclasses pc scheduling.k8s.io false PriorityClass
-
csidrivers storage.k8s.io false CSIDriver
-
csinodes storage.k8s.io false CSINode
-
storageclasses sc storage.k8s.io false StorageClass
-
volumeattachments storage.k8s.io false VolumeAttachment
3.6 删除名称空间
-
kubectl delete namespaces oopxiajun-ns- test
-
namespace "oopxiajun-ns-test" deleted
再次get pod,已经拿不到pod了(etcd中的源数据已经被删除了,我们的my-first-pod这个pod已经被测底干掉了)
-
kubectl get pod
-
No resources found in oopxiajun-ns-test namespace.
我们需要将命名空间设置回default
-
kubectl config set-context --current -- namespace= default
-
Context "kubernetes-admin@kubernetes" modified.