k8s 资源管控

基本介绍

​ 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

​ kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。

​ kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。

​ Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。

​ 当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。

image-20210328150013309

​ 学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作。

管理方式

​ 管理方式分为2种:

  • 纯命令管理:直接使用命令去操作kubernetes资源

    如:kubectl run nginx-pod --image=nginx:1.17.1 --port=80

  • 配置文件管理:通过命令配置和配置文件去操作kubernetes资源

    如:kubectl create/patch -f nginx-pod.yaml

​ 差异对比如下:

类型 操作对象 适用环境 优点 缺点
纯命令管理 资源对象 测试 简单、灵活、高效 无法审计、跟踪、复用、维护成本大
配置文件管理 文件 开发 可以升级、跟踪、复用、维护成本小 需要学习YAML语言

纯命令管理

基础介绍

​ kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:

kubectl [command] [type] [name] [flags]

# 支持复数加s,如pod可以为pods
  • comand:指定要对资源执行的操作,例如create、get、delete
  • type:指定资源类型,比如deployment、pod、service
  • name:指定资源的名称,名称大小写敏感
  • flags:指定额外的可选参数

​ 如下所示:

# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

资源操作

​ kubernetes允许对资源进行多种操作,可以通过--help查看详细的操作命令:

kubectl --help

​ 经常使用的操作有下面这些:

命令分类 命令 翻译 命令作用
基本命令 create 创建 创建一个资源
edit 编辑 编辑一个资源
get 获取 获取一个资源
patch 更新 更新一个资源
delete 删除 删除一个资源
explain 解释 展示资源文档
运行和调试 run 运行 在集群中运行一个指定的镜像
expose 暴露 暴露资源为Service
describe 描述 显示资源内部信息
logs 日志 输出容器在 pod 中的日志
attach 缠绕 进入运行中的容器
exec 执行 执行容器中的一个命令
cp 复制 在Pod内外复制文件
rollout 首次展示 管理资源的发布
scale 规模 扩(缩)容Pod的数量
autoscale 自动调整 自动调整Pod的数量
高级命令 apply rc 通过文件对资源进行配置
label 标签 更新资源上的标签
其他命令 cluster-info 集群信息 显示集群信息
version 版本 显示当前Server和Client的版本

资源类型

​ kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:

kubectl api-resources

​ 经常使用的资源有以下:

资源分类 资源名称 缩写 资源作用
集群级别资源 nodes no 集群组成部分
namespaces ns 隔离Pod
pod资源 pods po 装载容器
pod资源控制器 replicationcontrollers rc 控制pod资源
replicasets rs 控制pod资源
deployments deploy 控制pod资源
daemonsets ds 控制pod资源
jobs 控制pod资源
cronjobs cj 控制pod资源
horizontalpodautoscalers hpa 控制pod资源
statefulsets sts 控制pod资源
服务发现资源 services svc 统一pod对外接口
ingress ing 统一pod对外接口
存储资源 volumeattachments 存储
persistentvolumes pv 存储
persistentvolumeclaims pvc 存储
配置资源 configmaps cm 配置
secrets 配置

操作示例

​ 下面以一个namespace / pod的创建和删除简单演示下命令的使用:

# 创建一个namespace
[root@master ~]# kubectl create namespace dev
namespace/dev created

# 获取namespace
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   21h
dev               Active   21s
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h

# 在此namespace下创建并运行一个nginx的Pod
[root@master ~]# kubectl run pod --image=nginx -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created

# 查看新创建的pod
[root@master ~]# kubectl get pod -n dev
NAME                   READY   STATUS    RESTARTS   AGE
pod-864f9875b9-pcw7x   1/1     Running   0          21s

# 删除指定的pod
[root@master ~]# kubectl delete pod pod-864f9875b9-pcw7x
pod "pod-864f9875b9-pcw7x" deleted

# 删除指定的namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted

配置文件管理

YAML介绍

​ YAML是一个类似 XML、JSON 的标记性语言。

​ 它强调以数据为中心,并不是以标识语言为重点。

​ 因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。

​ XML表现形式:

<heima>
	<age>15</age>
    <address>Beijing</address>
