kubernetes之资源清单

一、Kubernetes常用资源

以下列举的内容都是 kubernetes 中的 Object,这些对象都可以在 yaml 文件中作为一种 API 类型来配置。

类别名称
工作负载型资源对象Pod、Replicaset、ReplicationController、Deployments、StatefulSets、Daemonset、Job、CronJob
服务发现及负载均衡Service、Ingress
配置与存储Volume、Persistent Volume、CSl 、configmap、secret
集群资源Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding
元数据资源HPA、PodTemplate、LimitRang

 

二、对象的Spec和状态

每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 spec 和 对象 statusspec 必须提供,它描述了对象的 期望状态 —— 希望对象所具有的特征。status 描述了对象的 实际状态,它是由 Kubernetes 系统提供和更新。在任何时刻,Kubernetes 控制平面一直处于活跃状态,管理着对象的实际状态以与我们所期望的状态相匹配。

例如,Kubernetes Deployment 对象能够表示运行在集群中的应用。当创建 Deployment 时,可能需要设置 Deployment 的 spec,以指定该应用需要有 3 个副本在运行。Kubernetes 系统读取 Deployment spec,启动我们所期望的该应用的 3 个实例 —— 更新状态以与 spec 相匹配。如果那些实例中有失败的(一种状态变更),Kubernetes 系统通过修正来响应 spec 和状态之间的不一致 —— 这种情况,启动一个新的实例来替换。

 

三、Pod的配置格式

当创建 Kubernetes 对象时,必须提供对象的 spec,用来描述该对象的期望状态,以及关于对象的一些基本信息(例如,名称)。当使用 Kubernetes API 创建对象时(或者直接创建,或者基于kubectl),API 请求必须在请求体中包含 JSON 格式的信息。更常用的是,需要在 .yaml 文件中为 kubectl 提供这些信息。 kubectl 在执行 API 请求时,将这些信息转换成 JSON 格式。

创建资源的方法:

  • apiserver在定义资源时,仅接收JSON格式的资源定义;
  • yaml格式提供配置清单,apiservere可自动将其转为json格式,而后再提交;
apiVersion: group/version  # 指明api资源属于哪个群组和版本,同一个组可以有多个版本

kind:  # 资源类别,标记创建的资源类型,k8s主要支持以下资源类别
  Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
    
metadata:  # 元数据,主要提供以下字段
  name:  # 同一类别下的name是唯一的
  namespace:  # 对应的对象属于哪个名称空间
  labels:  # 标签,每一个资源都可以有标签,标签是一种键值数据
  annotations:  # 资源注解
        
  每个的资源引用方式(selflink):
    /api/GROUP/VERSION/namespace/NAMESPACE/TYPE/NAME
    
spec:  # 定义目标资源的期望状态(disired state),资源对象中最重要的字段
    
status:  # 显示资源的当前状态(current state),本字段由kubernetes进行维护

K8s存在内嵌的格式说明,可以使用kubectl explain 进行查看,如查看Pod这个资源的定义:

[root@master ~]# kubectl explain pods
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

   kind <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

   metadata     <Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

   spec <Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

   status       <Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

从上面可以看到apiVersion,kind等定义的键值都是<string>,而metadata和spec看到是一个<Object>,当看到存在<Object>的提示,说明该字段可以存在多个二级字段,那么可以使用如下命令继续查看二级字段的定义方式:

kubectl explain pods.metadata
kubectl explain pods.spec

二级字段下,每一种字段都有对应的键值类型,常用类型大致如下:

<[]string>:表示是一个字串列表,也就是字串类型的数组

<Object>:表示是可以嵌套的字段

<map[string]string>:表示是一个由键值组成映射

<[]Object>:表示是一个对象列表

<[]Object> -required-:required表示该字段是一个必选的字段

 

四、使用配置清单创建自主式Pod资源 

yaml 文件准备:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: busybox
    image: busybox:latest
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"

声明式创建:

kubectl apply -f pod-demo.yaml

查看:

kubectl get pods
kubectl describe pods pod-demo

获取容器日志:

kubectl logs pod-demo myapp

进入容器内部:

kubectl exec -it pod-demo -c myapp -- /bin/sh
# 在一个pod中存在多个容器时,用"-c"指定容器名字

 

五、Pod资源下spec的containers必需字段解析

~]# kubectl explain pods.spec.containers

name  <string> -required-  # 容器的名字
image  <string>  # 镜像地址
imagePullPolicy  <string>  
# Always(下载镜像,如果镜像标签是latest,默认Always)、IfNotPresent(先查找本地,没有就下载)、Never(使用本地镜像).

ports  <[]Object>
# 对象列表,可以暴露多个端口,可以对每个端口的属性定义.例如:名称(可后期调用),端口号,协议,暴露的地址.

