【Kubenetes实战】二、资源管理


一、资源管理介绍

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语法
  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 缩进不允许使用tab,只允许空格( 低版本限制 )
  4. 缩进的空格数不重要,只要相同层级的元素左对齐即可
  5. '#'表示注释
  • YAML数据类型

纯量:单个的、不可再分的值
对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

  • 编写YAML注意
  1. 书写yaml切记 : 后面要加一个空格
  2. 如果需要将多段yaml配置放在一个文件中,中间要使用 — 分隔
  3. 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管理为例。

  1. 命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80

解析:
① kubectl:kubernetes的命令行工具的调用
② run:运行一个Pod
③ nginx:Pod name
④ --name、–port:运行时的配置参数(镜像名、暴露端口等),还有其他的许多。

这种方式就是将我们所要做的事情,以及做这些事情时的配置参数,通过命令行的形式直接执行。

  1. 命令式对象配置:通过命令配置配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml

① create:创建;patch:更新;…等等其他,表示要做一件什么事,创建一个Pod?更新一个Pod?…
② -f:file
③ nginx-pod.yaml:配置文件名,提供配置参数。即将第一种情况的参数不在命令行中声明,而转移到配置文件中了。

  1. 声明式对象配置:通过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命令查看所有资源类型:
在这里插入图片描述
集群级别资源:

资源名称缩写作用
nodesno集群组成部分
namespacesns隔离pod

在这里插入图片描述

pod资源:

资源名称缩写作用
podspo装载容器

在这里插入图片描述

pod资源控制器:控制pod资源

资源名称缩写
replicationcontrollersrc
replicasetsrs
deploymentsdeploy
daemonsetsds
jobs-
cronjobscj
horizontalpodautoscalershpa
statefulsetsts

服务发现资源:统一pod对外接口

资源名称缩写
servicesvc
ingressing

存储资源:存储

资源名称缩写
volumeattachments-
persistentvolumespv
persistentvolumeclaimspvc

配置资源:配置

资源名称缩写
configmapscm
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站大学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值