Service Broker快速入門指南
4月底阿里雲容器服務上線了基於Kubernetes叢集的服務目錄功能。阿里雲的容器的服務目錄遵循Open Service Broker API標準,提供了一系列的服務代理元件,實現了對主流開源服務如MySQL、MariaDB、Spark、RabbitMQ等的完美支援,同時提供了管理阿里雲RDS服務的RDS broker功能。通過控制檯,使用者可以瀏覽到各種服務的broker,通過簡單地介面操作,就可以完成建立和銷燬不同規格的服務例項,將目標服務例項與應用繫結,並以安全的方式將服務例項的訪問資訊和祕鑰注入到應用容器中,大大降低了雲服務的使用的複雜度,提高了管理效率。
下面以RDS broker為例來進行說明,以幫助大家快速上手。
安裝service catalog
首先,進入容器服務,建立一個Kubernetes叢集,然後在控制檯就可以看到服務目錄標籤
點選服務目錄,點選左上角的“叢集”,可以選擇不同的叢集。如果選擇的叢集還未安裝過service catalog,點選“請點選安裝”,即可以進行安裝。
安裝完成後就可以看到目前支援的各個service broker的標籤:
安裝service broker
點選“rds-broker”,進入rds-broker的詳情頁面,如下所示。詳情頁面有兩個標籤頁:“說明”和“引數”。“說明”標籤頁說明了broker的具體使用方法;“引數”標籤頁是部署該broker的各種引數,可以根據需要進行修改。
broker的部署有兩種方式:
1 通過控制檯部署 點選右側的“建立”按鈕即可以進行部署,service broker會以指定的名字部署到指定的namespace中,以rds broker為例,會以“aliacs-rds-broker” 名稱部署到名為“catalog”的namespace中。service catalog也安裝在“catalog” namespace中;
2 使用命令列部署,這種部署方式,需要登入到叢集的master節點上,使用kubectl的命令進行部署,“說明”標籤頁中有具體的操作步驟。這種方式可以靈活的指定名稱和namespace。
下面使用命令列的方式進行部署。
首先登入叢集的master節點(具體方法是:點選“叢集”標籤,選擇叢集,然後點選“管理”按鈕,進入叢集的“基本資訊”頁。檢視右側頁面中的“Master 節點 SSH 連線地址”,通過ssh登入到叢集的master節點)。
如果使用rds broker,需要給Kubernetes叢集授予rds的訪問許可權。
授予的步驟可以參考“說明”標籤頁的“Prerequisites”中說明方法:
首先點選“叢集”標籤,選擇叢集,點選“管理”->選擇“叢集資源”中的“資源編排ROS”,點選ROS的連結,跳轉到“ROS”控制檯->在“ROS”控制檯左側點選“資源”標籤,右側下拉到最後面,選擇“KubernetesWorkerRole”資源,然後點選連結,跳轉至“訪問控制”控制檯->在“訪問控制”控制檯左側,點選“角色授權策略”按鈕,然後在右側頁面中點選“檢視許可權”按鈕,在跳轉的頁面,點選“授權策略詳情”按鈕,進入“策略詳情”頁,在“策略詳情頁”中點選“修改授權策略”按鈕。在彈出的對話方塊中,參考裡面的格式增加如下內容,點選“修改策略”按鈕,完成授權。
-
{
-
"Action": [
-
"rds:*"
-
],
-
"Resource": [
-
"*"
-
],
-
"Effect": "Allow"
-
},
使用如下命令安裝,“--name”和“--namespace”可以按照,本例中為“rds-broker”和“rds-broker-ns”。
$ helm install --name rds-broker --namespace rds-broker-ns incubator/rds-broker
刪除broker可以使用如下命令:
$ helm delete --purge rds-broker
註冊broker
安裝完成之後,首先需要通過kubectl命令註冊broker。
建立一個名為rds-broker.yaml的檔案,內容如下。其中“name”項可以根據需要進行修改,“url”項為service broker的url地址,格式為:broker的service名稱.broker的namespace名稱.cluster.local。
-
apiVersion: servicecatalog.k8s.io/v1beta1
-
kind: ClusterServiceBroker
-
metadata:
-
name: rds-broker
-
spec:
-
url: http://rds-broker-rds-broker.rds-broker-ns.svc.cluster.local
broker的service名稱可以通過:kubectl get svc -n rds-broker-ns查詢到。
註冊命令如下:
$ kubectl create -f rds-broker.yaml
註冊後可以查詢到clusterservicebroker、clusterserviceclass、clusterserviceplan三種資源。
-
$ kubectl get clusterservicebroker
-
NAME AGE
-
rds-broker 14s
-
$ kubectl get clusterserviceclass
-
NAME AGE
-
997b8372-8dac-40ac-ae65-758b4a50111 28s
-
$ kubectl describe clusterserviceclass 997b8372-8dac-40ac-ae65-758b4a50111
-
...
-
External Name: rds-service
-
Plan Updatable: true
-
...
-
$ kubectl get clusterserviceplan
-
NAME AGE
-
427559f1-bf2a-45d3-8844-32374a3e1111 39s
-
edc2badc-d93b-4d9c-9d8e-da2f1c8c1111 39s
-
edc2badc-d93b-4d9c-9d8e-da2f1c8c1112 39s
-
$ kubectl describe clusterserviceplan
-
...
-
External Metadata:
-
Class: rds.mysql.s2.large
-
Cpu: 2
-
Engine: MySQL
-
Engine _ Version: 5.6
-
High _ Availability: false
-
Memory: 4
-
Storage: 20
-
Type:
-
Vpc ID:
-
Vswitch ID:
-
External Name: mysql-n2-medium-1
-
...
其中Clusterserviceclass和Clusterserviceplan的“External Name”需要在建立rds instance是指定。不同的Clusterserviceplan可以建立不同的rds instance,可以根據需要進行選擇。
建立instance
建立一個名為rds-instance.yaml的檔案,內容如下。
-
apiVersion: servicecatalog.k8s.io/v1beta1
-
kind: ServiceInstance
-
metadata:
-
name: rds-instance
-
namespace: rds-broker-ns
-
spec:
-
clusterServiceClassExternalName: alibaba-cloud-rds-mysqldb
-
clusterServicePlanExternalName: self-define
-
parameters:
-
Type: VPC
-
Class: rds.mysql.s2.large
中“name”、“namespace”、“clusterServiceClassExternalName”和“clusterServicePlanExternalName”可以根據需要進行指定。本例中因為選擇的是“self-define”的clusterserviceplan,需要在“parameters”中指定rds的資料庫型別(可以在rds控制檯的建立頁面的“資料庫型別”中選擇,目前僅支援mysql)、Class(同樣在rds控制檯的建立頁面中的“規格”中來選擇,請參考https://help.aliyun.com/document_detail/26312.html?spm=a2c4g.11186623.6.562.Uftgml)和Storage(單位是G,範圍為20~1000,步長是5)。
建立isntance的命令如下:
$ kubectl create -f rds-instance.yaml
建立的過程大約需要15分鐘左右,建立完成後,可以再阿里雲的rds控制檯中檢視到正在建立的rds例項,也可以通過kubectl get serviceinstance -n rds-broker-ns的命令來檢視。kubectl describe serviceinstance -n rds-broker-ns rds-instance(instance的名稱) 可以更加詳細的檢視instance建立的狀態。
建立binding
建立binding會在kubernetes叢集中建立一個包含rds例項的host、username、password、port等資訊在內的secret。
下面開始建立binding。
建立一個名為rds-binding.yaml的檔案,內容如下:
-
apiVersion: servicecatalog.k8s.io/v1beta1
-
kind: ServiceBinding
-
metadata:
-
name: rds-binding
-
namespace: rds-broker-ns
-
spec:
-
instanceRef:
-
name: rds-instance
-
secretName: rds-instance-credentials
-
parameters:
-
Username: username
-
Password: password
使用如下命令建立servicebinding,該servicebinding會在kubernetes叢集中建立一個名為“rds-instance-credentials”的secret。其中“parameters”中的“Username”和“Password”可以根據需要指定。
$ kubectl create -f rds-binding.yaml
Binding完成大約需要10分鐘左右的時間,可以通過rds控制檯中檢視相關例項的賬號管理來檢視,也可以通過kubectl describe serviceisntance -n rds-broker-ns rds-binding(binding的名稱)來檢視。
使用kubectl get secret -n rds-broker-ns命令可以檢視secret的情況:
-
$ kubectl get secret -n rds-broker-ns
-
NAME TYPE DATA AGE
-
default-token-d9nx6 kubernetes.io/service-account-token 3 1h
-
rds-instance-credentials Opaque 6 2m
-
$ kubectl describe secret rds-instance-credentials -n rds-broker-ns
-
...
-
Data
-
====
-
username: 8 bytes
-
host: 43 bytes
-
password: 8 bytes
-
port: 4 bytes
-
uri: 75 bytes
-
...
使用kubectl get secret -n rds-broker-ns -o json可以獲取更詳細的資訊。
其中username、host、password、port、uri是經過base64加密的訪問instance的資訊,解密以後即可用來訪問rds的instance。
binding的使用
對binding生成的secret中的相關欄位進行base64解碼後可以訪問rds instance了。
通過mysql client訪問:
-
$ mysql -h host -uusername -ppassword
-
Welcome to the MariaDB monitor. Commands end with ; or \g.
-
Your MySQL connection id is 59303
-
Server version: 5.6.16-log Source distribution
-
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
-
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
MySQL [(none)]>
通過python來訪問:
-
#!/usr/bin/python
-
# -*- coding: UTF-8 -*-
-
import MySQLdb
-
conn = MySQLdb.connect(host='host', user='username', passwd='password')
-
cursor=conn.cursor()
-
cursor.execute("""create database if not exists db_pytest""")
-
conn.select_db('db_pytest')
-
cursor.execute("create table tb_test(id int, info varchar(100))")
-
cursor.close()
通過deployment來訪問:
-
apiVersion: extensions/v1beta1
-
kind: Deployment
-
metadata:
-
name: wordpress
-
namespace: mariadb-broker-ns
-
spec:
-
template:
-
metadata:
-
labels:
-
app: wordpress
-
spec:
-
containers:
-
- name: wordpress
-
image: "bitnami/wordpress:latest"
-
env:
-
- name: MARIADB_HOST
-
valueFrom:
-
secretKeyRef:
-
name: rds-instance-credentials
-
key: host
-
- name: MARIADB_PORT
-
valueFrom:
-
secretKeyRef:
-
name: rds-instance-credentials
-
key: port
-
- name: WORDPRESS_DATABASE_USER
-
valueFrom:
-
secretKeyRef:
-
name: rds-instance-credentials
-
key: username
-
- name: WORDPRESS_DATABASE_PASSWORD
-
valueFrom:
-
secretKeyRef:
-
name: rds-instance-credentials
-
key: password
-
- name: WORDPRESS_DATABASE_NAME
-
value: db_pytest
-
ports:
-
- name: http
-
containerPort: 80
-
livenessProbe:
-
httpGet:
-
path: /
-
port: http
-
initialDelaySeconds: 120
-
timeoutSeconds: 5
-
readinessProbe:
-
httpGet:
-
path: /
-
port: http
-
initialDelaySeconds: 5
-
timeoutSeconds: 5
-
---
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: wordpress
-
namespace: mariadb-broker-ns
-
spec:
-
type: LoadBalancer
-
ports:
-
- name: http
-
port: 80
-
targetPort: http
-
selector:
-
app: wordpress