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
本文爲雲棲社區原創內容,未經容許不得轉載。