本篇博客 copy 自 https://www.cnblogs.com/lvzhenjiang/p/14445315.html,感謝博主!本人的博客主要做自己爬坑記錄之用。
k8s中如何使用外部有狀態服務,如mysql。
一、需求
在工作中,總會遇到這種情況: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