【Kubernetes】资源管理(命令)总结

在这里插入图片描述

kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速 启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的 容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式 找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动 实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即 回退到原来的版本
  • 存储编排:可以根据容器自身的需求 自动创建存储卷

一、资源管理介绍

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

  • kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务。所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
  • kubernetes的 最小管理单元是pod 而不是容器,所以只能将 容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过 PodController 管理
  • Pod可以提供服务之后,就要考虑如何 访问Pod中服务,kubernetes提供了 Service资源 实现这个功能。
  • 当然,如果Pod中程序的数据需要 持久化,kubernetes还提供了 各种存储系统

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EMzkQn5j-1671010223032)(images/2020-04-06_22-53-34627.png)]

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

二、YAML语言概述

YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。

xml举例:需要加上闭合标签

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

yaml举例:相对简洁

heima:
  age: 15
  address: Beijing

语法

  • 大小写敏感
  • 使用 缩进表示层级关系
  • 为了兼容低版本,缩进建议使用空格
  • 缩进的 空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

数据类型

  • 纯量:单个的、不可再分的值。字符串、布尔值、整数、浮点数、Null、时间、日期

    #布尔类型
    c1: true (或者True)
    #整型
    c2: 234
    #浮点型
    c3: 3.14
    #null类型 
    c4: ~
    #日期:必须使用ISO 8601格式,即yyyy-MM-dd
    c5: 2018-02-17
    #时间日期:时间日期使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
    c6: 2018-02-17T15:02:31+08:00
    #字符串类型:如果字符串中间有特殊字符,必须使用双引号或者单引号包裹
    c7: heima
    c8: 'line1
        line2'     # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
    
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)

    # 形式一(推荐):
    heima:
      age: 15
      address: Beijing
    # 形式二(了解):
    heima: {age: 15,address: Beijing}
    
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

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

小提示

  • 书写yaml切记 : 后面要加一个空格
  • 如果需要将多段yaml配置放在一个文件中,中间要使用 --- 分隔
  • 下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确:链接

在这里插入图片描述

三、管理方式

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

    kubectl run nginx-pod --image=nginx:1.17.1 --port=80
    
  • 命令式对象配置:通过命令配置和 配置文件(提供资源信息) 去操作kubernetes资源

    kubectl create/patch -f nginx-pod.yaml
    
  • 声明式对象配置:通过 apply命令(创建、更新) 和配置文件去操作kubernetes资源

    kubectl apply -f nginx-pod.yaml
    
类型操作对象适用环境优点缺点
命令式对象管理对象测试简单只能操作活动对象,无法审计、跟踪
命令式对象配置文件开发可以审计、跟踪项目大时,配置文件多,操作麻烦
声明式对象配置目录开发支持目录操作意外情况下难以调试

四、命令式对象管理

直接使用命令去操作kubernetes资源

4.1 kubectl 命令介绍

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

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

comand:指定要对资源执行的操作,例如create、get、delete

type:指定资源类型,比如deployment、pod、service

name:指定资源的名称,名称大小写敏感

flags:指定额外的可选参数

# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

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

4.2 操作命令

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

kubectl --help

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

命令分类命令翻译命令作用
基本命令create创建:–record创建一个资源
run运行:–image、–port、–replicas、–requests=cpu=100m在集群中运行一个指定的镜像
expose暴露:–name、–type=NodePort、–port=80、–target-port、暴露资源为Service
edit编辑编辑一个资源
get获取:-o、-w、–show-labels获取一个资源
patch更新更新一个资源
delete删除:–force、–grace-period=0删除一个资源
explain解释展示资源文档
set修改在对象上设置特定功能
部署命令rollout首次展示管理资源的发布
scale规模:–replicas=3命令方式扩(缩)容Pod的数量
autoscale自动调整自动调整Pod的数量
集群管理命令cluster-info集群信息显示集群信息
certificate修改证书资源
top显示资源(CPU/内存/存储)使用情况
cordon将节点标记为不可调度
uncordon将节点标记为可调度
drain为维护做准备时排空节点
taint污点更新一个或多个节点上的污点
故障排除和调试命令describe描述显示资源内部信息
logs日志:-f volume-emptydir、-c busybox查看容器在 pod 中的标准输出
attach缠绕进入运行中的容器进入运行中的容器
exec执行容器中的一个命令执行容器中的一个命令
cp复制在Pod内外复制文件
port-forward将一个或多个本地端口转发到pod
proxy运行Kubernetes API服务器的代理
auth检查授权
高级命令applyrc通过文件对资源进行配置
label标签:–overwrite更新资源上的标签
diff将实时版本与将要应用的版本进行比较
replace用文件名或标准输入替换资源
wait实验性:等待一个或多个资源上的特定条件
convert在不同API版本之间转换配置文件
kustomize从目录或远程url构建一个目标库
annotate更新资源上的注释
completion输出指定shell (bash或zsh)的shell完成代码
其他命令version版本显示当前Server和Client的版本
api-resources打印服务器上支持的API资源
api-versions以“组/版本”的形式打印服务器上支持的API版本
config修改kubeconfig文件
plugin提供与插件交互的实用程序

4.3 资源类型

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

kubectl api-resources

经常使用的资源有下面这些:

资源分类资源名称缩写资源作用
集群级别资源nodesno集群组成部分
namespacesns隔离Pod
pod资源podspo装载容器
pod资源控制器replicationcontrollersrc控制pod资源
replicasetsrs控制pod资源
deploymentsdeploy控制pod资源
daemonsetsds控制pod资源
jobs控制pod资源
cronjobscj控制pod资源
horizontalpodautoscalershpa控制pod资源
statefulsetssts控制pod资源
服务发现资源servicessvc统一pod对外接口
ingressing统一pod对外接口
存储资源volumeattachments存储
persistentvolumespv存储
persistentvolumeclaimspvc存储
配置存储资源configmapscm配置
secrets配置

