我們在kubernetes集群中大部分的操作都是通過kubectl
來實現的
1、何為kubectl
從用戶角度來說,kubectl就是控制Kubernetes的駕駛艙,它允許你執行所有可能的Kubernetes操作;
從技術角度來看,kubectl就是Kubernetes API的一個客戶端。
Kubernetes API是一個HTTP REST API服務,該API服務才是Kubernetes的真正用戶接口,Kubernetes通過該API能夠進行實際的控制,也就是說每個Kubernetes的操作都會通過API接口暴露出去,當然也就可以通過對這些API接口進行HTTP請求來執行相應的操作。
so,kubectl最主要的工作就是執行Kubernetes API的HTTP請求
2、Kubectl基本使用
2.1、命令補全
一般來說,命令補全是通過執行一個補全腳本的 shell 功能,補全腳本也是一個 shell 腳本,用於定義特定命令的補全功能。
kubectl 在 Bash 和 Zsh 下可以使用下面的命令自動生成並打印出補全腳本:
$ kubectl completion bash
# 或者
$ kubectl completion zsh
理論上在合適的 shell 中 source 上面命令的輸出就可以開啟 kubectl 的命令補全功能了
以Centos為例:
$ kubectl completion bash >>/etc/profile
$ source /etc/profile
2.2、快速查找資源
我們在使用YAML文件創建資源時,需要知道這些資源的一些字段和含義,一個比較有效的方法就是去API文檔中查看這些資源對象完整規范定義
但是如果每次要查找某些內容的時候都切換到瀏覽器去查詢也是很麻煩的一件事情,所以,kubectl 為我們提供了一個kubectl explain
命令,可以在終端中直接打印出來所有資源的規范定義。kubectl explain命令的用法如下所示:
$ kubectl explain deployment.spec
默認情況下,kubectl explain
命令只會顯示屬性的一級數據,我們可以使用--recursive參數來顯示整個屬性的數據:
$ kubectl explain deployment.spec --recursive
該命令會將 deployment.spec 屬性下面所有的規范都打印出來。
如果你不太確定可以使用kubectl explain
的資源名,可以使用下面的命令來獲取所有資源名稱:
$ kubectl api-resources
該命令會線上資源名稱的復數形式(比如顯示 deployments 而不是 deployment),還會顯示一個資源的簡寫(比如 deploy),不過不用擔心,我們可以用任意一個名稱來結合kubectl explain
命令使用的:
$ kubectl explain deployments.spec
# 或者
$ kubectl explain deployment.spec
# 或者
$ kubectl explain deploy.spec
2.3、使用自定義輸出格式
kubectl get命令(讀取集群資源)的默認輸出格式如下:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 2 14h
nginx-app-deployment-9dfdc4785-6w92j 1/1 Running 0 26s
nginx-app-deployment-9dfdc4785-qphsd 1/1 Running 0 26s
上面的輸出結果是一種比較友好的格式,但是它包含的信息比較有限,比如上面只顯示了 Pod 資源中的一些信息(與完整資源定義相比)。
所以這個時候就有自定義輸出格式的用武之地了,它允許我們自由定義要顯示的列和數據,可以選擇要在輸出中顯示為單獨列的資源的任何字段。
自定義列輸出的用法如下
-o custom-columns=<header>:<jsonpath>[,<header>:<jsonpath>]...
需要將每個輸出列定義為<header>:<jsonpath>這樣的鍵值對:
<header>是列的名稱,可以選擇任何想要顯示的內容。
<jsonpath>是一個選擇資源屬性的表達式。
我們來看一個簡單的例子:
$ kubectl get pods -o custom-columns="NAME:metadata.name"
NAME
busybox
nginx-app-deployment-9dfdc4785-6w92j
nginx-app-deployment-9dfdc4785-qphsd
3、陳述式管理資源
上面說完了kubectl的基本使用,這里來說如何使用kubectl實現資源的陳述式管理。
3.1、管理namespace資源
namespace也稱為名稱空間,可簡寫ns,默認名稱空間:default
1.查看namespace
$ kubectl get namespace
NAME STATUS AGE
default Active 18h
kube-node-lease Active 18h
kube-public Active 18h
kube-system Active 18h
2.查看指定名稱空間
$ kubectl get all [-n default]
3.創建名稱空間
$ kubectl create ns app
namespace/app created
4.刪除名稱空間
$ kubectl delete ns app
namespace "app" deleted
3.2、管理Deployment資源
1.創建nginx
$ kubectl create deployment nginx-dp --image=nginx:1.7.9 -n kube-public
deployment.apps/nginx-dp created
2.簡單查看
$ kubectl get deployment -n kube-public
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-dp 1/1 1 1 6s
3.擴展查看
$ kubectl get deployment -n kube-public -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-dp 1/1 1 1 3m24s nginx nginx:1.7.9 app=nginx-dp
4.詳細查看
$ kubectl describe deployment nginx-dp -n kube-public
3.3、管理pod資源
1.查看pod資源
$ kubectl get pods -n kube-public
NAME READY STATUS RESTARTS AGE
nginx-dp-6599b486d9-sj47f 1/1 Running 0 41m
2.進入pod資源
$ kubectl exec -it nginx-dp-6599b486d9-sj47f bash -n kube-public
root@nginx-dp-6599b486d9-sj47f:/# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:07:16:03 brd ff:ff:ff:ff:ff:ff
inet 172.7.22.3/24 brd 172.7.22.255 scope global eth0
valid_lft forever preferred_lft forever
當然你也可以通過docker exec 進入容器
3.刪除pod資源(重啟)
$ kubectl delete pod nginx-dp-6599b486d9-sj47f -n kube-public
pod "nginx-dp-6599b486d9-sj47f" deleted
$ kubectl get pods -n kube-public
NAME READY STATUS RESTARTS AGE
nginx-dp-6599b486d9-tnr4h 1/1 Running 0 4s
使用watch觀察pod重建狀態變化
強制刪除參數:--force --grace-period=0
4.刪除deployment
$ kubectl delete deployment nginx-dp -n kube-public
deployment.extensions "nginx-dp" deleted
3.4、管理Service資源
1.創建service
$ kubectl create deployment nginx-dp --image=nginx:1.7.9 -n kube-public
deployment.apps/nginx-dp created
$ kubectl expose deployment nginx-dp --port=80 -n kube-public
service/nginx-dp exposed
2.查看service
$ kubectl describe svc nginx-dp -n kube-public
Name: nginx-dp
Namespace: kube-public
Labels: app=nginx-dp
Annotations: <none>
Selector: app=nginx-dp
Type: ClusterIP
IP: 192.168.241.190
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 172.7.22.3:80
Session Affinity: None
Events: <none>