</heima>

​ YAML表现形式:

heima:
  age: 15
  address: Beijing

YAML语法

​ YAML的语法比较简单,主要有下面几个:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格( 低版本限制 )
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

​ YAML支持以下几种数据类型:

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

​ 以下是一些数据类型的定义演示,普通的纯量类型:

# 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期
# 1 布尔类型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮点型
c3: 3.14
# 4 null类型 
c4: ~  # 使用~表示null
# 5 日期类型
c5: 2018-02-17    # 日期必须使用ISO 8601格式,即yyyy-MM-dd
# 6 时间类型
c6: 2018-02-17T15:02:31+08:00  # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
# 7 字符串类型
c7: heima     # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹 
c8: line1
    line2     # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格

​ 对象形式书写:

# 对象
# 形式一(推荐):
heima:
  age: 15
  address: Beijing
# 形式二(了解):
heima: {age: 15,address: Beijing}

​ 数组形式书写:

# 数组
# 形式一(推荐):
address:
  - 顺义
  - 昌平	
# 形式二(了解):
address: [顺义,昌平]

​ 小提示:

  1. 书写yaml切记: 后面要加一个空格

  2. 如果需要将多段yaml配置放在一个文件中,中间要使用---分隔

  3. 下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确

    https://www.json2yaml.com/convert-yaml-to-json

YAML与k8s

​ 在k8s真正的实际使用中,资源管理及部署都大多依赖于yaml文件而并非纯命令式的管理,我们只需要将要部署或管控的对象操作编辑到yaml文件中进行应用即可。

​ 这种文件叫资源清单文件,通过kubectl命令可直接使用资源清单文件,以此实现对大量资源对象的管控与部署。

​ 当然你可以使用单纯的命令式进行管理,但是命令复用及追踪效果较差。

​ 当命令被执行,随着操作越来越多被顶了上去,你很难再找到之前执行过的命令。

​ 而使用YAML进行资源部署管理的好处在于YAML文件只要你不删除,它一直就存在哪里,方便后期进行复用维护和调试。

常用命令

​ 我们不再操纵资源对象,而是直接操纵yaml文件即可完成管理。

​ 一般来说,如对一个应用进行部署我们可以先生成一个YAML文件,在此文件基础之上稍作修改再进行应用。

​ 下面是一些配置文件应用的常用命令:

命令 描述
kubectl create -f xxx.yaml 手动创建资源文件
kubectl get -f xxx.yaml 根据文件查看资源
kubectl delete -f xxx.yaml 根据文件删除资源
kubectl patch -f xxx.yaml 根据文件更新资源
kubectl apply -f xxx.yaml 根据文件创建或更新资源

自动生成

​ 手写配置文件比较繁琐,我们可以使用导入导出的命令快速的来进行资源创建和变更:

[root@master ~]# kubectl create 资源类型 资源名称 -o yaml --dry-run > yaml文件名.yaml

[root@master ~]# kubectl get deploy nginx -o=yaml --export > nginx.yaml  # 导出index

# --dry-run:空跑,仅生成文件,不部署deployment资源

​ 你可以一步一步通过--help命令来获取帮助:

[root@master ~]# kubectl create --help

Available Commands:
  clusterrole         Create a ClusterRole.
  clusterrolebinding  为一个指定的 ClusterRole 创建一个 ClusterRoleBinding
  configmap           从本地 file, directory 或者 literal value 创建一个 configmap
  cronjob             Create a cronjob with the specified name.
  deployment          创建一个指定名称的 deployment.
  job                 Create a job with the specified name.
  namespace           创建一个指定名称的 namespace
  poddisruptionbudget 创建一个指定名称的 pod disruption budget.
  priorityclass       Create a priorityclass with the specified name.
  quota               创建一个指定名称的 quota.
  role                Create a role with single rule.
  rolebinding         为一个指定的 Role 或者 ClusterRole创建一个 RoleBinding
  secret              使用指定的 subcommand 创建一个 secret
  service             使用指定的 subcommand 创建一个 service.
  serviceaccount      创建一个指定名称的 service account

操作示例

​ 使用YAML文件来部署一个nginx服务。

