Kubernetes 系统管理员不得不掌握的 9 个 kubectl 命令

Kubernetes 系统管理员不得不掌握的 9 个 kubectl 命令_第1张图片

kubectl 是 Kubernetes 的一个命令行管理工具,可用于 Kubernetes 上的应用部署和日常管理。本文列举了 9 个常见的 kubectl 命令,并总结了一些使用技巧,希望可以帮助系统管理员简化管理工作。 

 

Kubectl快速创建pod,暴露pod,用于测试


[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

 

Kubectl更新回滚镜像


kubectl set image deployment  nginx-deployment nginx=nginx:1.9.1
​kubectl rollout undo deployment nginx-deployment 
kubectl rollout history deployment nginx-deployment

 

kubectl创建测试pod(DNS解析)


[root@k8s-master ~]# kubectl run -it dns-test --image=busybox:1.28.4 -- sh

 

 

kubectl 查询,创建,编辑,删除资源


查看master组件状态:

kubectl get cs

[root@k8s-master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
etcd-0               Healthy     {"health":"true"}  

为什么这里没有正常,在1.8 1.9版本这两个组件没有将http://127.0.0.1:10252/healthz给监听,其实健康检查也是通过http去访问判断,但是本地端口没有监听,访问不到

[root@k8s-master ~]# ss -antp | grep 10252
[root@k8s-master ~]# ss -antp | grep 10251

在该文件当中这个参数没有正确配置,所以不能将其端口监听,注释即可

[root@k8s-master ~]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml 
#- --port=
[root@k8s-master ~]# vim /etc/kubernetes/manifests/kube-scheduler.yaml 
#   - --port=0
[root@k8s-master ~]# systemctl restart kubelet
[root@k8s-master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
etcd-0               Healthy   {"health":"true"}   
scheduler            Healthy   ok                  
controller-manager   Healthy   ok 

kubectl get node

可以查看到master的信息是因为master节点也部署了kubelet,kubelet就相当于每个节点的agent,如果没有部署kublete那么会显示Not ready

[root@k8s-master ~]# kubectl get node
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   4d23h   v1.19.0
k8s-node1    Ready       4d22h   v1.19.0
k8s-node2    Ready       4d22h   v1.19.0

kubectl cluster-info

查看集群详细信息:

[root@k8s-master ~]# kubectl cluster-info
Kubernetes master is running at https://192.168.179.102:6443
KubeDNS is running at https://192.168.179.102:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://192.168.179.102:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@k8s-master ~]# netstat -tpln | grep 6443
tcp6       0      0 :::6443                 :::*                    LISTEN      99711/kube-apiserve 

Kubectl get

使用 get 命令可以获取当前集群中可用的资源列表,包括:

  • Namespace

  • Pod

  • Node

  • Deployment

  • Service

  • ReplicaSet

每个 get 命令都能提供集群中可用资源的详细信息。例如 get nodes 命令就提供了 Kubernetes 的状态和版本。

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   9d    v1.18.0

这些命令大多数还具有简写版本。例如,要获取命名空间,可以使用 kubectl get namespaces 或者 kubectl get ns 命令:

$ kubectl get ns
NAME              STATUS   AGE
charts            Active   8d
default           Active   9d
kube-node-lease   Active   9d
kube-public       Active   9d
kube-system       Active   9d

每个 get 命令都可以使用 –namespace 或 -n 参数指定对应的命名空间。这点对于查看 kube-system 中的 Pods 会非常有用,因为这些 Pods 是 Kubernetes 自身运行所需的服务。

$ kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-mjptx           1/1     Running   2          9d
coredns-66bff467f8-t2xcz           1/1     Running   2          9d
etcd-minikube                      1/1     Running   1          9d
kube-apiserver-minikube            1/1     Running   1          9d
kube-controller-manager-minikube   1/1     Running   2          9d
kube-proxy-rpc9d                   1/1     Running   1          9d
kube-scheduler-minikube            1/1     Running   2          9d
storage-provisioner                1/1     Running   1          9d

Kubectl create

可以查询资源后,下一步是创建资源。我们可以用 kubectl 在集群中创建任何类型的资源,包括:

  • Service

  • Cronjob

  • Deployment

  • Job

  • Namespace(ns)

其中,一些资源的创建需要设置配置文件、命名空间以及资源名称。例如,创建命名空间就需要一个额外参数来指定命名空间。

$ kubectl create ns hello-there
namespace/hello-there created

Linux 里可以使用 cron 创建定时运行的任务。同样的,这里我们使用 cronjob 每五秒钟返回一次“hello”。

$ kubectl create cronjob my-cron --image=busybox --schedule="*/5 * * * *" -- echo hello
cronjob.batch/my-namespaced-cron created

我们也可以使用 cronjob 的简写版本 cj

$ kubectl create cj my-existing-cron --image=busybox --schedule="*/15 * * * *" -- echo hello
cronjob.batch/my-existing-cron created

Kubectl edit

当我们创建好资源后,如果需要修改,该怎么办?这时候就需要 kubectl edit 命令了。

我们可以用这个命令编辑集群中的任何资源。它会打开默认文本编辑器。如果我们要编辑现有的 cron job,则可以执行:

$ kubectl edit cronjob/my-existing-cron

我们要编辑的配置如下:​​​

原本调度间隔设置为 15 秒:

我们将其更改为每 25 秒:

Kubernetes 系统管理员不得不掌握的 9 个 kubectl 命令_第2张图片

编写完成后,可以看到修改已生效。

$ kubectl edit cronjob/my-existing-cron
cronjob.batch/my-existing-cron edited

另外,我们可以通过 KUBE_EDITOR 命令来使用其他编辑器。

$ KUBE_EDITOR="nano" kubectl edit cronjob/my-existing-cron

Kubectl delete

学会了以上命令后,下面我们将进行删除操作。刚刚编辑的 cronjob 是两个 cronjobs 之一,现在我们删除整个资源。

$ kubectl delete cronjob my-existing-cron
cronjob.batch "my-existing-cron" deleted

需要注意的是,如果不知道资源是否有关联信息,最好不要删除。因为删除后无法恢复,只能重新创建。

Kubectl apply

上文提到,某些命令需要配置文件,而 apply 命令可以在集群内调整配置文件应用于资源。虽然也可以通过命令行 standard in (STNIN) 来完成,但 apply 命令更好一些,因为它可以让你知道如何使用集群,以及要应用哪种配置文件。作为示例,下文会将 Helm 的基于角色的访问控制(RBAC)配置用于服务帐户。

$ kubectl apply -f commands.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

我们可以应用几乎任何配置,但是一定要明确所要应用的配置,否则可能会引发意料之外的后果。

 

使用kubectl对kebernetes故障排除


Kubectl describe

describe 命令可以查看资源的详细信息。比较常见的用法是查看一个 Pod 或节点信息,以检查是否有异常、资源是否耗尽。(可以查看任何资源信息和docker inspect一样)

该命令可以查看的资源包括:

  • Nodes

  • Pods

  • Services

  • Deployments

  • Replica sets

  • Cronjobs

举个例子,我们用 describe 命令查看上文集群中 cronjob 的详细信息。

$ kubectl describe cronjob my-cron

以下是部分信息:

Name:                         my-cron
Namespace:                    default
Labels:                       
Annotations:                  
Schedule:                     */5 * * * *
Concurrency Policy:           Allow
Suspend:                      False
Successful Job History Limit: 3
Failed Job History Limit:     1
Starting Deadline Seconds:    
Selector:                     
Parallelism:                  
Completions:                  
Pod Template:
  Labels: 
  Containers:
   my-cron:
    Image:     busybox
    Port:      
    Host Port: 

Kubectl logs

虽然 describe 命令可以让你知道 Pod 内部应用程序发生的事,但 logs 命令可以提供 Kubernetes 中 Pod 的更多详细信息。了解这种区别可以帮助开发者更好地对应用程序内部以及 Kubernetes 内部发生的问题,并进行故障排除,这二者往往并不相同。

$ kubectl logs cherry-chart-88d49478c-dmcfv -n charts

以上命令的部分输出结果如下:

172.17.0.1 - - [19/Apr/2020:16:01:15 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:20 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:25 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:30 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:35 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:40 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:45 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:50 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
172.17.0.1 - - [19/Apr/2020:16:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"

grep 命令可以过滤无关信息或查看特定事件。例如,下面的 kube-probe 可能是无关信息,我们用 grep 命令对其进行过滤。

$ kubectl logs cherry-chart-88d49478c-dmcfv -n charts | grep -vie kube-probe
127.0.0.1 - - [10/Apr /2020:23:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0" “-”

在有些部署中,存在一个 Pod 有多个容器的情况,因此我们可以在 logs 命令中使用 -c <容器名称>,以查找指定容器的日志。

Kubectl exec

与 docker exec 命令相似,exec 命令也可以在容器中直接对应用程序进行故障排除。尤其当 Pod 的日志无法定位问题时, 它会特别好用。另外要注意的是,使用 exec 命令时,必须要以 Pod 内使用的 shell 作为命令的最后一个参数。

$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash
root@cherry-chart-88d49478c-dmcfv:/#

Kubectl cp

Kubectl cp 命令与 Linux cp 命令类似,用于容器之间复制文件和目录。另外,该命令还能在自动化失败等紧急情况下进行恢复备份。

以下是将本地文件拷贝到容器的示例。命令格式为:kubectl cp

$ kubectl cp commands_copy.txt charts/cherry-chart-88d49478c-dmcfv:commands.txt
$ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash
root@cherry-chart-88d49478c-dmcfv:/# ls
bin  boot  commands.txt  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

下面是将容器内的文件拷贝到本地计算机上的示例。命令格式为:kubectl cp

​​​​​​​$ kubectl cp charts/cherry-chart-88d49478c-dmcfv:commands.txt commands_copy.txt

$ ls
commands_copy.txt

 

YAML文件中字段太多,记不住怎么办


• 用create命令生成

kubectl create deployment nginx --image=nginx:1.16 -n default --dry-run=client -o yaml > my-deploy.yaml(只要这个资源可以在命令行创建都可以使用dry run加上-o将其导出)

• 用get命令导出

kubectl get deployment nginx -o yaml > my-deploy.yaml(别人部署的资源你可以使用其查看)

• Pod容器的字段拼写忘记了

kubectl explain pods.spec.containers
kubectl explain deployment

 

你可能感兴趣的:(k8s,基础篇,kubernetes)