阿里雲Kubernetes服務 - 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”資源,然後點擊鏈接,跳轉至“訪問控制”控制檯->在“訪問控制”控制檯左側,點擊“角色授權策略”按鈕,然後在右側頁面中點擊“查看權限”按鈕,在跳轉的頁面,點擊“授權策略詳情”按鈕,進入“策略詳情”頁,在“策略詳情頁”中點擊“修改授權策略”按鈕。在彈出的對話框中,參考裏面的格式增加如下內容,點擊“修改策略”按鈕,完成授權。


 
  1. {

  2. "Action": [

  3. "rds:*"

  4. ],

  5. "Resource": [

  6. "*"

  7. ],

  8. "Effect": "Allow"

  9. },

使用如下命令安裝,“--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。


 
  1. apiVersion: servicecatalog.k8s.io/v1beta1

  2. kind: ClusterServiceBroker

  3. metadata:

  4. name: rds-broker

  5. spec:

  6. 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三種資源。


 
  1. $ kubectl get clusterservicebroker

  2. NAME AGE

  3. rds-broker 14s

  4. $ kubectl get clusterserviceclass

  5. NAME AGE

  6. 997b8372-8dac-40ac-ae65-758b4a50111 28s

  7. $ kubectl describe clusterserviceclass 997b8372-8dac-40ac-ae65-758b4a50111

  8. ...

  9. External Name: rds-service

  10. Plan Updatable: true

  11. ...

  12. $ kubectl get clusterserviceplan

  13. NAME AGE

  14. 427559f1-bf2a-45d3-8844-32374a3e1111 39s

  15. edc2badc-d93b-4d9c-9d8e-da2f1c8c1111 39s

  16. edc2badc-d93b-4d9c-9d8e-da2f1c8c1112 39s

  17. $ kubectl describe clusterserviceplan

  18. ...

  19. External Metadata:

  20. Class: rds.mysql.s2.large

  21. Cpu: 2

  22. Engine: MySQL

  23. Engine _ Version: 5.6

  24. High _ Availability: false

  25. Memory: 4

  26. Storage: 20

  27. Type:

  28. Vpc ID:

  29. Vswitch ID:

  30. External Name: mysql-n2-medium-1

  31. ...

其中Clusterserviceclass和Clusterserviceplan的“External Name”需要在創建rds instance是指定。不同的Clusterserviceplan可以創建不同的rds instance,可以根據需要進行選擇。

創建instance

建立一個名爲rds-instance.yaml的文件,內容如下。


 
  1. apiVersion: servicecatalog.k8s.io/v1beta1

  2. kind: ServiceInstance

  3. metadata:

  4. name: rds-instance

  5. namespace: rds-broker-ns

  6. spec:

  7. clusterServiceClassExternalName: alibaba-cloud-rds-mysqldb

  8. clusterServicePlanExternalName: self-define

  9. parameters:

  10. Type: VPC

  11. 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的文件,內容如下:


 
  1. apiVersion: servicecatalog.k8s.io/v1beta1

  2. kind: ServiceBinding

  3. metadata:

  4. name: rds-binding

  5. namespace: rds-broker-ns

  6. spec:

  7. instanceRef:

  8. name: rds-instance

  9. secretName: rds-instance-credentials

  10. parameters:

  11. Username: username

  12. 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的情況:


 
  1. $ kubectl get secret -n rds-broker-ns

  2. NAME TYPE DATA AGE

  3. default-token-d9nx6 kubernetes.io/service-account-token 3 1h

  4. rds-instance-credentials Opaque 6 2m

  5. $ kubectl describe secret rds-instance-credentials -n rds-broker-ns

  6. ...

  7. Data

  8. ====

  9. username: 8 bytes

  10. host: 43 bytes

  11. password: 8 bytes

  12. port: 4 bytes

  13. uri: 75 bytes

  14. ...

使用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訪問:


 
  1. $ mysql -h host -uusername -ppassword

  2. Welcome to the MariaDB monitor. Commands end with ; or \g.

  3. Your MySQL connection id is 59303

  4. Server version: 5.6.16-log Source distribution

  5.  
  6. Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

  7.  
  8. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

  9.  
  10. MySQL [(none)]>

通過python來訪問:


 
  1. #!/usr/bin/python

  2. # -*- coding: UTF-8 -*-

  3.  
  4. import MySQLdb

  5.  
  6. conn = MySQLdb.connect(host='host', user='username', passwd='password')

  7. cursor=conn.cursor()

  8. cursor.execute("""create database if not exists db_pytest""")

  9. conn.select_db('db_pytest')

  10. cursor.execute("create table tb_test(id int, info varchar(100))")

  11. cursor.close()

通過deployment來訪問:


 
  1. apiVersion: extensions/v1beta1

  2. kind: Deployment

  3. metadata:

  4. name: wordpress

  5. namespace: mariadb-broker-ns

  6. spec:

  7. template:

  8. metadata:

  9. labels:

  10. app: wordpress

  11. spec:

  12. containers:

  13. - name: wordpress

  14. image: "bitnami/wordpress:latest"

  15. env:

  16. - name: MARIADB_HOST

  17. valueFrom:

  18. secretKeyRef:

  19. name: rds-instance-credentials

  20. key: host

  21. - name: MARIADB_PORT

  22. valueFrom:

  23. secretKeyRef:

  24. name: rds-instance-credentials

  25. key: port

  26. - name: WORDPRESS_DATABASE_USER

  27. valueFrom:

  28. secretKeyRef:

  29. name: rds-instance-credentials

  30. key: username

  31. - name: WORDPRESS_DATABASE_PASSWORD

  32. valueFrom:

  33. secretKeyRef:

  34. name: rds-instance-credentials

  35. key: password

  36. - name: WORDPRESS_DATABASE_NAME

  37. value: db_pytest

  38. ports:

  39. - name: http

  40. containerPort: 80

  41. livenessProbe:

  42. httpGet:

  43. path: /

  44. port: http

  45. initialDelaySeconds: 120

  46. timeoutSeconds: 5

  47. readinessProbe:

  48. httpGet:

  49. path: /

  50. port: http

  51. initialDelaySeconds: 5

  52. timeoutSeconds: 5

  53. ---

  54. apiVersion: v1

  55. kind: Service

  56. metadata:

  57. name: wordpress

  58. namespace: mariadb-broker-ns

  59. spec:

  60. type: LoadBalancer

  61. ports:

  62. - name: http

  63. port: 80

  64. targetPort: http

  65. selector:

  66. app: wordpress

原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章