​ 1)我们需要为该Nginx创建一个Pod,可以通过deploy这个管理器来完成Pod的创建与部署,只需要指定镜像即可:

[root@master ~]# kubectl create deploy nginx --image=nginx -o=yaml --dry-run > nginx.yaml

​ 2)部署应用:

[root@master ~]# kubectl apply -f nginx.yaml

​ 3)查看部署的Nginx:

[root@master ~]# kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           4s

​ 4)该Nginx服务不能对外访问,还需要生成一个svc的访问规则:

[root@master ~]# kubectl create svc nodeport nginx -o=yaml --tcp=80:80 --dry-run > nginx_svc.yaml

# 80:80 第一个80是集群内部访问的端口,第二个port是在Pod上的port

​ 5)进行应用svc规则:

[root@master ~]# kubectl apply -f nginx_svc.yaml

service/nginx configured

​ 6)执行以下命令查看暴露给外部的port:

[root@master ~]# kubectl get svc

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        3d4h
nginx        NodePort    10.111.215.31   <none>        80:31582/TCP   8m13s

​ 7)集群内部访问测试:

[root@master ~]# curl 10.111.215.31:80

​ 8)浏览器外部访问测试:

http://192.168.120:31582
http://192.168.130:31582
http://192.168.140:31582

属性介绍

​ 打开--dry-run的nginx.yaml文件,查看文件内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

​ 以下是它的属性介绍:

属性名称 描述
apiVersion API版本
kind 资源类型
metadata 资源元数据
spec 资源规格
replicas 副本数量
selector 标签选择器
template Pod模板
metadata Pod元数据
spec Pod规格
containers 容器配置

控制管理器

​ 在nginx.yaml文件中,以下部分是属于控制管理器:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null 
  labels:
    app: web  # 要管理谁?
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}

被控制对象

​ 在nginx.yaml文件中,以下部分是属于被控制对象:

template:
    metadata:
      creationTimestamp: null
      labels:
        app: web  # 我是谁
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

Kubectl操作大全

阅读需知前言

​ 本小结中所有命令均是kubectl中command所能用到的操作命令。

基础操作命令

​ 以下是常用的基础命令:

命令 描述
create 通过文件名或标准输入创建资源
expose 将一个资源公开为一个新的Service
run 在集群中运行一个特定的镜像
set 在对象上设置特定的功能
get 显示一个或多个资源
explain 文档参考资料
edit 使用默认的编辑器编辑一个资源
delete 通过文件名,标准输入,资源名称或标签来删除资源

部署操作命令

​ 以下是常用的部署操作命令:

命令 描述
rollout 管理资源的发布
rolling-update 对给定的复制控制器滚动更新
scale 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job
autoscale 创建一个自动选择扩容或缩容并设置Pod数量

集群管理命令

​ 以下是常用的集群管理命令:

命令 描述
certificate 修改证书资源
cluster-info 显示集群信息
top 显示资源(CPU/M)
cordon 标记节点不可调度
uncordon 标记节点可被调度
drain 驱逐节点上的应用,准备下线维护
taint 修改节点taint标记

故障调试命令

​ 以下是常用的部署与调试命令:

命令 描述
describe 显示特定资源或资源组的详细信息
logs 在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的
attach 附加到一个运行的容器
exec 执行命令到容器
port-forward 转发一个或多个
proxy 运行一个proxy到Kubernetes API Server
cp 拷贝文件或目录到容器中
auth 检查授权

其他操作命令

​ 以下是一些常用的其他操作命令:

命令 描述
apply 通过文件名或标准输入对资源应用配置
patch 使用补丁修改、更新资源的字段
replace 通过文件名或标准输入替换一个资源
convert 不同的API版本之间转换配置文件
label 更新资源上的标签
annotate 更新资源上的注释
completion 用于实现kubectl工具自动补全
api-versions 打印受支持的API版本
config 修改kubeconfig文件(用于访问API,比如配置认证信息)
help 所有命令帮助
plugin 运行一个命令行插件
version 打印客户端和服务版本信息
posted @ 2021-03-28 16:20  云崖君  阅读(238)  评论(0编辑  收藏  举报