《Kubernetes进阶实战》第三章《资源管理基础》

Kubernetes是ReSTful风格的API:GET,PUT,DELETE,POST 

Kubectl run,get,edit ...

kubernetes的常见资源

类别名称
工作负载型资源对象Pod、    Replicaset  、  ReplicationController(v1.11版本废弃) 、  Deployments 、  StatefulSets、  Daemonset 、  Job CronJob 等
服务发现及负载均衡 Service 、  Ingress ...
配置与存储Volume、Persistent Volume、CSl(容器存储接口,可以扩展各种各样的第三方存储卷) 、 configmap(当配置中心来使用的资源类型)、  secret(保存敏感数据) 、 DownwardAPI(把外部环境中的信息输出给容器) ...
集群资源Namespace、  Node、  Role ClusterRole  、  RoleBinding(角色绑定)、 ClusterRoleBinding(集群角色绑定)
元数据资源HPA、 PodTemplate LimitRang(Pod模板,用于让控制器创建Pod时使用的模板)、 LimitRange(用来定义硬件资源限制的)

API群组三个级别:

级别含义
apiversion内测版
beta测试版本 公测 (不稳定)
v1稳定版

注:Kubernetes API 详解 

理解Kubernetes中的对象

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

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

Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,可以有效地告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 期望状态。

与 Kubernetes 对象工作 —— 是否创建、修改,或者删除 —— 需要使用 Kubernetes API。当使用 kubectl 命令行接口时,比如,CLI 会使用必要的 Kubernetes API 调用,也可以在程序中直接使用 Kubernetes API。

对象的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 格式。查看已经部署好的pod的资源定义格式:

[root@master ~]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
client                          1/1     Running   0          87m
myapp-65899575cd-5grw5          1/1     Running   0          38m
myapp-65899575cd-6b49h          1/1     Running   0          39m
myapp-65899575cd-6p6qk          1/1     Running   0          39m
myapp-65899575cd-z4scr          1/1     Running   0          38m
nginx-deploy-84cbfc56b6-h5h7x   1/1     Running   0          79m
[root@master ~]# kubectl get pod myapp-65899575cd-z4scr  -o yaml
apiVersion: v1     # K8S API版本,应该由两部分组成:group/version,group省略表示默认为core
kind: Pod          # 资源类别: Pod、Deployment、Service等等 
metadata:          # 资源元数据
  creationTimestamp: "2019-02-21T02:38:32Z"
  generateName: myapp-65899575cd-
  labels:
    pod-template-hash: 65899575cd
    run: myapp
  name: myapp-65899575cd-z4scr
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: myapp-65899575cd
    uid: f0668b47-3580-11e9-8e77-000c297bb055
  resourceVersion: "20122"
  selfLink: /api/v1/namespaces/default/pods/myapp-65899575cd-z4scr
  uid: c76dcf40-3581-11e9-8e77-000c297bb055
spec:            # specifications, 资源规格。(定义资源对象期望的状态),这个是最重要的字段,用于规定接下来要创建的资源对象应该拥有的特性。然后依靠控制器确保这些特性能够被满足。
  containers:
  containers:
  - image: ikubernetes/myapp:v2
    imagePullPolicy: IfNotPresent
    name: myapp
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-h8l2m
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: node02
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:             # 容忍度,能够容忍哪些污点
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: default-token-h8l2m
    secret:
      defaultMode: 420
      secretName: default-token-h8l2m
status:                      # 用于显示这个资源对象当前的状态,这个字段是只读的
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2019-02-21T02:38:32Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2019-02-21T02:38:34Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2019-02-21T02:38:34Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2019-02-21T02:38:32Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://5e1f6bfb66c79b75083ee87cd63823b787cb6b3224861a82c924c3e034763949
    image: ikubernetes/myapp:v2
    imageID: docker-pullable://ikubernetes/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
    lastState: {}
    name: myapp
    ready: true
    restartCount: 0
    state:
      running:
        startedAt: "2019-02-21T02:38:33Z"
  hostIP: 10.0.0.102
  phase: Running
  podIP: 10.244.2.11
  qosClass: BestEffort
  startTime: "2019-02-21T02:38:32Z"

创建资源的方法:

  • apiserver在定义资源时,仅接收JSON格式的资源定义;
  • yaml格式提供配置清单,apiservere可自动将其转为json格式,而后再提交;

大部分资源的配置清单格式都由5个一级字段组成:

   apiVersion: group/version  指明api资源属于哪个群组和版本,同一个组可以有多个版本
        $ kubectl api-versions

    kind: 资源类别,标记创建的资源类型,k8s主要支持以下资源类别
        Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob

    metadata:元数据,主要提供以下字段
        name:同一类别下的name是唯一的
        namespace:对应的对象属于哪个名称空间
        labels:标签,每一个资源都可以有标签,标签是一种键值数据
        annotations:资源注解  
        每个的资源引用方式(selflink):
            /api/GROUP/VERSION/namespace/NAMESPACE/TYPE/NAME
            (大写单词替换为具体名称),可以通过这个PATH获取资源的信息。

    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

