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é)見文末附錄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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容