写点什么

【云原生 | 从零开始学 Kubernetes】七、Kubernetes 的命名空间

作者:泡泡
  • 2022 年 9 月 24 日
    河北
  • 本文字数:4504 字

    阅读完需:约 15 分钟

【云原生 | 从零开始学Kubernetes】七、Kubernetes的命名空间

资源清单 YAML 文件书写技巧

下面就是一个简单的使用资源清单 yaml 创建 pod 的实例,先简单的看一下 yaml 里需要什么东西,我们再去深入学习!


[root@k8smaster ~]# vim pod-tomcat.yaml apiVersion: v1   #api 版本 kind: Pod   #创建的资源 metadata:   name: tomcat-test #Pod 的名字   namespace: default #Pod 所在的名称空间   labels:     app: tomcat #Pod 具有的标签 spec:   #资源清单 拉启容器  containers:   - name: tomcat-java #Pod 里容器的名字     ports:   - containerPort: 8080 #容器暴露的端口   image: tomcat #容器使用的镜像   imagePullPolicy: IfNotPresent #镜像拉取策略   #更新资源清单文件 [root@k8smaster ~]# kubectl apply -f pod-tomcat.yaml
复制代码


如果想要查看 pod 怎么去定义,可以去看字段里的链接(官方文档)


[root@k8smaster ~]# kubectl explain pod 
DESCRIPTION: Pod[Pod 是可以在主机上运行的容器的集合。此资源是由客户端创建并安排到主机上。]
FIELDS: apiVersion <string> [APIVersion 定义了对象,代表了一个版本。]
kind <string> [Kind 是字符串类型的值,代表了要创建的资源。服务器可以从客户端提交的请求推断出这个资源。]
metadata <Object> [metadata 是对象,定义元数据属性信息的]
spec <Object> [spec 制定了定义 Pod 的规格,里面包含容器的信息]
status <Object> [status 表示状态,这个不可以修改,定义 pod 的时候也不需要定义这个字段]
复制代码

查看 pod.metadata 字段如何定义

这里就只展示一个的查看方法,可以自己尝试一下去查看各种字段下的各种信息,不然篇幅太长!


[root@k8smaster ~]# kubectl explain pod.metadata KIND: Pod VERSION: v1 
RESOURCE: metadata <Object> # metadata 是对象<Object>,下面可以有多个字段
FIELDS: annotations <map[string]string> Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations # annotations 是注解,map 类型表示对应的值是 key-value 键值对,<string,string>表示 key 和value 都是 String 类型的 "metadata": { "annotations": { "key1" : "value1", "key2" : "value2" }}用 Annotation 来记录的信息包括: build 信息、release 信息、Docker 镜像信息等,例如时间戳、release id 号、镜像 hash 值、docker registry 地址等; 日志库、监控库、分析库等资源库的地址信息; 程序调试工具信息,例如工具名称、版本号等; 团队的联系信息,例如电话号码、负责人名称、网址等。
clusterName <string> The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request. #对象所属群集的名称。这是用来区分不同集群中具有相同名称和命名空间的资源。此字段现在未设置在任何位置,apiserver 将忽略它,如果设置了就使用设置的值
creationTimestamp <string> deletionGracePeriodSeconds <integer> deletionTimestamp <string> finalizers <[]string> generateName <string> generation <integer> labels <map[string]string> #创建的资源具有的标签 Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels #labels 是标签,labels 是 map 类型,map 类型表示对应的值是 key-value 键值对<string,string>表示 key 和 value 都是 String 类型的 managedFields <[]Object> name <string> #创建的资源的名字 namespace <string> #创建的资源所属的名称空间 Namespace defines the space within which each name must be unique. An empty namespace is equivalent to the "default" namespace, but "default" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces # namespaces 划分了一个空间,在同一个 namesace 下的资源名字是唯一的,默认的名称空间是default。
ownerReferences <[]Object> resourceVersion <string> selfLink <string> uid <string>
复制代码

通过资源清单文件创建第一个 Pod

在 node1 和 node2 节点上使用 docker 下载 tomcat!

创建 yaml 文件

[root@k8smaster ~]# vim pod-first.yamlapiVersion: v1kind: Podmetadata:  name: pod-first  namespace: defaultspec:  containers:  - name:  tomcat-first    ports:    - containerPort: 8080    image: tomcat    imagePullPolicy: IfNotPresent
复制代码

更新资源清单,查看 pod

[root@k8smaster ~]# kubectl apply -f pod-first.yaml  [root@k8smaster ~]# kubectl get podsNAME                          READY   STATUS    RESTARTS   AGEpod-first                     1/1     Running   0          6s       
复制代码

查看命名空间以及进入容器内部

#查看指定命名空间kubectl get pods -n kube-system
#查看 pod 日志 动态的 去掉f就不是了kubectl logs -f pod-first #查看 pod 里指定容器的日志 kubectl logs pod-first -c tomcat-first #进入到刚才创建的 pod,刚才创建的 pod 名字是 web kubectl exec -it pod-first -- /bin/bash #假如 pod 里有多个容器,进入到 pod 里的指定容器,按如下命令:kubectl exec -it pod-first -c tomcat-first -- /bin/bash
复制代码


