命令行工具 (kubectl)

Kubernetes 提供 kubectl 是使用 Kubernetes API 与 Kubernetes
集群的控制面进行通信的命令行工具。

这个工具叫做 kubectl。更多命令

自动补全

在任意节点使用kubectl

  1. 将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中

    1
    scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes
  2. 在对应的服务器上配置环境变量

    1
    2
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    source ~/.bash_profile

资源操作

  1. 创建对象

    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
    $ kubectl create -f ./my-manifest.yaml           # 创建资源
    $ kubectl create -f ./my1.yaml -f ./my2.yaml # 使用多个文件创建资源
    $ kubectl create -f ./dir # 使用目录下的所有清单文件来创建资源
    $ kubectl create -f https://git.io/vPieo # 使用 url 来创建资源
    $ kubectl run nginx --image=nginx # 启动一个 nginx 实例
    $ kubectl explain pods,svc # 获取 pod 和 svc 的文档

    # 从 stdin 输入中创建多个 YAML 对象
    $ cat <<EOF | kubectl create -f -
    apiVersion: v1
    kind: Pod
    metadata:
    name: busybox-sleep
    spec:
    containers:
    - name: busybox
    image: busybox
    args:
    - sleep
    - "1000000"
    ---
    apiVersion: v1
    kind: Pod
    metadata:
    name: busybox-sleep-less
    spec:
    containers:
    - name: busybox
    image: busybox
    args:
    - sleep
    - "1000"
    EOF

    # 创建包含几个 key 的 Secret
    $ cat <<EOF | kubectl create -f -
    apiVersion: v1
    kind: Secret
    metadata:
    name: mysecret
    type: Opaque
    data:
    password: $(echo "s33msi4" | base64)
    username: $(echo "jane" | base64)
    EOF
  2. 显示和查找资源

    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
    # 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
  3. 更新资源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $ 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”
  4. 修补资源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ 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"}]'
  5. 编辑资源

    1
    2
    $ kubectl edit svc/docker-registry                      # 编辑名为 docker-registry 的 service
    $ KUBE_EDITOR="nano" kubectl edit svc/docker-registry # 使用其它编辑器
  6. scale资源

    1
    2
    3
    4
    $ 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
  7. 删除资源

    1
    2
    3
    4
    5
    $ 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,包括尚未初始化的

Pod与集群

  1. 与运行的Pod交互

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ 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 和容器的指标度量
  2. 与节点和集群交互

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ 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

资源类型与别名

资源类型 缩写别名
clusters
componentstatuses cs
configmaps cm
daemonsets ds
deployments deploy
endpoints ep
event ev
horizontalpodautoscalers hpa
ingresses ing
jobs
limitranges limits
namespaces ns
networkpolicies
nodes no
statefulsets
persistentvolumeclaims pvc
persistentvolumes pv
pods po
podsecuritypolicies psp
podtemplates
replicasets rs
replicationcontrollers rc
resourcequotas quota
cronjob
secrets
serviceaccount sa
services svc
storageclasses
thirdpartyresources
  • pods po
  • deployments deploy
  • serveices svc
  • namespace ns
  • nodes no

格式化输出

  • 输出json格式 -s json
  • 仅打印资源名称 -o name
  • 以纯文本格式输出所有信息 -o wide
  • 输出yaml格式 -o yaml