Loading... ## API Server是Kubernetes集群的网关,用户和管理员以及其他客户端仅能通过此网关接口与集群进行交互。而资源的操作管理可以简单归结为增、删、改、查四种,kubectl提供了一系列子命令用于执行此类任务,create、delete、patch、apply、replace、edit、get等常用命令。生产环境中,用户通常为每个资源配置专用的资源清单。 #### 0.kubernetes yaml初级模版: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx-deploy spec: # 创建3个nginx容器 replicas: 3 selector: matchLabels: app: nginx-deploy template: metadata: labels: app: nginx-deploy spec: containers: - name: nginx-deploy image: nginx:1.14.2 ports: - containerPort: 80 ``` #### 1.理解Kubernetes中的对象: kubernetes对象是持久化的条目,使用这些条目去表示整个集群的状态。Kubernetes 对象是 “目标性记录” 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,可以有效地告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 期望状态。 - 什么容器化应用在运行(以及在哪个 Node 上) - 可以被应用使用的资源 - 关于应用如何表现的策略,比如重启策略、升级策略,以及容错策略 #### 2.资源清单简介: ##### (1)apiVersion:group/version 指明api资源属于哪个群组和版本,同一个组可以有多个版本 - alpha:该软件可能包含错误,启用一个功能可能会导致bug;随时可能会丢弃对该功能的支持,恕不另行通知。 - beta:软件经过很好的测试,功能启用被认定为安全的;默认情况下功能是开启的;细节可能会变,但功能在后续版本中不会被删除。 - stable:该版本名称命名方式 vX(v1)这里X是一个整数;版本稳定、放心使用;将出现在后续发布的软件版本中。 ```shell # kubernetes 1.18.6 版本支持的apiVersion的版本 $ kubectl api-versions admissionregistration.k8s.io/v1 admissionregistration.k8s.io/v1beta1 apiextensions.k8s.io/v1 apiextensions.k8s.io/v1beta1 apiregistration.k8s.io/v1 apiregistration.k8s.io/v1beta1 apps/v1 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/v1 coordination.k8s.io/v1beta1 discovery.k8s.io/v1beta1 events.k8s.io/v1beta1 extensions/v1beta1 networking.k8s.io/v1 networking.k8s.io/v1beta1 node.k8s.io/v1beta1 policy/v1beta1 rbac.authorization.k8s.io/v1 rbac.authorization.k8s.io/v1beta1 scheduling.k8s.io/v1 scheduling.k8s.io/v1beta1 storage.k8s.io/v1 storage.k8s.io/v1beta1 v1 ``` ##### (2)Kind:资源类别,标记创建的资源类型,k8s主要支持以下资源类别 - 工作负载型资源对象:Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob - 服务发现 负载均衡:Service,Ingress - 配置与存储:Volume,CSI,Configmap,Secret - 集群级别资源:Namespace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding - 元数据型资源:HPA,PodTemplater,LimitRanger ##### (3)metadata:元数据 - name:同一类别下的name必须是唯一的 - namespace:对应的对象属于哪个名称空间 - labels:标签,每一个资源都可以有标签,标签是一种键值数据 - annotations:资源注解 - 每个的资源引用方式(selflink):/api/GROUP/VERSION/namespace/NAMESPACE/TYPE/NAME ##### (4)spec: 定义目标资源的期望状态(disired state),资源对象中最重要的字段 ```yaml #kubectl获取spec的详细说明:kubectl explain pods.spec.containers.xxx spec: containers: - name: #pod的名称,必须字段,名称唯一且对象创建后不可以被修改 image: #镜像的标签: 镜像仓库的路径/镜像的名称 imagePullPolicy: #镜像的下载策略分为:Always(总是去仓库下载)|Never(从不去仓库下载)|IfNotPresent(如果本地没有就去仓库下载) #默认是"IfNotPresent" 但是,如果镜像的标签是latest,则总会是"Always,并且对象一旦被创建,这个字段不允许被改变 ports: #容器公开的端口列表。在这里公开端口可以为系统提供关于容器使用的网络连接的额外信息,但主要是提供信息。在这里不指定端口不会阻止该端口被公开。任何监听容器内默认的“0.0.0.0”地址的端口都可以从网络访问 containerPort: #pod暴露的端口,此端口仅是额外的信息,对端口是否被暴露没有影响 hostPort: #主机上公开的端口 protocol: #端口的协议 hostIP: #指定要绑定的主机 command: #运行的程序,类似于docker中的entrypiont,并且这里的命令不会运行在shell中,如果没有这个字段docker镜像会运行自己entrypiont中的指令 argsL: #向docker镜像中传递参数 如果定义了这个字段,docker镜像中cmd命令不会被执行,如果引用变量使用$(VAR_NAME)格式引用,如果想使用命令引用的的方式,需要使用$$(VAR_NAME)方式来引用 volumeMounts: - name: mountPath: #可以被容器挂载的存储卷的路径,路径不能包含':' 符号 subPath: #可以被容器挂载的存储卷的路径,并且不会覆盖挂载点中的文件 readOnly: #是否只读,默认为false resources: limits: #资源限制 - cpu: #CPU上限,可以短暂超过,容器也不会被停止 memory: #内存上限,不可以超过; 如果超过,容器可能会被终止或调度到其他资源充足的机器上 requests: #资源需求 - cpu: #CPU请求,也是调度CPU资源的依据,可以超过 memory: #内存请求,也是调度内存资源的依据,可以超过;但如果超过,容器可能会在Node内存不足时清理 ``` ##### (5)status: 显示资源的当前状态(current state),本字段由kubernetes进行维护 #### 3.示例配置: ```yaml vim pod-demo.yaml apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: ikubernetes/myapp:v1 - name: busybox image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600" ``` Last modification:August 5th, 2020 at 10:32 pm © 允许规范转载