Kubernetes Service & LB & Networking :Services

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞳脓,一起剝皮案震驚了整個(gè)濱河市塑娇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劫侧,老刑警劉巖埋酬,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烧栋,居然都是意外死亡写妥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)审姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珍特,“玉大人,你說(shuō)我怎么就攤上這事魔吐≡玻” “怎么了莱找?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)砸琅。 經(jīng)常有香客問(wèn)我宋距,道長(zhǎng),這世上最難降的妖魔是什么症脂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任谚赎,我火速辦了婚禮,結(jié)果婚禮上诱篷,老公的妹妹穿的比我還像新娘壶唤。我一直安慰自己,他們只是感情好棕所,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布闸盔。 她就那樣靜靜地躺著,像睡著了一般琳省。 火紅的嫁衣襯著肌膚如雪迎吵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天针贬,我揣著相機(jī)與錄音击费,去河邊找鬼。 笑死桦他,一個(gè)胖子當(dāng)著我的面吹牛蔫巩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播快压,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼圆仔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蔫劣?” 一聲冷哼從身側(cè)響起坪郭,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拦宣,沒(méi)想到半個(gè)月后截粗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸵隧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年绸罗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豆瘫。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珊蟀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情育灸,我是刑警寧澤腻窒,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站磅崭,受9級(jí)特大地震影響儿子,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砸喻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一柔逼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧割岛,春花似錦愉适、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惠爽,卻和暖如春癌蓖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婚肆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工费坊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旬痹。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像讨越,于是被迫代替她去往敵國(guó)和親两残。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361