轻松掌握k8s指令

211 阅读3分钟

kubectl

kubectl 是一支用来与 k8s 丛集沟通的二进位 (binary) 工具。我们可以运用 kubectl 来

  • 取得 k8s 各种不同资源资讯 (get: pod, service, ingress, ...)
  • 取得 k8s 各种不同资源的详细内容 (describe: pod, service, ingress, ...)
  • 配置 k8s 运行资源 (create, apply, rollout, ...)
  • 删除 k8s 运行资源 (delete)
  • 取得 log 档案 (logs)

kubectl 常用指令

1. 取得设定档

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/james/.minikube/ca.crt
    server: https://192.168.99.100:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /Users/james/.minikube/client.crt
    client-key: /Users/james/.minikube/client.key

2. 管理多个 k8s 丛集

  1. 想查询有哪些丛集可以切换:
$ kubectl config get-contexts
  1. 看目前正在管理的丛集
$ kubectl config current-context
  1. 取得丛集状态
$ kubectl cluster-info
  1. 切换丛集
$ kubectl config use-context [NAME]

3. 代理

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

需要与 k8s 沟通时,必须要先经由 api server 认证后才可以存取 k8s 资源。透过 kubectl proxy,kubectl 会与 api server 进行认证沟通。完成认证之后,就可以利用浏览器开启网址 localhost:8001/ui 使用 Dashboard 或透过 API 进行操作。如果想查询有哪些 APIs 可使用,可透过 curl 指令来查询。

4. 建立命名空间

$ kubectl create namespace [name]

在 k8s 中,命名空间 (namespace) 是很重要的观念。利用命名空间,你可以隔开两个不同的群组或环境,例如 deveop 表示开发环境 production 表示正是环境。而在不同环境内的物件并不会互相干扰,也可以有相同的名称。当 k8s 被建立的同时,会有三个命名空间产生,分别是default,kube-publickube-system。看字面应该也很容易知道 kube-public 与 kube-system 是 k8s 内部使用的。而 default 则是预设的命名空间,即在未指定部署空间时,所有的物件都会被部署在 default 内。如果你想要建立只要透过上面格式就可轻松建立。例如:建立一个develop

$ kubectl create namespace develop
namespace "develop" created

5. 取得资源

$ kubectl get [resources][namespace]

在 k8s 中有各式各样不同的资源物件。例如 Pod, Secret, Service, Namespace 等等,我们可以利用上述指令来查询丛集中现有的资源。

范例一查询命名空间 (namespace)

$ kubectl get namespace
NAME          STATUS    AGE
default       Active    4d
kube-public   Active    4d
kube-system   Active    4d

这里列出目前丛集内正在运行的三个命名空间,分别是default,kube-publickube-system

请注意,这个范例并没有指定 [namespace] 而是查询namespace

范例二查询在 develop 命名空间 (namespace) 中运行的 pod

kubectl get pods --namespace=develop
NAME                             READY     STATUS    RESTARTS   AGE
webserver-2736313971-t86gs       1/1       Running   2          29d
webserver-red-4210812574-tdlrz   1/1       Running   2          29d

这里列出在 develop 这个命名空间内

  • 有两个 pod 正在运行 (running)
  • 重启次数 (RESTARTS:2) 为 2 次
  • 已经运行了 29 天 (AGE:29d)
  • 而 pod 名称 (webserver-2736313971-t86gs) 在随后的取得资源详细内容的说明时会使用到。
  • 如果未指定命名空间 (namespace),则预设会查询 default 这个命名空间。
  • 在未进行任何部署之前,只有预设的 kube-system 与 kube-public 这两个命名空间能查到 Pod 资源。
  • 上述的例子中,已经有两个 Pod 被部署在 develop 的命名空间内,故 get pods 指令才能查询到资料,至于如何部署 Pod ,我们会在之后的文章再详细说明。目前仅就 kubectl 常用指令进行说明。你可以尝试看看把 [namespace] 修改成 kube-system 看看能看到什么!

范例三查询在 production 命名空间 (namespace) 中运行的 service

$ kubectl get services --namespace=production
NAME            CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      10.0.0.1     <none>        443/TCP        33d
webserver-svc   10.0.0.35    <nodes>       80:31771/TCP   29d

这里列出在 production 命名空间内

  • 共有两个 service 正在运行以及被分配的 ip 分别为 10.0.0.1 及 10.0.0.35

  • 其中一个 service (kubernetes)

    • 并未开放任何外部存取 ip (EXTERNAL-IP:)
    • 占用 443 port。
  • 另外一个 service (webserver-svc)

    • 可透过实体主机 (EXTERNAL-IP:) 经由 tcp 31771 port 来存取。
    • 80:31771/TCP 指的是 pod 中的 80 port 会对应到实体主机的 31771 port

6. 取得资源详细内容

$ kubectl describe [resources][namespace]

若想获得更详细的资源内容,我们可以利用上述指令来取得。根据上述 get 指令我们可以知道目前 develop 内共有两个 pod 正在运行,如果想获得更详细的 pod 资讯,可使用下列指令

$ kubectl describe pods webserver-2736313971-t86gs --namespace=develop

物件每次新建或重启都会被赋予不同的名字,请记得将 "webserver-2736313971-t86gs" 替换成正确的名称。另外你可以试着查查看运行在 kube-system 的 Pod

7. 删除资源

$ kubectl delete [resources][namespace]

若要删除丛集内的资源可透过上述指令进行删除

范例一删除 develop 命名空间内名为 webserver-2736313971-t86gs 的 pod

$ kubectl delete pods webserver-2736313971-t86gs --namespace=develop
pod "webserver-2736313971-t86gs" deleted

你应该不会想要删除 kube-system 里面的 Pod 吧?为什么不!试试看吧!你会发现 k8s 会再帮你重新建立喔!

范例二删除 production 命名空间内名为 webserver-svc 的 service

$ kubectl delete services webserver-svc --namespace=production
service "webserver-svc" deleted

8. 部署

$ kubectl apply -f [resources file/folder][namespace]

如果有 k8s .yaml 描述档案,我们可透过 apply 部署 k8s 资源

除了利用 apply 部署,还可以利用 run 或 expose 等等指令来建立物件。使用指令虽然快速方便,但如果需要同时部署多个物件会比较不方便。另外,使用 yaml 档也可以有个纪录,方便追踪除错。因此,之后的说明,会使用 yaml 为主。

底下是一个利用 run 来部署一个 nginx 的范例

$ kubectl run nginx --image=nginx
deployment "nginx" created

$ kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     1         1         1            1           4m

更完整的 kubectl 指令说明与资源类别,请参考kubectl 官方指令说明