4.4 命令参数

通过下面的命令查看全局命令行选项列表(适用于所有命令)

kubectl options
选项是否使用过作用
–add-dir-header=false如果为true,则将文件目录添加到头部
–alsologtostderr=false记录标准错误和文件
–as=‘’为操作模拟的用户名
–as-group=[]为操作模拟的组,该标志可以重复指定 多组
–cache-dir=‘/root/.kube/http-cache’默认HTTP缓存目录
–certificate-authority=‘’证书颁发机构的证书文件的路径
–client-certificate=‘’TLS的客户端证书文件的路径
–client-key=‘’TLS的客户端密钥文件的路径
–cluster=‘’要使用的kubeconfig集群的名称
–context=‘’要使用的kubeconfig上下文的名称
–insecure-skip-tls-verify=false如果为true,将不检查服务器的证书有效性。这将使你的HTTPS连接不安全
–kubeconfig=‘’用于CLI请求的kubeconfig文件的路径
–log-backtrace-at=:0当日志记录命中行file:N时,发出堆栈跟踪
–log-dir=‘’如果非空,将日志文件写入此目录
–log-file=‘’如果非空,则使用此日志文件
–log-file-max-size=1800定义日志文件可以增长到的最大大小。单位是兆字节。 如果该值为0,则最大文件大小不受限制。
–log-flush-frequency=5s日志刷新之间的最大秒数
–logtostderr=true记录标准错误而不是文件
–match-server-version=false要求服务器版本与客户端版本相匹配
-n, --namespace=‘’如果存在,此CLI请求该命名空间范围
–password=‘’API服务器基本身份验证的密码
–profile=‘none’要捕获的配置文件的名称。 (无| cpu |堆| goroutine |线程创建|块|互斥体)之一
–profile-output=‘profile.pprof’要写入配置文件的文件的名称
–request-timeout=‘0’在放弃单个服务器请求之前等待的时间长度。 非零值应包含相应的时间单位(如1s、2m、3h)。零值意味着不要让请求超时。
-s, --server=‘’Kubernetes API服务器的地址和端口
–skip-headers=false如果为真,请避免在日志消息中使用标头前缀
–skip-log-headers=false如果为true,则在打开日志文件时避免标题
–stderrthreshold=2等于或高于此阈值的日志将转至stderr
–token=‘’用于对API服务器进行身份验证的不记名令牌
–user=‘’要使用的kubeconfig用户的名称
–username=‘’对API服务器进行基本身份验证的用户名
-v, --v=0日志级别详细程度的数字
–vmodule=文件过滤日志记录的pattern=N设置的逗号分隔列表

4.5 操作案例

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

  1. 创建一个 namespace

    [root@master ~]# kubectl create namespace test
    

    在这里插入图片描述

  2. 获取 namespace

    [root@master ~]# kubectl get namespace
    

    在这里插入图片描述

  3. 在此namespace下创建并运行一个nginx的 Pod

    [root@master ~]# kubectl run pod --image=nginx -n test
    

    在这里插入图片描述

  4. 查看新创建的pod。注意:默认命名空间为 default

    [root@master ~]# kubectl get pods -n test
    

    在这里插入图片描述

  5. 查看pod的内部信息

    [root@master ~]# kubectl describe pod pod-864f9875b9-mq2jl -n test
    

    在这里插入图片描述

    在这里插入图片描述

  6. 删除指定的pod。注意:默认命名空间为 default

    [root@master ~]# kubectl delete pod pod-864f9875b9-mq2jl -n test
    

    在这里插入图片描述

  7. 删除指定的namespace

    [root@master ~]# kubectl delete namespace test
    

    在这里插入图片描述

五、命令式对象配置

通过 命令 和 配置文件(提供资源信息) 操作kubernetes资源

  1. 创建一个nginxpod.yaml,内容如下:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginxpod
      namespace: dev
    spec:
      containers:
      - name: nginx-containers
        image: nginx:latest
    
  2. 执行create命令,创建资源

    [root@master ~]# kubectl create -f nginxpod.yaml
    namespace/dev created
    pod/nginxpod created
    

    在这里插入图片描述

  3. 执行get命令,查看资源

    [root@master ~]# kubectl get -f nginxpod.yaml
    

    在这里插入图片描述

  4. 执行delete命令,删除资源

    [root@master ~]# kubectl delete -f nginxpod.yaml
    

    在这里插入图片描述

六、声明式对象配置

通过 apply命令(创建、更新) 和 配置文件 操作kubernetes资源

其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)

  • 如果资源不存在:创建,相当于 kubectl create
  • 如果资源已存在:更新,相当于 kubectl patch

操作案例

  1. 还是使用 nginxpod.yaml配置文件 创建资源

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

    在这里插入图片描述

  2. 更新资源失败

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

    在这里插入图片描述

  3. 更新资源成功:将 nginx的镜像从 latest 改为 1.17.1

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

    在这里插入图片描述

    在这里插入图片描述

七、小结与扩展

使用推荐: 三种方式应该怎么用 ?

  • 查询资源:使用命令式对象管理 kubectl get(describe) 资源名称
  • 删除资源:使用命令式对象配置 kubectl delete -f XXX.yaml
  • 创建/更新资源:使用声明式对象配置 kubectl apply -f XXX.yaml

扩展:kubectl可以在node节点上运行吗 ?

kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:

[root@master ~]# scp  -r  ~/.kube   node1:~/

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿你满腹经纶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值