Service 創(chuàng)建
1闹获、With Label Selector
使用標(biāo)簽選擇器創(chuàng)建服務(wù)房蝉,Service 直接關(guān)聯(lián) Pod,示例:部署 Mysql (細(xì)節(jié)見(jiàn)文末附錄1)突梦,再創(chuàng)建服務(wù):
kind: Service
apiVersion: v1
metadata:
name: mysql-service
spec:
selector: # 與 Pod 創(chuàng)建時(shí)的 matchLabels 值相同即可匹配
environment: dev
database: mysql
ports:
- protocol: TCP # 協(xié)議可選 UDP 和 TCP咱圆,默認(rèn) TCP
port: 3306 # 對(duì)外暴露的端口號(hào)
targetPort: 3306 # 容器中 Mysql 的端口號(hào)笛辟,port 與 targetPort 相同時(shí), targetPort 可省略不寫(xiě)
2序苏、Without Label Selector
Service 通常抽象化訪問(wèn) Pods手幢,但 Service 也可以抽象化訪問(wèn)其他類型的后端服務(wù)。例如:
- 你希望在生產(chǎn)中訪問(wèn)外部數(shù)據(jù)庫(kù)群集(k8s 外)忱详,但在測(cè)試中你希望使用自己的數(shù)據(jù)庫(kù)(k8s 內(nèi))围来;
- 你希望將你的服務(wù)指向另一個(gè)名稱空間或另一個(gè)群集中的服務(wù);
- 你正在將服務(wù)遷移到 Kubernetes踱阿,而其中一些后端運(yùn)行在 Kubernetes 之外管钳。
示例:
① 在 minikube 中使用 Docker 啟動(dòng)一個(gè) Mysql 容器(與 Kubernetes 無(wú)任何關(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 容器所指定的端口號(hào)
④ 測(cè)試使用 mysql-service-outside 作為入口訪問(wèn) Mysql
kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h mysql-service-outside -p123456
3、ExternalName Service
ExternalName Service 是沒(méi)有選擇器的特殊服務(wù)软舌,它沒(méi)有定義任何端口或端點(diǎn)才漆。查找主機(jī) mysql-service-domain.default.svc.CLUSTER
時(shí),集群 DNS 服務(wù)將返回值為 mysql.anoyi.com
的 CNAME 記錄佛点。訪問(wèn)這種服務(wù)的方式與其他服務(wù)一樣醇滥,唯一的區(qū)別在于重定向發(fā)生在 DNS 級(jí)別,并且沒(méi)有代理或轉(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 會(huì)為每個(gè) active 狀態(tài)的服務(wù)添加一組環(huán)境變量不跟。它支持 Docker links compatible 變量(請(qǐng)參閱 makeLinkVariables )和更簡(jiǎn)單的 {SVCNAME}_SERVICE_HOST
和 {SVCNAME}_SERVICE_PORT
變量,其中服務(wù)名稱為大寫(xiě)米碰,破折號(hào)轉(zhuǎn)換為下劃線窝革。
示例:服務(wù) redis-master 暴露 TCP 端口 6379 且已分配了clusterIP 地址10.0.0.11 , 會(huì)生成以下環(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é)見(jiàn)文末附錄 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 是一個(gè)非常推薦的可選的集群插件,它觀察 Service 相關(guān) API 動(dòng)態(tài)管理 DNS 記錄漆诽。如果在整個(gè)集群中啟用了 DNS侮攀,則所有的 Pod 應(yīng)該能夠自動(dòng)進(jìn)行服務(wù)的名稱解析。
示例厢拭,假設(shè)在 [Namespace] my-ns
中創(chuàng)建 [Service] my-service
兰英,則會(huì)生成一條 DNS 記錄 my-service.my-ns
,則在 [Namespace] my-ns
中的 Pod 都可以通過(guò) my-service
找到這個(gè)服務(wù)供鸠;如果在集群內(nèi)的其他 [Namespace] 箭昵,則需要通過(guò) my-service.my-ns
來(lái)發(fā)現(xiàn)這個(gè)服務(wù)。
示例:通過(guò) DNS 方式連通 Mongo 和 Mongo-Express回季,只需修改為如下即可:
- name: ME_CONFIG_MONGODB_SERVER
value: mongo-service
發(fā)布服務(wù) - Service Types
Service 支持如下幾種類型,默認(rèn)是 ClusterIP
:
-
ClusterIP
: 暴露服務(wù)在一個(gè)集群內(nèi)部的 IP正林,此類型只支持內(nèi)部訪問(wèn)服務(wù)泡一。 -
NodePort
: 暴露服務(wù)在集群每個(gè)節(jié)點(diǎn)的靜態(tài)端口. 在集群外部通過(guò)<NodeIP>:<NodePort>
即可訪問(wèn)集群內(nèi)的服務(wù)。 -
LoadBalancer
: 通過(guò)云供應(yīng)商提供的負(fù)載均衡器暴露服務(wù)觅廓。將自動(dòng)創(chuàng)建外部負(fù)載平衡器路由到的 NodePort 和 ClusterIP 服務(wù)鼻忠。 -
ExternalName
: 相當(dāng)于 DNS 的 CNAME,上述有示例杈绸。
示例:通過(guò) 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)建持久化存儲(chǔ)卷
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)建持久化存儲(chǔ)卷
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