【云原生--Kubernetes】kubectl命令详解


前言:在k8s集群中,我们使用kubectl命令行工具对集群进行管理

一. 资源管理方式

kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口,kubectl 是官方的 CLI 命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为apiserver 能识别的json信息,进而实现管理 k8s 各种资源的一种有效途径

在使用kubectl管理工具时,主要有两种管理类型:命令式对象管理/配置,声明式对象配置

  • 命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.14 --port=80
  • 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
  • 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml
类型 操作对象 使用环境 优点 缺点
命令式对象管理 对象 测试 简单 只能操作活动对象,无法审计、跟踪
命令式对象配置 文件 开发 可以审计、跟踪 项目大时,配置文件多,操作麻烦
声明式对象配置 目录 开发 支持目录操作 意外情况下难以调试

二. 命令式对象管理

在使用kubectl命令时,可以使用kubectl --help进行查看详细操作

命令格式:

kubectl [commond] [type] [name] [flags]

常用commond参数:

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

常用资源(type)类型:

资源分类 资源名称 缩写 描述
集群级别资源 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 配置

2.1 系统信息查询

  • 版本查询
    kubectl version
    在这里插入图片描述

  • 节点信息查询
    kubectl get nodes
    在这里插入图片描述

  • 集群信息查询
    kubectl cluster-info
    在这里插入图片描述

  • 资源对象查看
    kubectl api-resources
    在这里插入图片描述

  • master节点查看

kubectl get componentstatuses
#componentstatues可以缩写成cs
kubectl get cs

在这里插入图片描述

  • 查看命明空间
kubectl get namespace
#namespace可以缩写成ns
kubectl get ns

在这里插入图片描述

2.2 命名空间操作

  • 查看default命名空间的所有资源
kubectl get all [-n default]

由于deafult为缺省空间,当不指定命名空间时默认查看default命名空间
在这里插入图片描述

  • 创建命名空间
kubectl create ns xy

在这里插入图片描述

  • 删除命名空间
kubectl delete ns xy

在这里插入图片描述

2.3 创建

kubectl run

命令格式:

