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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 下面就是一个简单的使用资源清单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搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
23 2
|
5天前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
23 1
|
9天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
10天前
|
存储 运维 Kubernetes
云原生之旅:Kubernetes的弹性与可扩展性探索
【10月更文挑战第32天】在云计算的浪潮中,云原生技术以其独特的魅力成为开发者的新宠。本文将深入探讨Kubernetes如何通过其弹性和可扩展性,助力应用在复杂环境中稳健运行。我们将从基础架构出发,逐步揭示Kubernetes集群管理、服务发现、存储机制及自动扩缩容等核心功能,旨在为读者呈现一个全景式的云原生平台视图。
23 1
|
15天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
47 4
|
3天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
14天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
6天前
|
消息中间件 存储 Cloud Native
云原生架构下的数据一致性挑战与应对策略####
本文探讨了在云原生环境中,面对微服务架构的广泛应用,数据一致性问题成为系统设计的核心挑战之一。通过分析云原生环境的特点,阐述了数据不一致性的常见场景及其对业务的影响,并深入讨论了解决这些问题的策略,包括采用分布式事务、事件驱动架构、补偿机制以及利用云平台提供的托管服务等。文章旨在为开发者提供一套系统性的解决方案框架,以应对在动态、分布式的云原生应用中保持数据一致性的复杂性。 ####
|
3天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
20 5