簡單記錄下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配置文件應該如下:
# yml文件內容如下(service和endpoint名字要相同,屬於同一個名稱空間)
$ cat > mysql_svc.yml << EOF
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.20.2
ports:
- name: mysql
port: 3306
protocol: TCP
EOF
# 創建service及endpoint
$ kubectl apply -f mysql_svc.yml
查看創建的svc及endpoint如下:
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
進入容器訪問數據庫進行測試:
OK。。。