date: 2021-02-23title: k8s中引入外部服务 #标题
tags: k8s #标签
categories: k8s # 分类

记录下k8s中如何使用外部有状态服务,如mysql。

需求

在工作中,总会遇到这种情况:k8s环境中跑着各种程序接口,有状态服务如mysql,部署在物理机上,那么如果此时,程序接口需要访问数据库,一般有如下几种方式:

  • 通过设置程序部署文件中的 HostAliases 字段,来解析到数据库地址。(不建议,如果应用程序较多,需要每个程序部署文件都要指定 HostAlias)
  • 手动创建无头服务及endpoint,引入外部数据库,然后通过k8s集群中的域名解析服务访问,访问的主机名格式为:[svc_name].[namespace_name].svc.cluster.local
  • 通过k8s中service的externel name功能实现,具体实现方法暂时没研究,后续补充。

通过无头服务实现

假设我这里外部mysql地址为:192.168.20.2:3306,那么对应的svc及endpoint配置文件应该如下:

  1. # yml文件内容如下(service和endpoint名字要相同,属于同一个名称空间)
  2. $ cat > mysql_svc.yml << EOF
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. name: mysql
  7. namespace: default
  8. spec:
  9. clusterIP: None
  10. ports:
  11. - name: mysql
  12. port: 3306
  13. protocol: TCP
  14. targetPort: 3306
  15. type: ClusterIP
  16. ---
  17. apiVersion: v1
  18. kind: Endpoints
  19. metadata:
  20. name: mysql
  21. namespace: default
  22. subsets:
  23. - addresses:
  24. - ip: 192.168.20.2
  25. ports:
  26. - name: mysql
  27. port: 3306
  28. protocol: TCP
  29. EOF
  30. # 创建service及endpoint
  31. $ kubectl apply -f mysql_svc.yml

查看创建的svc及endpoint如下:

k8s中引入外部服务 - 图1

k8s集群中启动一个centos容器进行验证:

  1. $ cat > cenots.yml << EOF
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: cdh-master
  6. labels:
  7. role: cdh6.3
  8. spec:
  9. containers:
  10. - name: centos7-1
  11. image: registry.cn-hangzhou.aliyuncs.com/dragon8512/centos7jdk8ssh:v1
  12. ports:
  13. - containerPort: 22
  14. hostPort: 50022
  15. protocol: TCP
  16. EOF
  17. # ports 字段非必须
  18. # 创建pod
  19. $ kubectl apply -f cenots.yml

进入容器访问数据库进行测试:

k8s中引入外部服务 - 图2

OK。。。