1. 程式人生 > >微服務系列之二:kubernetes API使用(叢集外部呼叫)

微服務系列之二:kubernetes API使用(叢集外部呼叫)

上篇文章主要講述如何在centos7上利用kubeadm搭建一個最新的kubernetes叢集,也記錄了一些踩過的坑。在kubernetes的master節點上,我們可以利用kubectl與叢集進行互動,比如對pod,service或者deployment進行增刪改查等等。但是很多時候,我們可能需要從叢集外的伺服器上對叢集進行一些操作,這種需求該如何實現呢?通過呼叫kubernetes本身提供的HTTP Restful API可以實現我們的這個需求。下面我們將具體闡述,如何從叢集外部,通過呼叫kubernetes的HTTP Restful API進行進群的控制。

API Server

首先,我們瞭解一下kubernetes上的API Server。kubernetes叢集分為master和普通node,master上跑了kube-apiserver,kube-controller-manager和kube-scheduler三大核心程序,而kube-apiserver更是整個叢集的核心。它提供了kubernetes各類資源物件(如Pod、RC、Service等)的增刪改查及Watch等HTTP Rest介面,成為叢集內各個功能模組之間資料互動和通訊的中心樞紐,是整個系統的資料匯流排和資料中心。從下面的kubernetes結構圖,我們可以看到API Server的核心作用(參考自:Kubernetes權威指南第二版)


API Server使用

預設情況下,Kubernetes API Server提供HTTP的兩個埠:

1. 本地主機埠

  • HTTP服務
  • 預設埠8080,修改標識--insecure-port
  • 預設IP是本地主機,修改標識--insecure-bind-address
  • 在http中沒有認證和授權檢查
  • 主機訪問受保護

2. Secure Port

  • 預設埠6443,修改標識--secure-port
  • 預設IP是首個非本地主機的網路介面,修改標識--bind-address
  • HTTPS服務。設定證書和祕鑰的標識,-tls-cert-file,-tls-private-key-file
  • 認證方式,令牌檔案或者客戶端證書
  • 使用基於策略的授權方式

本地主機埠的話只能在叢集內部進行訪問,雖然可以通過kube-proxy進行一個代理,但是筆者實測下來發現執行一段時間以後總是會自動斷開,所以筆者採用的是直接HTTPS這條路。

官方或社群維護的各種語言的API庫

官方或者社群也有維護各種語言對應的API庫,比如Go,Python或者Java。Client Libraries裡可以檢視所有目前存在的API庫

自己定製

官方或者社群維護的API庫,筆者因為下載了對應版本的,也沒找到正確的呼叫方式,所以只能自己從頭開始編寫,自己定製kubernetes的API。下面將詳細講解具體的步驟。

一、生成Token

訪問API Server需要經過認證、授權以及准入控制,所以我們從外部叢集呼叫API Server,首先遇到的就是許可權問題。這裡,筆者找到一種方式,可以生成具有呼叫API Server許可權的token。具體步驟如下:

1. 首先,在kubernetes叢集的master上,使用指令echo $(kubectl config view | grep server | cut -f 2- -d ":" | tr -d " ")獲得API Server的地址

2. 還是在master上,建立檔案admin-token.yaml,並輸入以下內容:

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile

3. 執行命令:kubectl create -f admin-token.yaml

4. 執行命令:kubectl get secret -n kube-system|grep admin

5. 執行命令:kubectl describe secret admin-token-??? -n kube-system(???替換為4中的輸出)

6. 複製上述命令輸出的token值,後續會用到

實際使用

在要呼叫API Server的伺服器上執行以下指令,即可實現呼叫。下面以調整特定service的副本數量為例,進行演示:

1. APISERVER=API Server的地址

2. API_URL="$APISERVER/apis/extensions/v1beta1/namespaces/default/deployments/ts-contacts-service/scale"(根據需要替換成自己要訪問的API地址即可)

3. PAYLOAD='[{"op":"replace","path":"/spec/replicas","value":3}]'(這裡定義你要傳輸的資料)

4. TOKEN=token值

5. curl -X PATCH -d$PAYLOAD -H 'Content-Type: application/json-patch+json' $API_URL --header "Authorization: Bearer $TOKEN" --insecure

如果呼叫成功,你將會看到相應的返回資訊,否則會有對應的狀態值返回,你可以以此為依據對錯誤進行查詢。

注意點

1. 為了方便根據需求找到對應的API地址,我的做法是參考Java Client Library的文件,進行查詢。API查詢

2. 傳送GET請求,進行查詢時很方便的。唯一會導致問題的,就是PATCH或者POST請求,需要傳送資料的查詢,這裡只能依靠經驗,多嘗試得出正確的資料傳輸格式。