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

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

资源清单 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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
16天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
86 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
1月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
1月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
53 3
|
2月前
|
Cloud Native 持续交付 云计算
云原生架构的演进与挑战
随着云计算技术的不断发展,云原生架构已成为企业数字化转型的重要支撑。本文深入探讨了云原生架构的概念、发展历程、核心技术以及面临的挑战,旨在为读者提供一个全面了解云原生架构的视角。通过分析Kubernetes、Docker等关键技术的应用,以及微服务、持续集成/持续部署(CI/CD)等实践案例,本文揭示了云原生架构在提高应用开发效率、降低运维成本、增强系统可扩展性等方面的显著优势。同时,也指出了云原生架构在安全性、复杂性管理等方面所面临的挑战,并提出了相应的解决策略。
|
1月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####