• kubernetes 命令使用


    中文文档

    https://www.kubernetes.org.cn/doc-30

    get

    kubectl get nodes         #获取集群中有多少节点

    kubectl get type1,type2

    kubectl get type name --output json/yaml    #显示详细信息

    kubectl get type --selector key1=value1,key2=value2    #通过label标筛选api对象

    kubectl get type name --output go-template=..       #通过go template提取指定信息
    kubectl get po -o wide         #获取pod运行在哪个节点上的信息。

    [root@k8s_master ~]# kubectl get po --all-namespaces      #获取所有pod

    [root@k8s_master ~]# kubectl get namespaces        ###获取namespace 信息

    可以使用"kubectl get rc --all-namespaces”, “kubectl get svc”, “kubectl get nodes”等获取其他resource信息。

     #以json格式输出pod的详细信息

    kubectl get po <podname> -o json 
    kubectl get rc/service/deployments --all-namespacces #获取所有的replication controller/service/部署

    kubectl get pods -o=custom=columns-file=aa.txt    #将结果输出到文件

    总结版

    # Get commands with basic output
    $ kubectl get services                          # 列出所有 namespace 中的所有 service
    $ kubectl get pods --all-namespaces             # 列出所有 namespace 中的所有 pod
    $ kubectl get pods -o wide                      # 列出所有 pod 并显示详细信息
    $ kubectl get deployment my-dep                 # 列出指定 deployment
    $ kubectl get pods --include-uninitialized      # 列出该 namespace 中的所有 pod 包括未初始化的
    
    # 使用详细输出来描述命令
    $ kubectl describe nodes my-node
    $ kubectl describe pods my-pod
    
    $ kubectl get services --sort-by=.metadata.name # List Services Sorted by Name
    
    # 根据重启次数排序列出 pod
    $ kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
    
    # 获取所有具有 app=cassandra 的 pod 中的 version 标签
    $ kubectl get pods --selector=app=cassandra rc -o 
      jsonpath='{.items[*].metadata.labels.version}'
    
    # 获取所有节点的 ExternalIP
    $ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
    
    # 列出属于某个 PC 的 Pod 的名字
    # “jq”命令用于转换复杂的 jsonpath,参考 https://stedolan.github.io/jq/
    $ sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "(.key)=(.value),"')%?}
    $ echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})
    
    # 查看哪些节点已就绪
    $ JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' 
     && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"
    
    # 列出当前 Pod 中使用的 Secret
    $ kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

    describe

    describe类似于get,同样用于获取resource的相关信息。不同的是,get获得的是更详细的resource个性的详细信息,describe获得的是resource集群相关的信息。

    语法:
    kubectl describe type name (type为资源对象类型,name为名称)

    #
    显示node信息 kubectl describe nodes <node-name> #显示pod详细信息,如果不显示可以加上 --namespace=<namespace名称> kubectl describe pod <pod-name> #显示由rc管理的pod信息 kubectl describe pods <rc-name>

    示例

    [root@k8s_master ~]# kubectl describe po nginx-controller-shs0z

    create 

    kubectl create -f nginx-rc.yaml -f nginx-service.yaml     #连续创建多个

    [root@k8s_master ~]# more nginx-rc.yaml 
    apiVersion: v1 
    kind: ReplicationController 
    metadata: 
    name: nginx-controller 
    spec: 
    replicas: 2 
    selector: 
    name: nginx 
    template: 
    metadata: 
    labels: 
    name: nginx 
    spec: 
    containers: 
    - name: nginx 
    image: nginx 
    ports: 
    - containerPort: 80

    创建ReplicationController(rc),rc会创建两个副本,创建后,使用“kubectl get rc”可以看到一个名为nginx-controller的ReplicationController将被创建,同时“kubectl get po”的结果中会多出两个前缀为“nginx-controller-”的pod

    另一种方法

    cat xxx.yaml | kubectl create -f -

    replace更新pod

    replace命令用于对已有资源进行更新、替换。如前面create中创建的nginx,当我们需要更新resource的一些属性的时候,如果修改副本数量,增加、修改label,更改image版本,修改端口等。都可以直接修改原yaml文件,然后执行replace命令

    kubectl replace -f rc-nginx.yaml

    名字不能被更更新。另外,如果是更新label,原有标签的pod将会与更新label后的rc断开联系,有新label的rc将会创建指定副本数的新的pod,但是默认并不会删除原来的pod。所以此时如果使用get po将会发现pod数翻倍,进一步check会发现原来的pod已经不会被新rc控制

     

    更新资源

    $ kubectl rolling-update frontend-v1 -f frontend-v2.json           # 滚动更新 pod frontend-v1
    $ kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2  # 更新资源名称并更新镜像
    $ kubectl rolling-update frontend --image=image:v2                 # 更新 frontend pod 中的镜像
    $ kubectl rolling-update frontend-v1 frontend-v2 --rollback        # 退出已存在的进行中的滚动更新
    $ cat pod.json | kubectl replace -f -                              # 基于 stdin 输入的 JSON 替换 pod
    
    # 强制替换,删除后重新创建资源。会导致服务中断。
    $ kubectl replace --force -f ./pod.json
    
    # 为 nginx RC 创建服务,启用本地 80 端口连接到容器上的 8000 端口
    $ kubectl expose rc nginx --port=80 --target-port=8000
    
    # 更新单容器 pod 的镜像版本(tag)到 v4
    $ kubectl get pod mypod -o yaml | sed 's/(image: myimage):.*$/1:v4/' | kubectl replace -f -
    
    $ kubectl label pods my-pod new-label=awesome                      # 添加标签
    $ kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq       # 添加注解
    $ kubectl autoscale deployment foo --min=2 --max=10                # 自动扩展 deployment “foo”

    patch

    如果一个容器已经在运行,这时需要对一些容器属性进行修改,又不想删除容器,或不方便通过replace的方式进行更新。kubernetes还提供了一种在容器运行时,直接对容器进行修改的方式,就是patch命令。
    如前面创建pod的label是app=nginx-2,如果在运行过程中,需要把其label改为app=nginx-3,这patch命令如下:

    kubectl patch pod rc-nginx-2-kpiqt -p '{"metadata":{"labels":{"app":"nginx-3"}}}'

    使用策略合并补丁并修补资源。

    $ kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' # 部分更新节点
    
    # 更新容器镜像; spec.containers[*].name 是必须的,因为这是合并的关键字
    $ kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
    
    # 使用具有位置数组的 json 补丁更新容器镜像
    $ kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'
    
    # 使用具有位置数组的 json 补丁禁用 deployment 的 livenessProbe
    $ kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'

    Delete

    根据resource名或label删除resource。

    kubectl delete -f rc-nginx.yaml 
    kubectl delete po rc-nginx-btv4j     #默认情况下,如果删除了会立马在重新启动一个(由创建时启动多少个决定),所以应该直接删除rc和service deployment,才会彻底删除pod
    kubectl delete po -l app=nginx-2    #删除 标签为 app=nginx-2的容器  

    kubectl delete pods --all       #删除所有pod

    kubectl delete service <service—name>  #删除某个服务,同样适用于 rc、pod、deployment

    kubectl delete rc --all  #默认删除所有的rc

    删除操作

    $ kubectl delete -f ./pod.json                                              # 删除 pod.json 文件中定义的类型和名称的 pod
    $ kubectl delete pod,service baz foo                                        # 删除名为“baz”的 pod 和名为“foo”的 service
    $ kubectl delete pods,services -l name=myLabel                              # 删除具有 name=myLabel 标签的 pod 和 serivce
    $ kubectl delete pods,services -l name=myLabel --include-uninitialized      # 删除具有 name=myLabel 标签的 pod 和 service,包括尚未初始化的
    $ kubectl -n my-ns delete po,svc --all                                      # 删除 my-ns namespace 下的所有 pod 和 serivce,包括尚未初始化的

    logs

    logs命令用于显示pod运行中,容器内程序输出到标准输出的内容。跟docker的logs命令类似。如果要获得tail -f 的方式,也可以使用-f选项。

    kubectl logs rc-nginx-2-kpiqt (pod name) --namespace=kube-system

    kubectl logs -f <pod-name> -c <container-name>     #查看容器的日志,相当于 tail -f

    --since|--since-time #打印指定时间日志 --tail 打印最新日志

    rolling-update

    rolling-update是一个非常重要的命令,对于已经部署并且正在运行的业务,rolling-update提供了不中断业务的更新方式。rolling-update每次起一个新的pod,等新pod完全起来后删除一个旧的pod,然后再起一个新的pod替换旧的pod,直到替换掉所有的pod。
    rolling-update需要确保新的版本有不同的name,Version和label,否则会报错 。

    kubectl rolling-update rc-nginx-2 -f rc-nginx.yaml

    如果在升级过程中,发现有问题还可以中途停止update,并回滚到前面版本

    kubectl rolling-update rc-nginx-2 —rollback

    实例:

    v1版本

    #cat test_rc_v1.yaml
    apiVersion: v1 kind: ReplicationController metadata: name: myapp
    -v1 spec: replicas: 10 selector: app: myapp version: v1 template: metadata: labels: app: myapp version: v1 spec: containers: - name: myapp command: - sleep - "3600" image: 10.10.10.11:5000/busybox:v1      #主要看镜像,v1版本 imagePullPolicy: IfNotPresent restartPolicy: Always

    创建

    kubectl create -f my-app-v1-rc.yaml

    v2版本

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: myapp-v2
    spec:
      replicas: 10
      selector:
        app: myapp
        version: v2
      template:
        metadata:
          labels:
            app: myapp
            version: v2
        spec:
          containers:
          - name: myapp
            command:
              - sleep
              - "3600"
            image: 10.10.10.11:5000/busybox:v2    #镜像v2版本
            imagePullPolicy: IfNotPresent
          restartPolicy: Always

    滚动升级

    kubectl rolling-update myapp-v1 -f my-app-v2-rc.yaml --update-period=10s  #myapp-v1为pod名称,在v1.yaml里已经指定了,update-peroid=10s表示每隔10秒增加副本的数量

    版本回退

    # kubectl rolling-update myapp-v1 -f my-app-v2-rc.yaml --update-period=10s --rollback

    label

    annotate

     

    scale

    scale用于程序在负载加重或缩小时副本进行扩容或缩小,如前面创建的nginx有两个副本,可以轻松的使用scale命令对副本数进行扩展或缩小。

    扩展副本数到4:
    kubectl scale rc rc-nginx-3 —replicas=4     #rc-nginx-3(rc name)
    
    重新缩减副本数到2:
    kubectl scale rc rc-nginx-3 —replicas=2
    $ kubectl scale --replicas=3 rs/foo                                 # Scale a replicaset named 'foo' to 3
    $ kubectl scale --replicas=3 -f foo.yaml                            # Scale a resource specified in "foo.yaml" to 3
    $ kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # If the deployment named mysql's current size is 2, scale mysql to 3
    $ kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # Scale multiple replication controllers

    autoscale

    autoscale命令提供了自动根据pod负载对其副本进行扩缩的功能。
    autoscale命令会给一个rc指定一个副本数的范围,在实际运行中根据pod中运行的程序的负载自动在指定的范围内对pod进行扩容或缩容。如前面创建的nginx,可以用如下命令指定副本范围在1~4

    kubectl autoscale rc rc-nginx-3 —min=1 —max=4

    attch

    attach命令类似于docker的attach命令,可以直接查看容器中以daemon形式运行的进程的输出,效果类似于logs -f,退出查看使用ctrl-c。
    如果一个pod中有多个容器,要查看具体的某个容器的的输出,需要在pod名后使用-c containers name指定运行的容器。如下示例的命令为查看kube-system namespace中的nginx-controller-shs0z pod中的nginx容器的输出。

    例:

    [root@k8s_master ~]# kubectl attach nginx-controller-shs0z -c nginx -namespace=kube-system
    
    nginx  为容器名称
    nginx-controller-shs0z 为pod名称
    - namespace=kube-system    namespace名称

    kubectl attch mypod mycontainer    #进入容器

    exec

    exec命令同样类似于docker的exec命令,为在一个已经运行的容器中执行一条shell命令,如果一个pod容器中,有多个容器,需要使用-c选项指定容器。 方法与attch一样

    #执行pod的date命令,默认使用pod中第一个容器执行
    kubectl exec <pod-name> -- date
    
    #指定pod中某个容器执行date命令
    kubectl exec <pod-name> -c <container-name> -- date
    
    #通过bash获得pod中more容器的tty,相当于登录容器
    kubectl exec -it <pod-name> -c <container-name> /bin/bash

    kubectl port-forward命令可以为pod设置端口转发,通过在本机监听指定端口,访问这些端口的请求将会被转发到Pod的容器中对应的端口上

    kubectl port-forward mypod 80:80 443:443    #此命令需要在node上安装nsenter和socat

    apply

    apply命令主要是更新api对象

    kubectl apply -f xxx.yaml
    
    cat xxx.yaml | kubectl apply -f -

    run

    类似于docker的run命令,直接运行一个image。

    kubectl run nginx --image nginx            #创建rc,默认副本数为1
    
    kubectl run nginx --image nginx  --replicas 2   --labels key=value
    
    kubectl run 只可以设置一个容器,支持的容器属性设置有
    
    --command         容器的启动命令
    
    --port                 容器内部的端口
    
    --hostport            容器映射到宿主机的端口
    
    --env                 容器的环境变量
    
    --requests            容器的资源请求规格(min)
    
    --limits                 容器的资源限制规格(max)

    expose

    kubectl expose命令可以用来创建service,创建的时候需要指定pod rc或者service,从中提取label来为新建的service配置label selector

    kubectl expose pod valid-pod --port=444 --name=frontend
    
    kubectl expose rc nginx --port=80 --targetport=8000
    
    kubectl expose service nginx --port=443 --targetport=8443 --name=nginx-https

     

    与运行中的pod交互

    $ kubectl logs my-pod                                 # dump 输出 pod 的日志(stdout)
    $ kubectl logs my-pod -c my-container                 # dump 输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用)
    $ kubectl logs -f my-pod                              # 流式输出 pod 的日志(stdout)
    $ kubectl logs -f my-pod -c my-container              # 流式输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用)
    $ kubectl run -i --tty busybox --image=busybox -- sh  # 交互式 shell 的方式运行 pod
    $ kubectl attach my-pod -i                            # 连接到运行中的容器
    $ kubectl port-forward my-pod 5000:6000               # 转发 pod 中的 6000 端口到本地的 5000 端口
    $ kubectl exec my-pod -- ls /                         # 在已存在的容器中执行命令(只有一个容器的情况下)
    $ kubectl exec my-pod -c my-container -- ls /         # 在已存在的容器中执行命令(pod 中有多个容器的情况下)
    $ kubectl top pod POD_NAME --containers               # 显示指定 pod 和容器的指标度量

    与节点和集群交互

    $ kubectl cordon my-node                                                # 标记 my-node 不可调度
    $ kubectl drain my-node                                                 # 清空 my-node 以待维护
    $ kubectl uncordon my-node                                              # 标记 my-node 可调度
    $ kubectl top node my-node                                              # 显示 my-node 的指标度量
    $ kubectl cluster-info                                                  # 显示 master 和服务的地址
    $ kubectl cluster-info dump                                             # 将当前集群状态输出到 stdout                                    
    $ kubectl cluster-info dump --output-directory=/path/to/cluster-state   # 将当前集群状态输出到 /path/to/cluster-state
    
    # 如果该键和影响的污点(taint)已存在,则使用指定的值替换
    $ kubectl taint nodes foo dedicated=special-user:NoSchedule
  • 相关阅读:
    Memcached安装
    BarCode条形码生成库
    WebAPI示例
    JDK安装目录分析-两个jre和三个lib
    JDK安装与环境变量配置
    【Selenium专题】高亮显示页面元素
    cannot be resolved to a type (Java)
    Java中获取运行代码的类名、方法名
    【Selenium专题】 FAQ_对象识别_Compound class names are not supported
    Html5新标签解释及用法
  • 原文地址:https://www.cnblogs.com/FRESHMANS/p/8444098.html
Copyright © 2020-2023  润新知