一. 基础概念理解
- Kubernetes Objects 官方地址
- 在k8s中所有操作资源实体都可以称为对象,先下图中的这些,都可以称为对象,不同对象功能不同
- 前面我们通过命令行方式操作k8s, 后面又学习了通过配置ymal方式操作k8s, 再后面又提供了通过Dashboard 在页面上操作k8s, 但是不管哪一种方式,k8s底层都是通过KubernetesAPI去实现的, 对k8s中所有资源的操作,都是通过KubernetesAPI接收请求给apiServer, apiServer将操作的资源对象等信息存储到etcd,也可以理解为k8s中所有资源信息都会以资源对象的方式保存到etcd中,既然保存了这些信息, 后续我们也可以根须需求修改这些对象资源,实现指定功能,所以要学习k8s对象
- 根据下图再次简单解释一下k8s对象
- 下图中先执行了"kubectl create deployment my-nginx --image=nginx" 部署了一个nginx应用
- 然后执行"kubectl get all" 命令查看详细信息,会发现分别查出了pod, service, depoloyment…等等
- 我们就可以简单理解为通过执行部署命令分别创建了一个对应当前部署的pod对象, 一个service对象, 一个deployment部署对象…
- 这些对象信息会保存在etcd上
- 我们编写ymal配置文件,配置k8s资源,就可以认为是封装k8s对象
- 我们可以执行"kubectl describe 对象名称" 命令查看指定对象的详细信息
- 查找指定对象详细信息命令: “kubectl describe 对象名”,如下图查看pod对象详细描述
二. k8s 对象中的spec与status
- k8s对象结构官方解释文档
- 上面也提到了我们编写ymal配置文件配置k8s资源,可以认为是封装k8s对象,那么查询k8s对象详细,也可以以ymal形式展示,执行"kubectl get 资源类型或资源名 -o ymal"命令, 获取资源信息以ymal形式展示
- 一次部署depolyement对象ymal形式返回示例
apiVersion: apps/v1 #版本
kind: Deployment #资源类型
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2021-04-27T11:37:59Z"
generation: 1
labels:
app: my-nginx
name: my-nginx #资源的名字
namespace: default #使用的名称空间
resourceVersion: "376418"
uid: 5a47e879-e2e9-40d1-8b02-180031903e8a
spec: ###期望状态,又称为指定规格
progressDeadlineSeconds: 600
replicas: 1 ###期望副本数量
revisionHistoryLimit: 10
selector:
matchLabels:
app: my-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: my-nginx
spec:
containers:
- image: nginx ###使用这个镜像创建容器
imagePullPolicy: Always
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status: ###当前状态
availableReplicas: 1 ##当前集群可用的,
conditions:
- lastTransitionTime: "2021-04-27T11:38:17Z"
lastUpdateTime: "2021-04-27T11:38:17Z"
message: Deploymenthasminimumavailability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2021-04-27T11:37:59Z"
lastUpdateTime: "2021-04-27T11:38:17Z"
message: ReplicaSet"my-nginx-6b74b79f57"hassuccessfullyprogressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 1
replicas: 1
updatedReplicas: 1 #不可以副本数量
- 通过上面depolyement对象ymal形式返回示例我们了解到,在k8s对象中的几个比较重要的字段
- 表示当前对象是什么类型的typeMeta
apiVersion: 用来创建对象时所使用的KubernetesAPI版本
kind: 被创建对象的类型
- 表示对象期望状态的Spec字段: 不同类型的Kubernetes对象,spec内部格式不同包含字段也可能不同
- 表示对象当前状态的status字段
- k8s对象中这几个重要字段的作用:
- k8s对象中比较重要的字段有描述当前对象时什么类型的typeMeta,描述当前对象期望状态的 Spec字段, 描述当前对象当前状态status字段
- 以k8s自愈修复为例, 当执行deployment命令部署一个应用时,如果应用异常,k8s内部会自动重新拉起当前部署的应用,这个拉起动作就是根据当前状态,与期望状态中的信息实现的
- 在期望状态spec中存在"replicas"字段表示期望当前部署的副本数量,在当前状态"status"中存在"availableReplicas"字段表示当前部署实际可以的服务数量, 与"updatedReplicas"字段,表示不可以副本数量,k8s会一直watch这三个字段,当发现期望状态与当前状态不一致时,执行指定操作进行修复
- "spec"期望状态与"status"当前状态要保证最终一致
三. 如何编写yaml
- 为了方便编写k8s的yaml, 可以使用工具,
- vscode, 安装YAML插件,然后安装Kubernetes Templates 插件
- idea也有相关插件: Kubernetes
- 常用命令
//1.获取指定资源以yaml形式输出
kubectl get 资源类型 资源名 -o yaml
//2.--dry尝试运行一个资源(尝试并不是真实部署运行),然后输出yaml
kubectl create 资源类型 资源名 --dry-run-client -o yaml
//3.解释指定资源对象字段
kubectl explain 资源类型
//4.解释指定资源对象中的指定字段
kubectl explain 资源类型.指定字段
- 上面也提到了我们编写ymal配置文件配置k8s资源,可以认为是封装k8s对象,那么如何编写任意资源的yaml,以pod为例
- 我们先找到一个pod, 然后以ymal形式展示这个pod信息,例如通过"kubectl run pod名称 --image=镜像名称"启动一个pod
- 执行"kubectl get pod my-podName -o yaml" 以yaml形式输出这个pod
- 获取ymal中除了"status"代表当前状态的信息以外的其它信息, 以这些信息为base就可以封装出一个新pod的yaml
- 根据需求创建新的yaml保存, 执行"kubectl apply -f 名称.yaml"命令应用生效即可
- 另外一种获取yaml方式
- 集群中没有对应的资源,获取不到对应的ymal, 又不能创建,此时我们可以执行"kubectl run pod名称 --image=镜像名称 --dry --run -o yaml"命令
- 命令后添加"–dry"可以理解为尝试创建,并不会真实创建出来, 然后添加"-o yaml" 输出对应的yaml即可
- 获取输出的yaml,作为base,创建新的yaml
- 获取k8s中有哪些资源命令, KIND对应yaml中的kind
kubectl api-resuouces
- 在编写yaml时需要设置,“apiVersion” 用来创建对象时所使用的KubernetesAPI版本,这个版本该如何获取,使用上面的命令也可以获取到
- yaml中metadata元数据
- yaml中的spec期望值,又称为当前创建资源的规格
kind: Deployment #资源类型
apiVersion: apps/v1 #版本 以上两个都是通过"kubectl api-resuouces"命令获取
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2021-04-27T11:37:59Z"
generation: 1
labels:
app: my-nginx
name: my-nginx #资源的名字
namespace: default
resourceVersion: "376418"
uid: 5a47e879-e2e9-40d1-8b02-180031903e8a
spec: ###期望状态,又称为指定规格
progressDeadlineSeconds: 600
replicas: 1 ###期望副本数量
revisionHistoryLimit: 10
selector: #选择器设置
matchLabels:
app: my-nginx #指定选择的标签
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: my-nginx
spec:
containers: #指定要启动一个什么样的容器
- image: nginx ###指定镜像(-表示数组,一个容器中可能是多个镜像)
imagePullPolicy: Always
name: nginx #指定容器名字
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30