
Service 創(chuàng)建
1、With Label Selector
使用標(biāo)簽選擇器創(chuàng)建服務(wù),Service 直接關(guān)聯(lián) Pod,示例:部署 Mysql (細(xì)節(jié)見文末附錄1),再創(chuàng)建服務(wù):
kind: Service
apiVersion: v1
metadata:
name: mysql-service
spec:
selector: # 與 Pod 創(chuàng)建時的 matchLabels 值相同即可匹配
environment: dev
database: mysql
ports:
- protocol: TCP # 協(xié)議可選 UDP 和 TCP,默認(rèn) TCP
port: 3306 # 對外暴露的端口號
targetPort: 3306 # 容器中 Mysql 的端口號,port 與 targetPort 相同時, targetPort 可省略不寫
2、Without Label Selector
Service 通常抽象化訪問 Pods,但 Service 也可以抽象化訪問其他類型的后端服務(wù)。例如:
- 你希望在生產(chǎn)中訪問外部數(shù)據(jù)庫群集(k8s 外),但在測試中你希望使用自己的數(shù)據(jù)庫(k8s 內(nèi));
- 你希望將你的服務(wù)指向另一個名稱空間或另一個群集中的服務(wù);
- 你正在將服務(wù)遷移到 Kubernetes,而其中一些后端運(yùn)行在 Kubernetes 之外。
示例:
① 在 minikube 中使用 Docker 啟動一個 Mysql 容器(與 Kubernetes 無任何關(guān)系)
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-out mysql:5.6
② 創(chuàng)建不帶標(biāo)簽選擇器的 Service :
kind: Service
apiVersion: v1
metadata:
name: mysql-service-outside
spec:
ports:
- port: 3306
targetPort: 3306
③ 創(chuàng)建 Endpoints 將 mysql-service-outside 映射到 mysql
kind: Endpoints
apiVersion: v1
metadata:
name: mysql-service-outside
subsets:
- addresses:
- ip: 192.168.99.100 # IP 地址為 Mysql 所在的服務(wù)器的地址
ports:
- port: 3307 # 上述創(chuàng)建 mysql 容器所指定的端口號

④ 測試使用 mysql-service-outside 作為入口訪問 Mysql
kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h mysql-service-outside -p123456