我们上面创建的 pod 是一个自主式 pod,也就是通过 pod 创建一个应用程序,如果 pod 出现故障停掉,那么我们通过 pod 部署的应用也就会停掉,不安全, 还有一种控制器管理的 pod,通过控制器创建 pod,可以对 pod 的生命周期做管理,可以定义 pod 的副本数,如果有一个 pod 意外停掉,那么会自动起来一个 pod 替代之前的 pod。

通过 kubectl run 也可以创建 pod

bectl run tomcat01 --image=tomcat --image-pull-policy='IfNotPresent' --port=8080 
复制代码

命名空间

什么是命名空间?

Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。 命名空间 namespace 是 k8s 集群级别的资源,可以给不同的用户、租户、环境或项目创建对应的命 名空间,例如,可以为 test、devlopment、production 环境分别创建各自的命名空间。


Namespace 是 kubernetes 系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。


默认情况下,kubernetes 集群中的所有的 Pod 都是可以相互访问的。但是在实际中,可能不想让两个 Pod 之间进行互相的访问,那此时就可以将两个 Pod 划分到不同的 namespace 下。


kubernetes 通过将集群内部的资源分配到不同的 Namespace 中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。


可以通过 kubernetes 的授权机制,将不同的 namespace 交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合 kubernetes 的资源配额机制,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等等,来实现租户可用资源的管理。


kubernetes 在集群启动之后,会默认创建几个 namespace


[root@k8smaster ~]# kubectl get namespaceNAME              STATUS   AGEdefault           Active   8d     #  所有未指定Namespace的对象都会被分配在default命名空间kube-node-lease   Active   8d     #  集群节点之间的心跳维护,v1.13开始引入kube-public       Active   8d     #  此命名空间下的资源可以被所有人访问(包括未认证用户)kube-system       Active   8d     #  所有由Kubernetes系统创建的资源都处于这个命名空间
复制代码

namespace 应用场景

命名空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间。


1、查看名称空间及其资源对象


k8s 集群默认提供了几个名称空间用于特定目的,例如,kube-system 主要用于运行系统级资源, 存放 k8s 一些组件的。而 default 则为那些未指定名称空间的资源操作提供一个默认值。


使用 kubectl get namespace 可以查看 namespace 资源,使用 kubectl describe namespace $NAME 可以查看特定的名称空间的详细信息。


2、管理 namespace 资源


namespace 资源属性较少,通常只需要指定名称即可创建,如“kubectl create namespace pp”。


namespace 资源的名称仅能由字母、数字、下划线、连接线等字符组成。删除 namespace 资 源会级联删除其包含的所有其他资源对象。


下面来看 namespace 资源的具体操作:

查看

# 1 查看所有的命名空间  命令:kubectl get ns[root@k8smaster ~]# kubectl get nsNAME              STATUS   AGEdefault           Active   8dkube-node-lease   Active   8dkube-public       Active   8dkube-system       Active   8d  
# 2 查看指定的ns 命令:kubectl get ns ns名称[root@k8smaster ~]# kubectl get ns defaultNAME STATUS AGEdefault Active 8d
# 3 指定输出格式 命令:kubectl get ns ns名称 -o 格式参数# kubernetes支持的格式有很多,比较常见的是wide、json、yaml[root@k8smaster ~]# kubectl get ns default -o yamlapiVersion: v1kind: Namespacemetadata: creationTimestamp: "2022-06-26T07:48:15Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:status: f:phase: {} manager: kube-apiserver operation: Update time: "2022-06-26T07:48:15Z" name: default resourceVersion: "159" selfLink: /api/v1/namespaces/default uid: 219e17f2-9c45-4556-a857-1c96445a6278spec: finalizers: - kubernetesstatus: phase: Active # 4 查看ns详情 命令:kubectl describe ns ns名称[root@k8smaster ~]# kubectl describe ns defaultName: defaultLabels: <none>Annotations: <none>Status: Active # Active 命名空间正在使用中 Terminating 正在删除命名空间
# ResourceQuota 针对namespace做的资源限制# LimitRange针对namespace中的每个组件做的资源限制No resource quota.No LimitRange resource.
复制代码

配置方式

首先准备一个 yaml 文件:ns-pp.yml


apiVersion: v1kind: Namespacemetadata:  name: pp
复制代码


然后就可以执行对应的创建和删除命令了:


创建:kubectl create -f ns-pp.yml


删除:kubectl delete -f ns-pp.yml

发布于: 刚刚阅读数: 3
用户头像

泡泡

关注

做最好的知识分享 云计算/云原生 2022.08.25 加入

CSDN万粉博主

评论

发布
暂无评论
【云原生 | 从零开始学Kubernetes】七、Kubernetes的命名空间_Docker_泡泡_InfoQ写作社区