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 丛集
- 想查询有哪些丛集可以切换:
$ kubectl config get-contexts
- 看目前正在管理的丛集
$ kubectl config current-context
- 取得丛集状态
$ kubectl cluster-info
- 切换丛集
$ 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-public与kube-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-public与kube-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 官方指令说明