阿里雲Kubernetes服務 - Service Broker快速入門指南

4月底阿里雲容器服務上線了基於Kubernetes集羣的服務目錄功能。阿里雲的容器的服務目錄遵循Open Service Broker API標準,提供了一系列的服務代理組件,實現了對主流開源服務如MySQL、MariaDB、Spark、RabbitMQ等的完美支持,同時提供了管理阿里雲RDS服務的RDS broker功能。經過控制檯,用戶能夠瀏覽到各類服務的broker,經過簡單地界面操做,就能夠完成建立和銷燬不一樣規格的服務實例,將目標服務實例與應用綁定,並以安全的方式將服務實例的訪問信息和祕鑰注入到應用容器中,大大下降了雲服務的使用的複雜度,提升了管理效率。html

下面以RDS broker爲例來進行說明,以幫助你們快速上手。python

安裝service catalogmysql

首先,進入容器服務,建立一個Kubernetes集羣,而後在控制檯就能夠看到服務目錄標籤sql

 

點擊服務目錄,點擊左上角的「集羣」,能夠選擇不一樣的集羣。若是選擇的集羣還未安裝過service catalog,點擊「請點擊安裝」,便可以進行安裝。數據庫

安裝完成後就能夠看到目前支持的各個service broker的標籤:json

 

安裝service brokerapi

點擊「rds-broker」,進入rds-broker的詳情頁面,以下所示。詳情頁面有兩個標籤頁:「說明」和「參數」。「說明」標籤頁說明了broker的具體使用方法;「參數」標籤頁是部署該broker的各類參數,能夠根據須要進行修改。安全

broker的部署有兩種方式:app

1 經過控制檯部署 點擊右側的「建立」按鈕便可以進行部署,service broker會以指定的名字部署到指定的namespace中,以rds broker爲例,會以「aliacs-rds-broker」 名稱部署到名爲「catalog」的namespace中。service catalog也安裝在「catalog」 namespace中;ssh

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

原文連接

相關文章
相關標籤/搜索