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配置文件應該如下:

# 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如下:

enter description here

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

進入容器訪問數據庫進行測試:

enter description here

OK。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM