zoukankan      html  css  js  c++  java
  • Kubernetes 命令行工具之kubctl

    我们在kubernetes集群中大部分的操作都是通过kubectl来实现的

    1、何为kubectl

    从用户角度来说,kubectl就是控制Kubernetes的驾驶舱,它允许你执行所有可能的Kubernetes操作;
    从技术角度来看,kubectl就是Kubernetes API的一个客户端。

    Kubernetes API是一个HTTP REST API服务,该API服务才是Kubernetes的真正用户接口,Kubernetes通过该API能够进行实际的控制,也就是说每个Kubernetes的操作都会通过API接口暴露出去,当然也就可以通过对这些API接口进行HTTP请求来执行相应的操作。

    so,kubectl最主要的工作就是执行Kubernetes API的HTTP请求

    2、Kubectl基本使用

    2.1、命令补全

    一般来说,命令补全是通过执行一个补全脚本的 shell 功能,补全脚本也是一个 shell 脚本,用于定义特定命令的补全功能。

    kubectl 在 Bash 和 Zsh 下可以使用下面的命令自动生成并打印出补全脚本:

    $ kubectl completion bash
    # 或者
    $ kubectl completion zsh
    

    理论上在合适的 shell 中 source 上面命令的输出就可以开启 kubectl 的命令补全功能了

    以Centos为例:

    $ kubectl completion bash  >>/etc/profile
    $ source /etc/profile
    

    2.2、快速查找资源

    我们在使用YAML文件创建资源时,需要知道这些资源的一些字段和含义,一个比较有效的方法就是去API文档中查看这些资源对象完整规范定义

    但是如果每次要查找某些内容的时候都切换到浏览器去查询也是很麻烦的一件事情,所以,kubectl 为我们提供了一个kubectl explain 命令,可以在终端中直接打印出来所有资源的规范定义。kubectl explain命令的用法如下所示:

    $ kubectl explain deployment.spec
    

    默认情况下,kubectl explain命令只会显示属性的一级数据,我们可以使用--recursive参数来显示整个属性的数据:

    $ kubectl explain deployment.spec --recursive
    

    该命令会将 deployment.spec 属性下面所有的规范都打印出来。

    如果你不太确定可以使用kubectl explain的资源名,可以使用下面的命令来获取所有资源名称:

    $ kubectl api-resources
    

    该命令会线上资源名称的复数形式(比如显示 deployments 而不是 deployment),还会显示一个资源的简写(比如 deploy),不过不用担心,我们可以用任意一个名称来结合kubectl explain命令使用的:

    $ kubectl explain deployments.spec
    # 或者
    $ kubectl explain deployment.spec
    # 或者
    $ kubectl explain deploy.spec
    

    2.3、使用自定义输出格式

    kubectl get命令(读取集群资源)的默认输出格式如下:

    $ kubectl get pods
    NAME                                   READY   STATUS    RESTARTS   AGE
    busybox                                1/1     Running   2          14h
    nginx-app-deployment-9dfdc4785-6w92j   1/1     Running   0          26s
    nginx-app-deployment-9dfdc4785-qphsd   1/1     Running   0          26s
    

    上面的输出结果是一种比较友好的格式,但是它包含的信息比较有限,比如上面只显示了 Pod 资源中的一些信息(与完整资源定义相比)。

    所以这个时候就有自定义输出格式的用武之地了,它允许我们自由定义要显示的列和数据,可以选择要在输出中显示为单独列的资源的任何字段。

    自定义列输出的用法如下

    -o custom-columns=<header>:<jsonpath>[,<header>:<jsonpath>]...
    
    需要将每个输出列定义为<header>:<jsonpath>这样的键值对:
    <header>是列的名称,可以选择任何想要显示的内容。
    <jsonpath>是一个选择资源属性的表达式。
    

    我们来看一个简单的例子:

    $ kubectl get pods -o custom-columns="NAME:metadata.name"
    NAME
    busybox
    nginx-app-deployment-9dfdc4785-6w92j
    nginx-app-deployment-9dfdc4785-qphsd
    

    3、陈述式管理资源

    上面说完了kubectl的基本使用,这里来说如何使用kubectl实现资源的陈述式管理。

    3.1、管理namespace资源

    namespace也称为名称空间,可简写ns,默认名称空间:default

    1.查看namespace

    $ kubectl get namespace
    NAME              STATUS   AGE
    default           Active   18h
    kube-node-lease   Active   18h
    kube-public       Active   18h
    kube-system       Active   18h
    

    2.查看指定名称空间

    $ kubectl get all [-n default]
    

    3.创建名称空间

    $ kubectl create ns app
    namespace/app created
    

    4.删除名称空间

    $ kubectl delete ns app
    namespace "app" deleted
    

    3.2、管理Deployment资源

    1.创建nginx

    $ kubectl create deployment nginx-dp --image=nginx:1.7.9 -n kube-public
    deployment.apps/nginx-dp created
    

    2.简单查看

    $ kubectl get deployment -n kube-public
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-dp   1/1     1            1           6s
    

    3.扩展查看

    $ kubectl get deployment -n kube-public -o wide
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES        SELECTOR
    nginx-dp   1/1     1            1           3m24s   nginx        nginx:1.7.9   app=nginx-dp
    

    4.详细查看

    $ kubectl describe deployment nginx-dp -n kube-public
    

    3.3、管理pod资源

    1.查看pod资源

    $ kubectl get pods -n kube-public
    NAME                        READY   STATUS    RESTARTS   AGE
    nginx-dp-6599b486d9-sj47f   1/1     Running   0          41m
    

    2.进入pod资源

    $ kubectl exec -it nginx-dp-6599b486d9-sj47f bash -n kube-public
    root@nginx-dp-6599b486d9-sj47f:/# ip add
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
        link/ether 02:42:ac:07:16:03 brd ff:ff:ff:ff:ff:ff
        inet 172.7.22.3/24 brd 172.7.22.255 scope global eth0
           valid_lft forever preferred_lft forever
    

    当然你也可以通过docker exec 进入容器

    3.删除pod资源(重启)

    $ kubectl delete pod nginx-dp-6599b486d9-sj47f -n kube-public
    pod "nginx-dp-6599b486d9-sj47f" deleted
    
    $ kubectl get pods -n kube-public
    NAME                        READY   STATUS    RESTARTS   AGE
    nginx-dp-6599b486d9-tnr4h   1/1     Running   0          4s
    

    使用watch观察pod重建状态变化

    强制删除参数:--force --grace-period=0

    4.删除deployment

    $ kubectl delete deployment nginx-dp -n kube-public
    deployment.extensions "nginx-dp" deleted
    

    3.4、管理Service资源

    1.创建service

    $ kubectl create deployment nginx-dp --image=nginx:1.7.9 -n kube-public	
    deployment.apps/nginx-dp created
    $ kubectl expose deployment nginx-dp --port=80 -n kube-public 
    service/nginx-dp exposed
    

    2.查看service

    $ kubectl describe svc nginx-dp -n kube-public
    Name:              nginx-dp
    Namespace:         kube-public
    Labels:            app=nginx-dp
    Annotations:       <none>
    Selector:          app=nginx-dp
    Type:              ClusterIP
    IP:                192.168.241.190
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         172.7.22.3:80
    Session Affinity:  None
    Events:            <none>
    
  • 相关阅读:
    struts2文件上传(多文件)文件下载
    Struts2拦截器
    MySQL中修改多个数据表的字段拼接问题
    Struts2接受请求参数三种常用方法
    struts2 配置详解
    Struts2入门问题
    Struts2启动问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    Ajax和json一道基本的练习题
    jQuery事件--blur()和focus()
    jQuery事件--mouseover()、mouseout()、mouseenter()和mouseleave()
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/12809789.html
Copyright © 2011-2022 走看看