一、资源管理介绍
Kubernetes中,所有的内容都抽象为资源(类比于Java中“一切皆对象”,Kubernetes中“一切皆资源”)。用户通过操作资源来管理Kubernetes。
Kubernetes本质上是一个集群系统,用户可以在集群中部署各种服务,即在Kubernetes集群中运行一个个容器,并将指定程序运行在容器中(如nginx)。但是Kubernetes的最小管理单元是Pod而非容器,因此容器需要运行在Pod中,Kubernetes一般不会直接管理Pod,而是通过Pod控制器
来管理Pod。
Pod可以提供服务后,需要考虑如何访问Pod中的服务,因此Kubernetes提供了Service
资源实现这个功能;若Pod中服务的数据需要持久化,Kubernetes还提供了各种存储系统
。
因此,学习kubernetes的核心,就是学习如何对集群上的 Pod、Pod控制器、Service、存储等各种资源进行操作。
二、YAML语法介绍
YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。
eg. 对象:heima;子对象:年龄=15,地址=北京。
# XML语言
<heima>
<age>15</age>
<address>Beijing</address>
</heima>
有许多的标签(< /age> < /address>等),如果嵌套更多会更麻烦。
# YAML语言
heima:
age: 15
address: Beijing
体现了以数据为中心,其中缩进表示当前对象的子对象。
- YAML语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格( 低版本限制 )
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
- YAML数据类型
纯量:单个的、不可再分的值
对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 编写YAML注意
- 书写yaml切记 : 后面要加一个空格
- 如果需要将多段yaml配置放在一个文件中,中间要使用 — 分隔
- yaml转json的网站,可以通过它验证yaml是否书写正确:https://www.json2yaml.com/convert-yaml-to-json
【纯量】冒号和至之间必须加空格!
# 1 布尔类型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮点型
c3: 3.14
# 4 null类型
c4: ~ # 使用~表示null,什么也不写也表示null,但是建议写上~
# 5 日期类型
c5: 2018-02-017 # 日期必须使用ISO 8601格式,即yyyy-MM-dd(必须02,2不行)
# 6 时间类型
c6: 2018-02-17T15:02:31+08:00 # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
# 7 字符串类型
# 简单写法,直接写值
c71: heima
# 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹
c71: hello
c72: 'hel lo'
c73: "hel lo"
# 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
c74: 'hello
world'
# c75: hello
# world
# c76: "hello"
# "world"
【数组】
# 形式一(推荐):
address:
- 顺义
- 昌平
# 形式二(了解):
address: [顺义,昌平]
【对象】
# 形式一(推荐):
heima1:
age: 15
address: Beijing
# 形式二(了解):
heima2: {age: 15,address: Beijing}
heima3:
age: 15
address:
- shenzhen
- changping
三、资源管理方式
以对Pod管理为例。
- 命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
解析:
① kubectl:kubernetes的命令行工具的调用
② run:运行一个Pod
③ nginx:Pod name
④ --name、–port:运行时的配置参数(镜像名、暴露端口等),还有其他的许多。
这种方式就是将我们所要做的事情,以及做这些事情时的配置参数,通过命令行的形式直接执行。
- 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
① create:创建;patch:更新;…等等其他,表示要做一件什么事,创建一个Pod?更新一个Pod?…
② -f:file
③ nginx-pod.yaml:配置文件名,提供配置参数。即将第一种情况的参数不在命令行中声明,而转移到配置文件中了。
- 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml
① apply:就这一个参数,只用于创建和更新资源。如果这个Pod没有,则create;如果已经有了,则patch。只有这两个操作。
类型 | 操作对象 | 优点 | 缺点 | 适用环境 |
---|---|---|---|---|
命令式对象管理 | 对象 | 简单 | 只能操作活动对象,无法审计和跟踪 | 测试。一般不直接用,而是当一个Pod运行起来之后,临时性地查看资源。 |
命令式对象配置 | 文件 | 可以审计、跟踪 | 项目大、配置文件多时操作麻烦 | 开发。 |
声明式对象配置 | 目录 | 支持目录操作(比如当前我有10个yaml文件,我可以将其放在一个目录里,对这个目录进行操作) | 难以调试 | 开发 |
0. kubectl命令
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
kubectl命令使用演示:
# 1. 查看所有pod
kubectl get pod
# 2. 查看某个pod
kubectl get pod pod_name
# 3. 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
① command:
要对资源执行的操作,如create、get、delete等。
通过kubectl --help
命令可以查看详细的操作命令:
基本命令:
命令 | 解释 |
---|---|
create | 创建一个资源 |
edit | 编辑一个资源 |
get | 获取… |
patch | 更新… |
delete | 删除… |
explain | 展示资源文档 |
运行和调试命令:
命令 | 解释 |
---|---|
run | 在集群中运行一个指定镜像 |
expose | 暴漏资源为service |
describe | 描述,显示资源内部信息。经常通过此命令查看容器内部的运行历程,尤其是当容器运行出现问题时,可通过此命令查看问题所在。 |
logs | 输出容器在pod中的日志 |
attach | 缠绕,进入运行中的容器 |
exec | 执行容器中的一个命令 |
cp | 在pod内外复制文件 |
rollout | 首次展示,管理资源的发布 |
scale | 规模,扩(缩)容pod数量 |
autoscale | 自动调整pod数量 |
高级命令:
命令 | 解释 |
---|---|
apply | 搭配-f file_name,通过文件对资源进行配置 |
label | 更新资源上的标签 |
cluster-info | 显示集群信息 |
version | 显示当前server和client版本 |
② type
指定资源类型,如deployment、pod、service等,kubernetes中所有的内容都抽象为资源
。可通过kubectl api-resources
命令查看所有资源类型:
集群级别资源:
资源名称 | 缩写 | 作用 |
---|---|---|
nodes | no | 集群组成部分 |
namespaces | ns | 隔离pod |
pod资源:
资源名称 | 缩写 | 作用 |
---|---|---|
pods | po | 装载容器 |
pod资源控制器:控制pod资源
资源名称 | 缩写 |
---|---|
replicationcontrollers | rc |
replicasets | rs |
deployments | deploy |
daemonsets | ds |
jobs | - |
cronjobs | cj |
horizontalpodautoscalers | hpa |
statefulset | sts |
服务发现资源:统一pod对外接口
资源名称 | 缩写 |
---|---|
service | svc |
ingress | ing |
存储资源:存储
资源名称 | 缩写 |
---|---|
volumeattachments | - |
persistentvolumes | pv |
persistentvolumeclaims | pvc |
配置资源:配置
资源名称 | 缩写 |
---|---|
configmaps | cm |
secrets | - |
③ name:指定资源的名称,大小写敏感;
④ flags:额外的可选参数。
1. 命令式对象管理
【例】以一个namespace pod的创建和删除简单演示如上命令的使用
# 1. 创建一个namespace
kubectl create namespace test-ns
# 2. 获取namespace
kubectl get ns
# 3. 在此namespace下创建一个Pod,并在其中运行一个nginx容器
kubectl run pod --image=nginx -n test-ns
# 4. 查看创建的pod
kubectl get pod -n test-ns
# 5. 删除指定的pod:此处的pod_name是指4.查看的结果
kubectl delete pod pod_name
# 6. 删除指定的namesapce
kubectl delete ns test-ns
创建的pod过一会再查看就是running状态,查看的太快容器可能还在创建过程中。
查看一下pod及nginx容器创建过程:① 将服务调度到当前集群的某一节点上 --> ② 拉取服务镜像 --> ③ 创建容器 --> ④ 运行容器。
发现删除pod后,又出现了一个新的pod(是新的pod因为:pod名字不一样,时间是刚刚)。是因为我们使用kubectl run命令创建pod是通过pod控制器,在将之前的pod删除之后,pod控制器又启动了一个新的pod来运行同样的服务。
但是我们只要将命名空间删除,其内所有pod有也会随之删除,且不会再被创建。删除namespace的过程比较慢,因为要先清空此命名空间中的所有资源。
2. 命令式对象配置
命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。
以命令式对象配置方式重新部署上一部分的例题。创建一个nginx-pod.yaml(配置文件),内容如下:其中包含了两个yaml文件内容(—分隔)
apiVersion: v1
kind: Namespace
metadata:
name: test-ns
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: test-ns
spec:
containers:
- name: nginx-container
image: nginx:1.17.1
执行create 命令创建资源:
kubectl create -f nginx-pod.yaml
同样通过配置文件删除:
kubectl delete -f nginx-pod.yaml
当然也可以通过kubectl delete pod、delete ns 的方式删除,但是通过配置文件来创建和删除明显简单很多。
命令式对象配置的方式操作资源,可以简单的认为:命令 + yaml配置文件(里面是命令需要的各种参数)
3. 声明式对象配置
声明式对象配置跟命令式对象配置很相似,但是它不区分是create还是patch,只有一个命令apply。
首先执行一次:
kubectl apply -f nginx-pod.yaml
发现创建了资源:
再次执行一次kubectl apply -f nginx-pod.yaml,发现说资源没有变动:
此时如果修改yaml配置文件,改动如下:
image: nginx:1.17.2 # 将版本号由1.17.1改为1.17.2
再运行kubectl apply -f nginx-pod.yaml:命名空间没有变化,但nginx-pod已经重新配置过了。
查看容器内部变化:
kubectl describe pod nginx-pod -n test-ns
现在test-ns和nginx-pod已经存在,如果此时再创建:则会报错
kubectl create -f nginx-pod.yaml
因此,声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态),使用apply操作资源:
添加链接描述
- 如果资源不存在,就创建,相当于 kubectl create
- 如果资源已存在,就更新,相当于 kubectl patch
以上的操作都是在master节点上运行的,那可以在node节点上运行吗?以node1为例:
这是因为kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:复制配置文件
scp -r $HOME/.kube node1: $HOME/
此时再到node1上执行kubectl命令:成功!
- 总结:三种方式如何使用?(建议)
创建/更新资源:使用声明式对象配置 kubectl apply -f XXX.yaml
删除资源:使用命令式对象配置 kubectl delete -f XXX.yaml
查询资源:使用命令式对象管理 kubectl get(describe) 资源名称
参考:B站大学