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



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

    一. 资源管理方式

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

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

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

    二. 命令式对象管理

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

    命令格式:

    kubectl [commond] [type] [name] [flags]
    
    • 1

    常用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)类型:

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

    2.1 系统信息查询

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

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

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

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

    • master节点查看

    kubectl get componentstatuses
    #componentstatues可以缩写成cs
    kubectl get cs
    
    • 1
    • 2
    • 3

    在这里插入图片描述

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

    在这里插入图片描述

    2.2 命名空间操作

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

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

    • 创建命名空间
    kubectl create ns xy
    
    • 1

    在这里插入图片描述

    • 删除命名空间
    kubectl delete ns xy
    
    • 1

    在这里插入图片描述

    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]
    
    • 1
    • 2
    • 3
    kubectl run nginx --image=nginx:1.14 --port=80 
    #depoy-nginx为控制器名称
    #--image指定镜像文件
    #--port指定暴露的端口
    #服务暴露
    kubectl expose pod nginx --port=80 --type=NodePort
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    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为默认的名称空间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    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]
    
    • 1
    • 2
    • 3
    • 4
    kubectl expose deploy create-nginx --port=80 --type=NodePort
    #kubectl expose +pod管理器类型 +pod名称  +选项参数
    
    • 1
    • 2

    上文中其实已经使用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]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    命令格式:

    kubectl set image --help

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

    比如:

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

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    #查看rollout历史
    kubectl rollout history deploy create-nginx 
    #撤销上一次的rollout
    kubectl rollout undo deploy/create-nginx
    #查看rollout状态
    kubectl rollout status deploy create-nginx
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2.6 删除

    命令格式:

    # kubectl delete --help
    kubectl delete ([-f FILENAME] | [-k DIRECTORY] | TYPE [(NAME | -l label | --all)]) [options]
    
    • 1
    • 2
    #创建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
    #删除控制器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    三.声明式对象配置

    声明式对象配置与命令式对象配置相似,但是其命令更加的简洁且需要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   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    3.2创建

    create

    kubectl create -f 加yaml文件路径
    
    • 1
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    apply

    以apply创建

    kubectl apply -f 
    
    • 1

    在这里插入图片描述

    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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    四. 总结

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

  • 相关阅读:
    React嵌套路由的使用
    pytest + yaml 框架 -56. 输出日志优化+allure报告优化
    linux下数据库初始化密码
    BI系统打包Docker镜像及容器化部署的具体实现
    【项目测试报告】博客系统 + 在线聊天室
    类与类的加载
    HackTheBox - Starting Point -- Tier 0 ---Fawn
    写爬虫被字体反爬了怎么办?
    百度松果菁英班OJ【连载】
    CC0是什么,为什么它会改变NFT市场?
  • 原文地址:https://blog.csdn.net/weixin_44175418/article/details/126105537