[Kubernetes / K8s] 服務間的溝通?ClusterIP /內部訪問服務連接Mysql資料庫 || Kubernetes Service-ClusterIP

KouWei.Lee
k8s筆記
Published in
6 min readFeb 18, 2021

ClusterIP Service 是 K8s 提供的內部反向代理

內部服務如何訪問?

我們知道NodePort是暴露給外部 那內部服務如何訪問?

Q:比方app-a 要訪問app-b?

A:能夠過PortIP 直接訪問嗎?

  1. 🙅 不行 因為Ip可能會變
  2. 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

--

--