ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

备考CKA,kubernetes管理员第二天。理解、使用Kubernetes对象。

2021-11-09 12:03:44  阅读:155  来源: 互联网

标签:kubectl CKA Kubernetes kubernetes 对象 namespace nginx 空间 k8s


理解Kubernetes对象。

什么是Kubernetes对象?

文章目录

在 Kubernetes 系统中,Kubernetes 对象 是持久化的实体。 Kubernetes 使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息:

  • 哪些容器化应用在运行(以及在哪些节点上)
  • 可以被应用使用的资源
  • 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略

以上是官方所给的理解。以下是我的理解:k8s的对象是“目标性的记录”(一般在.yaml文件中表示,之后被编译成josn):一但创建了k8s的对象,就相当于告知k8s系统我想要实现什么样的期望,所期望的集群是什么样的,这也就是kuernetes集群的期望状态。

对象约束(spec)和状态(status)

  1. 几乎每个kubernetes对象都拥有spec和status;
    • 对于spec 用来描述 对象的的内容,以及描述你希望对象拥有的特征:期待状态!
    • 对于status用来描述对象的当前状态!

我们通过官方的对象描述文件来举例描述对象

当我们创建k8s对象时,我们必须提供对象约束spec,用来描述对象的期待状态,以及一些基本信息(name images ns ···)而后则调用k8s API直接创建或者使用kube命令行kubectl。

application/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

创建:

kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
# 输出
deployment.apps/nginx-deployment created

在描述对象yaml’中的必要字段:

apiserver - 创建该对象使用的apiserver版本,必须且创建后不可更改。
kind - 创建的对象类别。必须且创建后不可更改
metadata - 帮助唯一性标识对象的一些数据、也是etcd所存储的数据、同时各个组件向apis请求返回的也是元数据。包括name uid namespace···
spec - 你所期望的对象状态 。spec拥有很多字段,在文章后面会讲。

k8s的对象管理;

指令式命令:

例子:
建立deployment对象来运行nginx实例。

#创建
kubectl create deployment nginx --image nginx
#删除
kubectl delete pod nginx

指令式配置:

在指令式对象配置中,kubectl 命令指定操作(创建,替换等),可选标志和 至少一个文件名。指定的文件必须包含 YAML 或 JSON 格式的对象的完整定义。

#创建yaml配置定义的对象实例
kubectl create -f nginx.yaml
#删除配置中的对象实例
kubectl delete -f nginx.yaml
#通过覆盖活动来更新配置中的实例对象
kubectl replace -f nginx.yaml

权衡

命令式优缺点:
优点:

  • 命令简单易学
  • 命令仅需一步即可配置实例
    缺点:
  • 只能查看实时内容,不能追随历史源
  • 不便审计,维护
  • 不便集成

配置式优缺点:
优点:

  • 可以将需要追随的源存在源仓库中,例如Git
  • 便于查看流程和历史源审计
  • 提供了供新对象使用的模板

缺点:

  • 需要格外编写yaml文档
  • 需要对整个对象的架构有一定了解。

命名空间namespace

在上一篇文章中我们知道 对于k8s是由多个物理集群组成的。而命名空间则是k8s定义的虚拟机群,k8s可以拥有多个虚拟机群,虚拟机群互相隔离。

命名空间的使用场景

对于只有几个到几十个。当业务量出现重复和庞大的场景则命名空间就是一个非常好的存在,命名空间中的资源名字是唯一的,

使用命名空间

需要注意的是,一般禁止使用kube-作为命名空间名称的开头,因为kube-是系统命名空间的声明。
展示命名空间的常用操作:

# 查看展示命名空间
kubectl get namespace
NAME          STATUS    AGE
default       Active    1d
kube-node-lease   Active   1d
kube-system   Active    1d
kube-public   Active    1d
#系统初始定义了四个命名空间
default 没有指明使用其它名字空间的对象所使用的默认名字空间
kube-system Kubernetes 系统创建对象所使用的名字空间
kube-public 这个名字空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。 这个名字空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。 这个名字空间的公共方面只是一种约定,而不是要求。
kube-node-lease 此名字空间用于与各个节点相关的 租约(Lease)对象。 节点租期允许 kubelet 发送心跳,由此控制面能够检测到节点故障。
#为当前请求设置命名空间
kubectl run nginx --image=nginx --namespace=<名字空间名称>
kubectl get pods --namespace=<名字空间名称>
#创建命名空间
kubectl create namespace myns
#删除命名空间
kubectl delete namespace myns
#设置命名空间偏好
kubectl config set-context --current --namespace=<名字空间名称>
# 验证之
kubectl config view | grep namespace:

需要我们知道的是,并非所有的对象都存在于命名空间中,这表现在命名空间本身就是‘资源’,而有些内容不适存在资源中。

在我的理解中,k8s是以声明资源为对象的方式管控,也就是说意义上,无论是节点还是各组件都是我们需要认知的资源对象,资源对象又分为上层资源(例如 Pod、Service、副本控制器等)大多数资源都是上层资源,且位于namespace中,而下层资源(例如,节点和持久化卷pvc不属于namespace)。
恰恰namespace的意义就是管控资源对象的区域性。

# 位于名字空间中的资源
kubectl api-resources --namespaced=true

# 不在名字空间中的资源
kubectl api-resources --namespaced=false

标签labels

标签是附加到k8s对象(例如pod)上的键值对,意在向用户提供由于的标识属性。标签可以在创建对象时添加,之后也可以创建删除改写,每个键值对对于给定的对象是唯一的。

"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

注解annotations

你可以添加k8s对象的任意注解,通过元数据添加到对象中。注解与标签相反在,注解不愿意让用户看到,意指面向开发人员,用来连接客户端程序时的信息(例如:库和工具类)。
注解和标签一样是k-v结构的键值对,可以是结构化也可以是非结构化,

"metadata": {
  "annotations": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

终止器Finalizer

Finalizer是golang垃圾收集的体现,finalizer是带有命名空间的键,高数k8s满足一定条件后删除对象。
流程:当你告诉k8s删除一个指定finalizer的对象时,k8s api会立即标注该对象为删除,随之进入只读状态,其他平面控制器会采取finalizer指定的行动,目标对象为终止状态(terminating),所有行动执行完后,控制器会删除目标对象的finalizer,当元数据中metadate.finalizers 字段为空时,k8s才会认为完全删除。
你可以定义一个finalizers来设定收集垃圾,当你删除目标资源时会先情理相关资源或设施。finalizers并不执行代码,更类似于注解。

如想深入了解finalizer可前往kubernetes.io查看

字段选择器Field selectors

本人认为kubernetes.io拥有需要培训机构都不会讲但在企业中时常用到的功能,字段选择就是。
字段选择很简单易懂:在元数据中添加字段选择器,以便我们查找时方便分类。
例:

metadata.name=my-service
metadata.namespace!=default
status.phase=Pending
#筛选status.phase字段的pod
kubectl get pods --field-selector status.phase=Running
#字段选择器就是为了筛选。所以当字段选择器为空时,与查询等价
kubectl get pods
kubectl get pods --field-selector ""

至此 k8s的对象主要内容完毕

标签:kubectl,CKA,Kubernetes,kubernetes,对象,namespace,nginx,空间,k8s
来源: https://blog.csdn.net/weixin_45724880/article/details/121220679

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有