注:每个字段的值都标记有对应的类型:字段标记有-required-表示必选字段。

值类型简述
<string>字符串
<[]string>字符串列表,所有的列表数据都可以放在[]中。
<integer>整数
<Object>对象,也就是可以嵌套二级或三级字段。。。
<[]Object>对象列表,
<map[string]string>映射,多个k=v类型的json数组,也就是键值对,key=value,所有映射数据都可以直接放在{}中。
<boolean>布尔值,true或false

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

​[root@master ~]# mkdir mainfests
[root@master ~]# cd mainfests
创建第一个yaml文件:一个Pod上面创建两个容器
[root@master mainfests]# vim pod-demo.yaml 
[root@master mainfests]# cat pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tire: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
  - name: busybox 
    image: busybox:latest
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
开始创建
[root@master mainfests]# kubectl create -f pod-demo.yaml 
查看自己的创建
pod/pod-demo created
[root@master mainfests]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
client                          1/1     Running   0          109m
myapp-65899575cd-5grw5          1/1     Running   0          61m
myapp-65899575cd-6b49h          1/1     Running   0          61m
myapp-65899575cd-6p6qk          1/1     Running   0          61m
myapp-65899575cd-z4scr          1/1     Running   0          61m
nginx-deploy-84cbfc56b6-h5h7x   1/1     Running   0          101m
pod-demo                        2/2     Running   0          73s
删除自己的创建
[root@master mainfests]# kubectl delete -f pod-demo.yaml 
pod "pod-demo" deleted
查看pod,发现没有自主重新创建:自主式Pod一经删除不会自主重构
[root@master mainfests]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
client                          1/1     Running   0          114m
myapp-65899575cd-5grw5          1/1     Running   0          66m
myapp-65899575cd-6b49h          1/1     Running   0          66m
myapp-65899575cd-6p6qk          1/1     Running   0          66m
myapp-65899575cd-z4scr          1/1     Running   0          66m
nginx-deploy-84cbfc56b6-h5h7x   1/1     Running   0          106m
[root@master mainfests]# kubectl create -f pod-demo.yaml 
pod/pod-demo created
获取刚创建的pod-demo的详细信息
[root@master mainfests]# kubectl describe pods pod-demo
Name:               pod-demo    #资源名
Namespace:          default     #名称空间
Priority:           0
PriorityClassName:  <none>
Node:               node01/10.0.0.101    #运行在哪个节点
Start Time:         Thu, 21 Feb 2019 11:45:56 +0800
Labels:             app=myapp         #标签
                    tire=frontend
Annotations:        <none>
Status:             Running
IP:                 10.244.1.15
Containers:
  myapp:            #第一个容器
    Container ID:   docker://98b90f1c1c24dac2fa725e625030d143fd59279a14e03b34b40f425729a8e117
    Image:          ikubernetes/myapp:v1
    Image ID:       docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 21 Feb 2019 11:45:57 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts: 
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-h8l2m (ro)
  busybox:          #第二个容器
    Container ID:  docker://33b8676e887c54e73a8caae52b6c73fce9fd6fccee7ad2b507f962454794920d
    Image:         busybox:latest
    Image ID:      docker-pullable://busybox@sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149f
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      sleep 3600
    State:          Running
      Started:      Thu, 21 Feb 2019 11:46:01 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-h8l2m (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-h8l2m:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-h8l2m
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:                  #创建的详细信息
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  17m   default-scheduler  Successfully assigned default/pod-demo to node01
  Normal  Pulled     17m   kubelet, node01    Container image "ikubernetes/myapp:v1" already present on machine
  Normal  Created    17m   kubelet, node01    Created container
  Normal  Started    17m   kubelet, node01    Started container
  Normal  Pulling    17m   kubelet, node01    pulling image "busybox:latest"
  Normal  Pulled     17m   kubelet, node01    Successfully pulled image "busybox:latest"
  Normal  Created    17m   kubelet, node01    Created container
  Normal  Started    17m   kubelet, node01    Started container
查看myapp的访问日志
[root@master mainfests]# kubectl logs pod-demo myapp
​[root@master mainfests]# curl 10.244.1.15
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@master mainfests]# kubectl logs pod-demo myapp
10.244.0.0 - - [21/Feb/2019:04:09:46 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"

注:pod创建的监控:kubectl get pods -w  删除pod-demo项目:kubectl delete pods pod-demo

查看api的版本

[root@master mainfests]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

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

[root@master mainfrests]# kubectl explain pods.spec.containers
name    <string> -required-    #containers 的名字
image    <string>  #镜像地址
imagePullPolicy    <string>  #如果标签是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运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值