关键词:
- kubernetes
- docker
- Service Catalog
- Service Broker
- Helm
一、背景介绍
本文主要介绍如何让Kubernetes集群内的应用访问集群外的服务;从而实现应用与服务的分离,解耦,使得应用开发人员只关注自己的核心业务逻辑;而不用关心服务的生命周期。
采取的主要方案是使用Service Catalog与Service Broker技术。
至于Service Catalog与Service Broker的原理,可以参考一下的链接:
https://blog.csdn.net/dkfajsldfsdfsd/article/details/81062077
https://github.com/kubernetes-incubator/service-catalog
https://github.com/openservicebrokerapi/servicebroker
二、测试环境介绍
2.1 虚拟机环境介绍
系统类型 |
IP |
role |
cpu |
memory |
hostname |
---|---|---|---|---|---|
CentOS 7.4.1708 | 172.16.91.215 | master | 4 | 4G | master |
CentOS 7.4.1708 | 172.16.91.216 | worker | 4 | 4G | slave1 |
CentOS 7.4.1708 | 172.16.91.217 | worker | 2 | 1G | slave2 |
注意:
最好将内存和cpu分配的多些,不然,很有可能导致catalog-apiserver中的etcd服务不能正常提供服务;
或者部署catalog时,修改etcd中的资源属性配置
2.2 现有服务介绍
-
Kubernetes 服务
- 部署方式
kubernetes使用kubeadm方式部署的, - 版本
1.9.0 - 可以参考下面的链接,进行部署
https://www.jianshu.com/p/48695bd6401f
- 部署方式
-
docker 服务
- docker版本
- docker版本
-
helm 服务
helm的部署,可以参考下面的链接
https://www.jianshu.com/p/200020e7a843
注意:
Tiller的权限设置,不要参考上面链接的,可以使用下面的方式:
https://github.com/kubernetes-incubator/service-catalog/blob/master/docs/install.md
三、主要步骤说明
3.1 部署方式说明
使用Helm来部署Service Catalog 和 Service Borker
3.2 主要分为以下步骤:
- 部署Service Catalog
- 部署版本号:0.1.27
- 部署Service Borker
- 测试
四、部署Service Catalog
4.1 下载catalog-0.1.27.tgz
helm fetch svc-cat/catalog --version 0.1.27
4.2 部署Service Catalog
- 方式一:可以直接安装部署,
- 方式二:根据自己的需求,做一些修改
4.2.1 本文采用方式二
- 解压catalog-0.1.27.tgz
tar -zxvf catalog-0.1.27.tgz
cd catalog
- 编辑values.yaml文件
-
修改镜像的拉取策略:
- 将imagePullPolicy: Always修改为imagePullPolicy: IfNotPresent
-
将健康校验禁止掉(可能是docker版本的问题,导致健康校验总是报错,从而导致pod服务异常)
- 将enabled: true修改为enabled: false
-
或者直接使用下面的命令来替换(
下面的命令有问题,还在排查中
)
sed -i 's#imagePullPolicy: Always#imagePullPolicy: IfNotPresent#g' values.yaml
sed -i 's#enabled: true#enabled: false#g' values.yaml
sed -i 's#image: quay.io/kubernetes-service-catalog/service-catalog:v0.1.27#image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/catalog:v0.1.27#g' values.yaml
-
- cd templates
下面的命令,有问题,建议手动修改
sed -i 's#imagePullPolicy: Always#imagePullPolicy: IfNotPresent#g' apiserver-deployment.yaml
sed -i 's#image: quay.io/coreos/etcd:latest#image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/etcd:3.2.24#g' apiserver-deployment.yaml
注意
etcd版本,不一定非得是3.2.24
- 部署Service Catalog
- helm install /root/catalog --name catalog --namespace catalog
- 如何安装失败的话,就删除
- helm del --purge catalog
- helm del --purge catalog
- 查看部署情况
kubectl get pod -n catalog
五、部署Service broker
5.1 在k8s集群外创建mysql服务
下载mysql:5.6镜像(
不建议使用8.0或者最新的版本,可能会存在验证问题
)
docker pull mysql:5.6-
编写启动脚本
mkdir mysql
cd mysqltee start-mysql.sh <<-'EOF'
!/bin/bash
cur_dir=`pwd`
docker stop test-mysql
docker rm test-mysql
docker run --name test-mysql -v ${cur_dir}/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
EOF -
chmod +x start-mysql.sh && ./start-mysql.sh
docker exec -it test-mysql bash
-
创建数据库
mysql -uroot -p123456
create database mysql_service_broker;
show databases;
5.2 部署mysql-broker
下载mysql-broker
git clone https://github.com/xej520/shared-mysql-service-broker.gitcd shared-mysql-service-broker
kubectl apply -f k8s/namespace.yml
cp k8s/secret.yml.sample k8s/secret.yml
-
需要根据自己的实际情况,来修改密钥
文件中,注释的地方说明了如何得到具体的值。- 修改mysql的url地址
- 修改用户名和密码
- kubectl create -f k8s/secret.yaml
修改k8s/deployment.yml文件中的镜像拉取策略
将imagePullPolicy: Always修改为imagePullPolicy: IfNotPresent修改k8s/deployment.yml文件中的镜像
将image: making/shared-mysql-service-broker:0.0.3 修改为image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/shared-mysql-service-broker:0.0.3-
kubectl apply -f k8s/deployment.yml
- kubectl get pod -nosb #查看部署是否成功?
- kubectl get pod -nosb #查看部署是否成功?
-
kubectl apply -f k8s/cluster-service-broker.yml
- 查看部署情况
kubectl get clusterservicebrokers,clusterserviceclasses,clusterserviceplans,serviceinstances,servicebindings -oyaml
- 查看部署情况
-
创建实例
- kubectl apply -f k8s/sample/service-instance.yml
- 查看实例对象是否创建成功?
- kubectl get clusterservicebrokers,clusterserviceclasses,clusterserviceplans,serviceinstances,servicebindings -oyaml
-
如果存在问题,就不要往下进行了,先解决问题。
-
binding
- kubectl apply -f k8s/sample/service-binding.yml
- 查看bingding对象是否创建成功?
- kubectl get clusterservicebrokers,clusterserviceclasses,clusterserviceplans,serviceinstances,servicebindings -oyaml
- 如果存在问题,就不要往下进行了,先解决问题。
- 如果创建成功的话,会在默认命名空间下,会创建一个secret对象,名称是wp-db-secret
- kubectl get secret wp-db-secret -oyaml
k8s集群内的应用就是通过wp-db-secret这个密钥,访问外面的mysql服务的。
六、测试:如何使得k8s集群内的应用访问集群外的服务?
- 使用k8s/sample/wordpress.yaml
如果报挂载问题的话,可以做以下修改
mkdir /usr/local/wd
kubectl create -f k8s/sample/wordpress.yaml
-
kubectl get pod -owide
-
通过curl命令来获取catalog
随便创建一个pod,然后执行下面的命令即可- curl http://admin:123456@shared-mysql-service-broker-service.osb.svc.cluster.local/v2/catalog
- curl -u admin:123456 http://shared-mysql-service-broker-service.osb.svc.cluster.local/v2/catalog
- curl -u admin:123456 http://shared-mysql-service-broker-service.osb.svc.cluster.local/v2/catalog -H "X-Broker-API-Version: 2.12"