【云原生 | 从零开始学Kubernetes】七、资源清单与Namespace

该篇文章已经被专栏《从零开始学k8s》收录

在这里插入图片描述


资源清单 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.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  namespace: default
spec:
  containers:
  - name:  tomcat-first
    ports:
    - containerPort: 8080
    image: tomcat
    imagePullPolicy: IfNotPresent

更新资源清单,查看pod

[root@k8smaster ~]# kubectl apply -f pod-first.yaml 
 
[root@k8smaster ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
pod-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 namespace
NAME              STATUS   AGE
default           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 ns
NAME              STATUS   AGE
default           Active   8d
kube-node-lease   Active   8d
kube-public       Active   8d
kube-system       Active   8d  

# 2 查看指定的ns   命令:kubectl get ns ns名称
[root@k8smaster ~]# kubectl get ns default
NAME      STATUS   AGE
default   Active   8d

# 3 指定输出格式  命令:kubectl get ns ns名称  -o 格式参数
# kubernetes支持的格式有很多,比较常见的是wide、json、yaml
[root@k8smaster ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  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-1c96445a6278
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
  
# 4 查看ns详情  命令:kubectl describe ns ns名称
[root@k8smaster ~]# kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active  # Active 命名空间正在使用中  Terminating 正在删除命名空间

# ResourceQuota 针对namespace做的资源限制
# LimitRange针对namespace中的每个组件做的资源限制
No resource quota.
No LimitRange resource.

配置方式

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

apiVersion: v1
kind: Namespace
metadata:
  name: pp

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

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

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

写在最后

创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在评论区指出,我会及时更改!
目前正在更新的系列:从零开始学k8s
感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~

在这里插入图片描述

相关文章

文章浏览阅读942次。kube-controller-manager 和 kubelet 是...
文章浏览阅读3.8k次。上篇文章详细介绍了弹性云混部的落地历...
文章浏览阅读897次。对于cpu来说,这种分配方式并不会有太大...
文章浏览阅读796次,点赞17次,收藏15次。只要在Service定义...
文章浏览阅读763次。但是此时如果配置成 NONE, 租户创建成功...
文章浏览阅读2.7k次,点赞2次,收藏13次。公司使用的是交老的...