- containerPort  # 容器端口

  hostIP  # 主机地址(基本不会使用)

  hostPort  # 节点端口

  name  # 名称

  protocol  # 默认是TCP

args  <[]string>  # 传递参数给command 相当于docker中的CMD

command  <[]string>  # 相当于docker中的ENTRYPOINT

如果Pod不提供commandargs使用Container,则使用Docker镜像中的cmd或者ENTRYPOINT。

如果Pod提供command但不提供args,则仅使用提供 command的。将忽略Docker镜像中定义EntryPoint和Cmd。

如果Pod中仅提供args,则args将作为参数提供给Docker镜像中EntryPoint。

如果提供了commandargs,则Docker镜像中的ENTRYPOINT和CMD都将不会生效,Pod中的args将作为参数给command运行

 

六、标签及标签选择器

1、标签

key=value
  • key:只能使用字母和数字和特殊符号 _- . (只能以字母数字开头,不能超过63个字符);
  • value:可以为空,只能使用字母数字开头;
# 查看pod标签
[root@master resourcelist]# kubectl get pods --show-labels 
NAME       READY   STATUS    RESTARTS   AGE   LABELS
pod-demo   2/2     Running   0          48m   app=myapp

# 过滤pod标签
[root@master resourcelist]# kubectl get pods -l app
NAME       READY   STATUS    RESTARTS   AGE
pod-demo   2/2     Running   0          49m

# 给pod打标签
[root@master resourcelist]# kubectl label pods pod-demo release=canary
pod/pod-demo labeled
[root@master resourcelist]# kubectl get pods -l app --show-labels
NAME       READY   STATUS    RESTARTS   AGE   LABELS
pod-demo   2/2     Running   0          50m   app=myapp,release=canary

# 修改pod标签
[root@master resourcelist]# kubectl label pods pod-demo release=stable --overwrite
pod/pod-demo labeled
[root@master resourcelist]# kubectl get pods -l app --show-labels
NAME       READY   STATUS    RESTARTS   AGE   LABELS
pod-demo   2/2     Running   0          51m   app=myapp,release=stable

# 通过多个标签过滤
[root@master resourcelist]# kubectl get pods -l release,app
NAME       READY   STATUS    RESTARTS   AGE
pod-demo   2/2     Running   0          51m

2、标签选择器

  • 等值关系标签选择器:=,==,!=
kubectl get pods -l app=test,app=dev
  • 集合关系标签选择器:KEY in (v1,v2,v3),KEY notin (v1,v2,v3) ,!KEY
kubectl get pods -l "app in (test,dev)"

许多资源支持内嵌字段

  • matchLabels:直接给定建值
  • matchExpressions:基于给定的表达式来定义使用标签选择器
{key:"KEY",operator:"OPERATOR",values:[V1,V2,....]}
  • 操作符:
in notin:Values字段的值必须是非空列表
Exists NotExists:Values字段的值必须是空列表

3、节点标签选择器

]# kubectl explain pod.spec
   nodeName    <string>
     NodeName is a request to schedule this pod onto a specific node. If it is
     non-empty, the scheduler simply schedules this pod onto that node, assuming
     that it fits resource requirements.

   nodeSelector    <map[string]string>
     NodeSelector is a selector which must be true for the pod to fit on a node.
     Selector which must match a node's labels for the pod to be scheduled on
     that node. More info:
     https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

nodeSelector可以限定pod创建在哪个节点上。举个例子:

1、给指定节点打标签,也可以使用原有节点标签(kubernetes.io/hostname=node01)

[root@master ~]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
pod-demo   2/2     Running   5          3h53m   10.101.231.130   node02   <none>           <none>
[root@master ~]# kubectl get nodes --show-labels
NAME     STATUS   ROLES    AGE   VERSION   LABELS
master   Ready    master   21h   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01   Ready    <none>   21h   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02   Ready    <none>   21h   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

2、修改yaml文件,增加标签选择器:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: busybox
    image: busybox:latest
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
  nodeSelector:
    kubernetes.io/hostname: node01

3、重新创建pod-demo

注意:pod是非常忠诚的,意味着一旦在被schedular调度到某个节点上,就会一直在该节点上运行,直到生命结束。

所以这里应该先删除pod-demo并重新创建,而不能直接申明式的 apply -f 新修改的文件。

kubectl delete -f pod-demo.yaml
kubectl apply -f pod-demo.yaml

 可以看到pod运行在指定节点node01上:

[root@master resourcelist]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-demo   2/2     Running   0          11m   10.109.55.10   node01   <none>           <none>

annotations:

  与label不同的地方在于,annotations不能用于挑选资源对象,仅用于为对象提供"元数据",没有键值长度限制。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值