K8s的所有操作基本都是透過呼叫kube-apiserver這個元件進行的,可以透過kubectl命令列工具或者程式設計API來,同時也REST API供外部系統遠端訪問。本文將介紹這幾種方式來訪問或操作K8S資源物件。
Kubectl命令列
kubectl作為客戶端CLI工具,可以讓使用者透過命令列的方式對Kubernetes叢集進行操作。
kubectl命令格式
kubectl命令格式為
kubectl [command] [TYPE] [NAME] [flags]
command子命令用於表示要對K8S叢集中資源物件進行的操作,常見command命令有create、delete、describe、get、apply等;
TYPE表示command命令要操作的資源物件,如pod、service、job等,並且支援單複數與簡寫,如pod、pods與po等價,都可以用於表示pod物件,kubectl可以操作的所有K8S資源物件及其縮寫如下
NAME表示資源物件的名稱。如果不指定名稱,則系統將command操作施加在該TYPE的所有物件上,例如kubectl get pods將返回所有的Pod的資訊;
flags:command命令的可選引數,例如使用“-f”指定yaml配置檔案進行建立或刪除操作。
一個kubectl命令可以同是最多個資源物件進行操作,多透過個TYPE和NAME的組合表示來表示多個物件,例如 * 獲取多個同TYPE不同NAME的物件
kubectl get pods pod1 pod2
獲取多個不同TYPE的物件
kubectl get pod/pod1 rc/rc1
同時應用多個yaml檔案,操作資源物件
kubectl get pod -f pod1。yaml -f pod2。yaml
kubectl create -f pod1。yaml -f rc1。yaml -f service1。yaml
kubectl命令輸出格式
kubectl 命令可以透過-o引數指定命令執行結果的輸出的格式
kubectl [command] [TYPE] [NAME] -o=
常見可選輸出格式如下
-o=custom-columns=
-o=custom-colimns-file=\
-o=json 以JSON格式顯示結果
-o=jsonpath= 輸出jsonpath表示式定義的欄位資訊
-o=jsonpath-file=\
-o=name 僅輸出資源物件的名稱
-o=wide 輸出額外資訊。對於Pod,將輸出Pod所在的Node名
-o=yaml 以yaml格式顯示結果
可以透過。metadata變數來引用預設輸出結果的schema物件。
例如用自定義列名顯示結果
kubectl get pod
另外可以透過——sort-by指定結果排序方式,如獲取所有pod資訊,並根據名稱排序
kubectl get pods ——sort-by=。metadata。name
常見操作
根據配置檔案建立資源:根據下列配置檔案建立pod與service
[my-deployment。yaml]
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
selector:
matchLabels:
app: web
replicas: 2
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: registry。cn-hangzhou。aliyuncs。com/liuyi01/tomcat:8。0。51-alpine
ports:
- containerPort: 8080
[service。yaml]
apiVersion: v1
kind: Service
metadata:
name: web
spec:
ports:
- port: 80 # 服務埠
protocol: TCP
targetPort: 8080 # 容器埠
selector:
app: web # 標籤選擇器,這裡的app=web正是我們剛才建立app
kubectl create -f my-deployment。yaml -f my-service。yaml
建立
kubectl create -f
檢視資源物件:command子命令為get,如檢視pod列表並展示額外資訊
kubectl get Pods -o wide
檢視service列表
kubectl get service
描述資源物件:描述資源物件的command子命令describe,如檢視節點資訊
kubectl describe nodes
或檢視某個replicationcontrollers管理的所有pod資訊
kubectl describe pods
刪除資源物件:command子命令是describe,如刪除所有pod
kubectl delete pods ——all
或如刪除my-deployment。yaml檔案定義的所有pod
kubectl delete -f my-deployment。yaml
或刪除所有包含某個label的Pod:
kubectl delete pod -l name=
在容器中執行命令:command子命令為exec,命令的格式為
kubectl exec
如果省略container-name,則預設在該pod中的的第一個容器中執行命令。
例如登陸容器的終端
kubectl exec -ti
檢視容器日誌:command子命令為logs,命令格式
kubectl logs -f
程式設計API使用
K8S提供了Java,Go與Python語言的程式設計API,本文以Java為例,其他語言的API使用方式可以參考官方文件。
引用依賴
安裝配置檔案與證書
為了保證整個k8s叢集的安全性,k8s提供了多種認證方式來驗證訪問者身份的的合法性:比如客戶端證書、靜態token、靜態密碼檔案、ServiceAccountTokens等。這裡使用的時客戶端證書認證即TLS雙向認證。
從你的K8S安裝目錄下把這幾個檔案copy到你的專案目錄下
然後開啟config檔案,重新配置本地的ca。crt(CA證書)、ca。key(TLS 證書)與client。crt(TLS Key)這三個檔案的位置。也可以把這三個檔案的內容進行Base64編碼後copy到這個位置,並把這幾個位置的key加上字尾-data,如certificate-authority-data,這樣就不用維護這麼多檔案了。
然後既可以根據config檔案的path去建立一個客戶端物件了,示例如下。 當然,如果你的應用程式執行在K8S叢集中,可以不指定配置檔案,在客戶端建立時會去獲取當前叢集的配置檔案。
獲取pod
透過config建立一個client物件,並置為預設ApiClient,然後建立一個CoreV1Api物件,就可以用它獲取全部pod物件。
import io。kubernetes。client。openapi。ApiClient;
import io。kubernetes。client。openapi。ApiException;
import io。kubernetes。client。openapi。Configuration;
import io。kubernetes。client。openapi。apis。CoreV1Api;
import io。kubernetes。client。openapi。models。V1Pod;
import io。kubernetes。client。openapi。models。V1PodList;
import io。kubernetes。client。util。ClientBuilder;
import io。kubernetes。client。util。KubeConfig;
import java。io。FileNotFoundException;
import java。io。FileReader;
import java。io。IOException;
public class TestClient {
public static void main(String[] args) throws ApiException, IOException, ApiException {
String kubeConfigPath = “/${your path}/config”;
//載入config,建立client
ApiClient client = ClientBuilder。kubeconfig(KubeConfig。loadKubeConfig(new FileReader(kubeConfigPath)))。build();
//設定預設client
Configuration。setDefaultApiClient(client);
//建立一個api
CoreV1Api api = new CoreV1Api();
//列印所有的pod
V1PodList list = api。listPodForAllNamespaces(null,null,null,null,null,null,null,
null,null);
for (V1Pod item : list。getItems()) {
System。out。println(item);
}
}
}
建立job
先根據docker映象名稱建立一個container物件,然後據此建立PodSpec物件(pod的配置),再建立V1JobSpec物件(job配置),再建立一個V1Job物件,最後用建立一個BatchV1Api物件來啟動job。
import io。kubernetes。client。ApiException;
import io。kubernetes。client。apis。BatchV1Api;
import io。kubernetes。client。models。*;
import java。util。Collections;
public class TestJob {
public static void main(String[] args) {
V1Job v1Job = new V1Job();
V1ObjectMeta v1ObjectMeta = new V1ObjectMeta();
v1ObjectMeta。setNamespace(“test_namespace”);
v1ObjectMeta。setName(“test-job”);
v1Job。setMetadata(v1ObjectMeta);
V1PodSpec podSpec = new V1PodSpec();
V1Container container = new V1Container();
container。setImage(“your_image”);
podSpec。setContainers(Collections。singletonList(container));
podSpec。restartPolicy(“OnFailure”);
V1PodTemplateSpec podTemplateSpec = new V1PodTemplateSpec();
podTemplateSpec。setSpec(podSpec);
V1JobSpec v1JobSpec = new V1JobSpec();
// 設定超時時間為兩小時,超時後該job被置為Failed
v1JobSpec。setActiveDeadlineSeconds(7200L);
// 任務執行完( 無論Completeh還是Failed)100秒後,該job就會被刪除
v1JobSpec。setTtlSecondsAfterFinished(100);
v1JobSpec。setTemplate(podTemplateSpec);
// 啟動失敗最多重啟3次,3次後就會被標記為Failed,該設定優先順序低於setTtlSecondsAfterFinished
v1JobSpec。backoffLimit(3);
v1Job。setSpec(v1JobSpec);
BatchV1Api batchV1Api = new BatchV1Api();
try {
batchV1Api。createNamespacedJob(“test_namespace”, v1Job, true, null, null);
} catch (ApiException e) {
e。printStackTrace();
}
}
}
REST API
透過REST API訪問貨操作K8S資源物件有兩種方式,
使用 kubectl 代理
執行下面kubectl 命令, 將充當一個反向代理, 負責處理 apiserver 的定位和認證,使用者可透過curl, wget, 或者瀏覽器在8081的埠訪問 API。
kubectl proxy ——port=8081 &
如透過下列請求來可以獲取叢集資訊
curl http://localhost:8081/api/
不使用 kubectl 代理
如果不使用kubectl代理則需要傳遞一個認證token給apiserver,例如透過下列命令一樣可以獲取叢集資訊。
APISERVER=$(kubectl config view | grep server | cut -f 2- -d “:” | tr -d “ ”)
TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ‘ ’) | grep -E ‘^token’ | cut -f2 -d‘:’ | tr -d ‘\t’)
curl $APISERVER/api ——header “Authorization: Bearer $TOKEN” ——insecure
REST API列表
/api
/api/v1
/apis
/apis/
/apis/admissionregistration。k8s。io
/apis/admissionregistration。k8s。io/v1beta1
/apis/apiextensions。k8s。io
/apis/apiextensions。k8s。io/v1beta1
/apis/apiregistration。k8s。io
/apis/apiregistration。k8s。io/v1
/apis/apiregistration。k8s。io/v1beta1
/apis/apps
/apis/apps/v1
/apis/apps/v1beta1
/apis/apps/v1beta2
/apis/authentication。k8s。io
/apis/authentication。k8s。io/v1
/apis/authentication。k8s。io/v1beta1
/apis/authorization。k8s。io
/apis/authorization。k8s。io/v1
/apis/authorization。k8s。io/v1beta1
/apis/autoscaling
/apis/autoscaling/v1
/apis/autoscaling/v2beta1
/apis/autoscaling/v2beta2
/apis/batch
/apis/batch/v1
/apis/batch/v1beta1
/apis/certificates。k8s。io
/apis/certificates。k8s。io/v1beta1
/apis/coordination。k8s。io
/apis/coordination。k8s。io/v1beta1
/apis/events。k8s。io
/apis/events。k8s。io/v1beta1
/apis/extensions
/apis/extensions/v1beta1
/apis/networking。k8s。io
/apis/networking。k8s。io/v1
/apis/policy
/apis/policy/v1beta1
/apis/rbac。authorization。k8s。io
/apis/rbac。authorization。k8s。io/v1
/apis/rbac。authorization。k8s。io/v1beta1
/apis/scheduling。k8s。io
/apis/scheduling。k8s。io/v1beta1
/apis/storage。k8s。io
/apis/storage。k8s。io/v1
/apis/storage。k8s。io/v1beta1
/healthz
/healthz/autoregister-completion
/healthz/etcd
/healthz/log
/healthz/ping
/healthz/poststarthook/apiservice-openapi-controller
/healthz/poststarthook/apiservice-registration-controller
/healthz/poststarthook/apiservice-status-available-controller
/healthz/poststarthook/bootstrap-controller
/healthz/poststarthook/ca-registration
/healthz/poststarthook/generic-apiserver-start-informers
/healthz/poststarthook/kube-apiserver-autoregistration
/healthz/poststarthook/rbac/bootstrap-roles
/healthz/poststarthook/scheduling/bootstrap-system-priority-classes
/healthz/poststarthook/start-apiextensions-controllers
/healthz/poststarthook/start-apiextensions-informers
/healthz/poststarthook/start-kube-aggregator-informers
/healthz/poststarthook/start-kube-apiserver-admission-initializer
/logs
/metrics
/openapi/v2
/swagger-2。0。0。json
/swagger-2。0。0。pb-v1
/swagger-2。0。0。pb-v1。gz
/swagger。json
/swaggerapi
/version
其中最常用的是/api/v1的API,具體如下
例如,透過如下請求可以獲取default名稱空間中所有的pod的資訊
curl http://localhost:8081/api/v1/namespaces/default/pods
總結
本文介紹了三種K8S操作資源物件的方式,它們各有各的使用場景。kubectl命令列工具適合運維人員使用,程式設計API與REST API適合開發者使用,REST API也可以給遠端使用者使用。實際可以根據需要進行選擇。