[Kubernetes / K8s] 服務間的溝通?ClusterIP /內部訪問服務連接Mysql資料庫 || Kubernetes Service-ClusterIP
Published in
6 min readFeb 18, 2021
ClusterIP Service 是 K8s 提供的內部反向代理
內部服務如何訪問?
我們知道NodePort是暴露給外部 那內部服務如何訪問?
Q:比方app-a 要訪問app-b?
A:能夠過PortIP 直接訪問嗎?
- 🙅 不行 因為Ip可能會變
- app-b是一個集群,有一組PortIP
解決辦法引入反向代理
K8s內部反向代理Service type → clusterIP
這邊透過mysql Service當內部反向代理,讓 pet Pod可以訪問 mySql服務
並且在邊界上加入petclinic nodeport Service 暴露給外部連接
實作內部服務訪問
首先加入mySql Pod 發布文件 mysql.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: petclinic
- name: MYSQL_DATABASE //DB名字
value: petclinic
可以看到mysql image版本 5.7
env 為環境變量 這邊方便直接把密碼寫在value 實際要放在configMap
MysqlService 發布文件
apiVersion: v1
kind: Service
metadata:
# Unique key of the Service instance
name: mysql
spec:
ports:
# Accept traffic sent to port
- name: tcp
port: 3306
targetPort: 3306
selector:
# this label selector
app: mysql
type: ClusterIP //內部訪問的反向代理
反向代理會開啟3306端口把流量轉發到帶有app: mysql 這個標籤的pod上
selector:
# this label selector
app: mysql
PetClinic Deployment 發布文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
replicas: 1
minReadySeconds: 10 #表示Port起來要等10秒 有延遲方便查看效果
selector:
matchLabels:
app: petclinic #標籤要和template label裡面一樣
template:
metadata:
labels:
app: petclinic
spec:
containers:
- name: petclinic
image: spring2go/spring-petclinic:1.0.0.RELEASE
env:
- name: SPRING_PROFILES_ACTIVE #啟動Mysql模式
value: mysql
- name: DATASOURCE_URL #透過mysqlservice連結DB為petclinic
value: jdbc:mysql://mysql/petclinic
- name: DATASOURCE_USERNAME
value: root
- name: DATASOURCE_PASSWORD
value: petclinic
- name: DATASOURCE_INIT_MODE #要初始化DB
value: always
PetClinic Service 發布文件
apiVersion: v1
kind: Service
metadata:
name: petclinic
spec:
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 31080
selector:
app: petclinic
type: NodePort
type: NodePort 對外暴露端口31080
執行檔案
kubectl apply -f .
kubectl get all#查看所有pod
查看log
kubectl logs petclinic-fd6b5fb8f-fmr77 #查看petclinic-fd6b5fb8f-fmr77
可以看到Tomcat 已經啟動並暴露8080 並且啟動PetClinicApplication
打開瀏覽器 實作成功
Sum up
ClusterIP Service 是 K8s 提供的內部反向代理
K8s Service 三種類型複習
● ClusterIP 內部服務訪問
● NodePort 對外暴露服務
● LoadBalancer 對外暴露服務(公有雲ex AWS,GCP)
注意點
- Deployment/pod 發布可以添加環境變量給Pod傳遞參數
- 有狀態服務(ex:Mysql)一般只部署一個Pod