date: 2021-02-23title: k8s中引入外部服务 #标题
tags: k8s #标签
categories: k8s # 分类
需求
在工作中,总会遇到这种情况: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配置文件应该如下:
# yml文件内容如下(service和endpoint名字要相同,属于同一个名称空间)$ cat > mysql_svc.yml << EOFapiVersion: v1kind: Servicemetadata:name: mysqlnamespace: defaultspec:clusterIP: Noneports:- name: mysqlport: 3306protocol: TCPtargetPort: 3306type: ClusterIP---apiVersion: v1kind: Endpointsmetadata:name: mysqlnamespace: defaultsubsets:- addresses:- ip: 192.168.20.2ports:- name: mysqlport: 3306protocol: TCPEOF# 创建service及endpoint$ kubectl apply -f mysql_svc.yml
查看创建的svc及endpoint如下:

k8s集群中启动一个centos容器进行验证:
$ cat > cenots.yml << EOFapiVersion: v1kind: Podmetadata:name: cdh-masterlabels:role: cdh6.3spec:containers:- name: centos7-1image: registry.cn-hangzhou.aliyuncs.com/dragon8512/centos7jdk8ssh:v1ports:- containerPort: 22hostPort: 50022protocol: TCPEOF# ports 字段非必须# 创建pod$ kubectl apply -f cenots.yml
进入容器访问数据库进行测试:

OK。。。