3、ExternalName Service
ExternalName Service 是沒有選擇器的特殊服務(wù),它沒有定義任何端口或端點(diǎn)。查找主機(jī) mysql-service-domain.default.svc.CLUSTER 時,集群 DNS 服務(wù)將返回值為 mysql.anoyi.com 的 CNAME 記錄。訪問這種服務(wù)的方式與其他服務(wù)一樣,唯一的區(qū)別在于重定向發(fā)生在 DNS 級別,并且沒有代理或轉(zhuǎn)發(fā)發(fā)生。
kind: Service
apiVersion: v1
metadata:
name: mysql-service-domain
spec:
type: ExternalName
externalName: mysql.anoyi.com
服務(wù)發(fā)現(xiàn)
Kubernetes 支持 2 中發(fā)現(xiàn)服務(wù)的方式:環(huán)境變量 和 DNS。
1、環(huán)境變量
當(dāng) Pod 在節(jié)點(diǎn)中運(yùn)行,kubelet 會為每個 active 狀態(tài)的服務(wù)添加一組環(huán)境變量。它支持 Docker links compatible 變量(請參閱 makeLinkVariables )和更簡單的 {SVCNAME}_SERVICE_HOST 和 {SVCNAME}_SERVICE_PORT 變量,其中服務(wù)名稱為大寫,破折號轉(zhuǎn)換為下劃線。
示例:服務(wù) redis-master 暴露 TCP 端口 6379 且已分配了clusterIP 地址10.0.0.11 , 會生成以下環(huán)境變量:
REDIS_MASTER_SERVICE_HOST=10.0.0.11
REDIS_MASTER_SERVICE_PORT=6379
REDIS_MASTER_PORT=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11
如何應(yīng)用這些變量呢?
示例:創(chuàng)建 Mongo 服務(wù)(細(xì)節(jié)見文末附錄 2),創(chuàng)建 Mongo-Express 服務(wù)連通 Mongo 服務(wù)
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-express
labels:
environment: dev
service: mongo-express
spec:
selector:
matchLabels:
environment: dev
web: mongo-express
strategy:
type: Recreate
template:
metadata:
labels:
environment: dev
web: mongo-express
spec:
containers:
- image: registry.docker-cn.com/library/mongo-express
name: mongo-express
ports:
- containerPort: 8081
name: mongo-express
env:
- name: ME_CONFIG_OPTIONS_EDITORTHEME
value: ambiance
- name: ME_CONFIG_MONGODB_SERVER
value: $(MONGO_SERVICE_SERVICE_HOST)
如上所示,使用 $(...) 引用環(huán)境變量
2、DNS
DNS Server 是一個非常推薦的可選的集群插件,它觀察 Service 相關(guān) API 動態(tài)管理 DNS 記錄。如果在整個集群中啟用了 DNS,則所有的 Pod 應(yīng)該能夠自動進(jìn)行服務(wù)的名稱解析。
示例,假設(shè)在 [Namespace] my-ns 中創(chuàng)建 [Service] my-service ,則會生成一條 DNS 記錄 my-service.my-ns,則在 [Namespace] my-ns 中的 Pod 都可以通過 my-service 找到這個服務(wù);如果在集群內(nèi)的其他 [Namespace] ,則需要通過 my-service.my-ns 來發(fā)現(xiàn)這個服務(wù)。
示例:通過 DNS 方式連通 Mongo 和 Mongo-Express,只需修改為如下即可:
- name: ME_CONFIG_MONGODB_SERVER
value: mongo-service
發(fā)布服務(wù) - Service Types
Service 支持如下幾種類型,默認(rèn)是 ClusterIP :
-
ClusterIP: 暴露服務(wù)在一個集群內(nèi)部的 IP,此類型只支持內(nèi)部訪問服務(wù)。 -
NodePort: 暴露服務(wù)在集群每個節(jié)點(diǎn)的靜態(tài)端口. 在集群外部通過<NodeIP>:<NodePort>即可訪問集群內(nèi)的服務(wù)。 -
LoadBalancer: 通過云供應(yīng)商提供的負(fù)載均衡器暴露服務(wù)。將自動創(chuàng)建外部負(fù)載平衡器路由到的 NodePort 和 ClusterIP 服務(wù)。 -
ExternalName: 相當(dāng)于 DNS 的 CNAME,上述有示例。
示例:通過 NodePort 暴露 Mongo-Express 服務(wù)
kind: Service
apiVersion: v1
metadata:
name: mongo-express-service
spec:
selector:
environment: dev
web: mongo-express
ports:
- nodePort: 30005
port: 8081
type: NodePort

多端口 Service
示例:http 和 https 服務(wù)
kind: Service
apiVersion: v1
metadata:
name: web-service
spec:
selector:
app: webApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
- name: https
protocol: TCP
port: 443
targetPort: 8443
附錄
1、Mysql Deployment 創(chuàng)建
# 創(chuàng)建 Secret
apiVersion: v1
kind: Secret
metadata:
name: mysql-root-password
type: Opaque
data:
password: MTIzNDU2 # '123456' -> base64 -> 'MTIzNDU2' 相關(guān)命令: 'echo -n '123456' | base64'
---
# 創(chuàng)建持久化存儲卷
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
# 創(chuàng)建部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
environment: dev
service: mysql
spec:
selector:
matchLabels:
environment: dev
database: mysql
strategy:
type: Recreate
template:
metadata:
labels:
environment: dev
database: mysql
spec:
containers:
- image: registry.docker-cn.com/library/mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-root-password
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc
2、MongoDB Deployment 創(chuàng)建
# 創(chuàng)建持久化存儲卷
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongo-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
# 創(chuàng)建部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo
labels:
environment: dev
service: mongo
spec:
selector:
matchLabels:
environment: dev
database: mongo
strategy:
type: Recreate
template:
metadata:
labels:
environment: dev
database: mongo
spec:
containers:
- image: registry.docker-cn.com/library/mongo
name: mongo
ports:
- containerPort: 27017
name: mongo
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
volumes:
- name: mongo-persistent-storage
persistentVolumeClaim:
claimName: mongo-pvc
---
# 創(chuàng)建服務(wù)
kind: Service
apiVersion: v1
metadata:
name: mongo-service
spec:
selector:
environment: dev
database: mongo
ports:
- port: 27017