#kubectl run --help
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client]
[--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
kubectl run nginx --image=nginx:1.14 --port=80 
#depoy-nginx为控制器名称
#--image指定镜像文件
#--port指定暴露的端口
#服务暴露
kubectl expose pod nginx --port=80 --type=NodePort

l

kubectl create

#创建一个控制器
kubectl create deploy nginx --image=nginx:1.14 
kubectl get pod
kubectl get svc
#服务暴露
kubectl expose deploy nginx --port=80 --type=NodePort
kubectl get svc

在这里插入图片描述

run与create区别

先使用run与create创建并暴露一个pod

#run
kubectl run run-nginx --image=nginx:1.14
kubectl expose pod run-nginx --port=80 --type=NodePort
#create
kubectl create deploy create-nginx --image=nginx:1.14
kubectl expose deploy create-nginx --port=80 --type=NodePort
#删除pod,在删除时可以新打开一个终端使用watch命令查看容器状态
watch -n 1 kubectl get pod -n default
#-n default,-n为名称空间namespace,default为默认的名称空间

在这里插入图片描述
run与create区别:
run为一次性的创建运行,删除后不会自动生成,没有pod控制器
create创建的,删除后还会自动生成,有pod控制器,拥有副本集控制

2.4 expose

命令格式:

#kubectl espose --help
kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP]
[--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
[options]
kubectl expose deploy create-nginx --port=80 --type=NodePort
#kubectl expose +pod管理器类型 +pod名称  +选项参数

上文中其实已经使用expose对服务进行暴露,所以这儿就不过多演示

2.5 更新/回滚

set–更新

使用 kubectl set --help查看set的具体使用信息

[root@k8s ~]# kubectl set --help
Configure application resources

 These commands help you make changes to existing application resources.

Available Commands:
  env            Update environment variables on a pod template
  image          Update image of a pod template
  resources      Update resource requests/limits on objects with pod templates
  selector       Set the selector on a resource
  serviceaccount Update ServiceAccount of a resource
  subject        Update User, Group or ServiceAccount in a RoleBinding/ClusterRoleBinding

Usage:
  kubectl set SUBCOMMAND [options]

命令格式:

kubectl set image --help

kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1

比如:

kubectl set image deploy create-nginx nginx=nginx:1.20

在这里插入图片描述
在这里插入图片描述

rollout–回滚

[root@k8s ~]# kubectl rollout --help
Examples:
  # Rollback to the previous deployment
  kubectl rollout undo deployment/abc
  
  # Check the rollout status of a daemonset
  kubectl rollout status daemonset/foo

Available Commands:
  history     View rollout history
  pause       Mark the provided resource as paused
  restart     Restart a resource
  resume      Resume a paused resource
  status      Show the status of the rollout
  undo        Undo a previous rollout     

Usage:
  kubectl rollout SUBCOMMAND [options]
###################################################
  history     显示 rollout 历史
  pause       标记提供的 resource 为中止状态
  resume      继续一个停止的 resource
  status      显示 rollout 的状态
  undo        撤销上一次的 rollout
#查看rollout历史
kubectl rollout history deploy create-nginx 
#撤销上一次的rollout
kubectl rollout undo deploy/create-nginx
#查看rollout状态
kubectl rollout status deploy create-nginx

在这里插入图片描述

2.6 删除

命令格式:

# kubectl delete --help
kubectl delete ([-f FILENAME] | [-k DIRECTORY] | TYPE [(NAME | -l label | --all)]) [options]
#创建3个nginx副本
kubectl create deploy nginx --image=nginx --replice=3
#暴露端口
kubectl expose deploy nginx --port=80 --type=NodePort
#删除pod
kubectl delete pod nginx-6799fc88d8-dzbjk
#删除svc
kubectl delete svc nginx
#删除控制器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.声明式对象配置

声明式对象配置与命令式对象配置相似,但是其命令更加的简洁且需要yaml文件

3.1YAML格式说明

Kubernetes支持YAML和JSON格式创建资源对象

YAML格式:

以空格的方式缩进标识层级关系
不支持制表符缩进(tab),使用空格缩进
通常开头缩进两个空格(统一层级对应即可)
字符后缩进一个空格,如冒号,逗号等
“—”表示YAML格式,一个文件的开始
支持以“#”表示注释

apiVersion: v1       #必选,版本号,例如v1
kind: Pod            #必选,Pod
metadata:            #必选,元数据
  name: string       #必选,Pod名称
  namespace: string  #必选,Pod所属的命名空间
  labels:            #自定义标签
    - name: string   #自定义标签名字
  annotations:       #自定义注释列表
    - name: string
spec:                #必选,Pod中容器的详细定义
  containers:        #必选,Pod中容器列表
  - name: string     #必选,容器名称
    image: string    #必选,容器的镜像名称
    imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
    command: [string]    #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]       #容器的启动命令参数列表
    workingDir: string   #容器的工作目录
    volumeMounts:        #挂载到容器内部的存储卷配置
    - name: string       #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string  #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean  #是否为只读模式
    ports:               #需要暴露的端口库号列表
    - name: string       #端口号名称
      containerPort: int #容器需要监听的端口号
      hostPort: int      #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string   #端口协议,支持TCP和UDP,默认TCP
    env:                 #容器运行前需设置的环境变量列表
    - name: string       #环境变量名称
      value: string      #环境变量的值
    resources:           #资源限制和请求的设置
      limits:            #资源限制的设置
        cpu: string      #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string   #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests:          #资源请求的设置
        cpu: string      #Cpu请求,容器启动的初始可用数量
        memory: string   #内存清楚,容器启动的初始可用数量
    livenessProbe:       #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
      exec:              #对Pod容器内检查方式设置为exec方式
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:             #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:               #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0  #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0       #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0        #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged:false
    restartPolicy: [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
    nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
    imagePullSecrets:      #Pull镜像时使用的secret名称,以key:secretkey格式指定
    - name: string
    hostNetwork:false      #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    volumes:               #在该pod上定义共享存储卷列表
    - name: string         #共享存储卷名称 (volumes类型有很多种)
      emptyDir: {
    
    }         #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
      hostPath: string     #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
        path: string       #Pod所在宿主机的目录,将被用于同期中mount的目录
      secret:              #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:           #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
        name: string
        items:
        - key: string
          path: string   

3.2创建

create

kubectl create -f 加yaml文件路径
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

在这里插入图片描述

apply

以apply创建

kubectl apply -f 

在这里插入图片描述

create与apply区别

#使用apply进行两次构建
kubectl delete deploy nginx-deployment
kubectl apply -f nginx.yaml 
kubectl apply -f nginx.yaml 
#使用create进行两次构建
kubectl delete deploy nginx-deployment
kubectl create -f nginx.yaml 
kubectl create -f nginx.yaml 

在这里插入图片描述
apply在进行创建资源时,首先会扫描系统是否存在该资源,若不存在则创建,存在则进行更新
create则是直接进行创建资源,若存在该资源,则提示错误
所以我们可以使用apply进行资源配置更新

3.3 更新

基于yaml文件使用apply进行对pod资源更新
在这里插入图片描述

3.4查看/导出资源模板

kubectl create deploy nginx --image=nginx --replicas=3 -o yaml
#-o yaml 生成为yaml格式查看
#-o json 生成为json格式查看

#查看现有的资源的yaml
kubectl get deploy nginx -o yaml

#将模板导出
kubectl get deploy nginx -o yaml >nginx.yaml

在这里插入图片描述
在这里插入图片描述

四. 总结

在使用kubectl进行操作时,命令式主要是使用命令行的操作方式进行资源配置,而声明式则式基于yaml文件进行资源配置
create与run的区别,run创建的pod可以删除,create创建的需要删除pod控制器才可以完全删除pod
create与apply区别,create为创建,若系统含有该资源则报错,而apply创建时会检测已创建的资源与配置文件是否不一致,若不一致则会进行更新

猜你喜欢

转载自blog.csdn.net/weixin_44175418/article/details/126105537