Kubernetes引入外部服务与外部数据源

Posted 张志翔 ̮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes引入外部服务与外部数据源相关的知识,希望对你有一定的参考价值。

        Kubernetes中如何使用外部有状态服务,比如:mysql、Redis等

一、需求

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

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

二、通过无头服务实现

        个人推荐使用无头服务,使用传统的
        假设我这里外部 mysql 地址为:192.168.181.147:3306,那么对应的 svc 及 endpoint 配置文件 mysql.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: default
spec:
  clusterIP: None
  ports:
  - name: mysql
    port: 3306
    protocol: TCP
    targetPort: 3306
  type: ClusterIP

---
apiVersion: v1
kind: Endpoints
metadata:
  name: mysql
  namespace: default
subsets:
- addresses:
  - ip: 192.168.181.147
  ports:
  - name: mysql
    port: 3306
    protocol: TCP# 创建service及endpoint # kubectl apply -f mysql.yml

        查看创建的 svc 及 endpoint 如下

# kubectl describe svc/mysql
# kubectl describe endpoints/mysql

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

$ cat > cenots.yml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: cdh-master
  labels:
    role: cdh6.3
spec:
  containers:
    - name: centos7-1
      image: registry.cn-hangzhou.aliyuncs.com/dragon8512/centos7jdk8ssh:v1
      ports:
        - containerPort: 22
          hostPort: 50022
          protocol: TCP
EOF
# ports 字段非必须


# 创建pod
# kubectl apply -f cenots.yml

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

# kubectl exec -it cdh-master bin/bash
[root@cdh-master /]# ping mysql.default.svc.cluster.local

        springboot 数据源配置:

mysql.default.svc.cluster.local

以上是关于Kubernetes引入外部服务与外部数据源的主要内容,如果未能解决你的问题,请参考以下文章

将 Google Cloud 中的外部 IP 与 Kubernetes 服务一起使用以将其公开到 Internet

Kubernetes 服务外部 ip 待定

如何使用外部服务器配置 Kubernetes?

云原生之kubernetes在kubernetes集群下的映射外部服务—Eendpoint

如何在 Kitura 服务器中获取 Kubernetes 外部 IP

详解kubernetes备份恢复利器 Velero - 深入了解Carina系列第三期