K8s環境內部的服務怎麼註冊到外部

描述

最近在使用nacos和k8s的時候遇到一個問題:nacos部署在k8s的外部,服務部署在K8s內部,服務註冊該怎麼玩呢? 其實我們現實環境中,不可能所有的服務都部署在k8s內部的,總有些服務要部署在k8s外部的。下面我聊一下我的想法

LoadBalancer

創建一個LoadBalancer類型的service,這樣就會把我們服務映射到外部的負載均衡上了。 我們k8s內部的服務需要註冊負載均衡的地址到nacos。如果你的k8s是安裝在下面這些環境的,那麼你可以使用這種方式(居然沒有阿里雲)
在這裏插入圖片描述
在這裏插入圖片描述

使用Kong

這種方式是在K8s內部安裝一套Kong,K8s內部的服務首先註冊到Kong上,然後向nacos註冊的時候,註冊Kong的地址
在這裏插入圖片描述

註冊節點的Ip和Pod的hostPort

這種方式我覺得最好了,但是實際環境中我沒有實現,還請大神相助

  • 我們的服務在k8s裏面啓動成deployment
  • 利用k8s的downward ApI將pod所在的節點的IP,設置成容器的環境變量
  • 我卡在此處了, 沒有辦法將hostPort設置成容器的環境變量
  • pod啓動的時候,程序通過環境變量獲取節點的Ip和hostPort,並註冊到nacos
  • 外部服務通過NodeIP + hostPort訪問服務
    在這裏插入圖片描述

註冊service的Nodeport和pod所在的節點的IP

  • 啓動一個NodePort類型的service
  • 我們的服務在k8s裏面啓動成deployment, 通過downward ApI將pod所在節點的IP,設置爲容器內部的環境變量
  • pod啓動的時候通過K8s的API獲取service的Nodeport
  • 將節點的Ip和service的NodePort註冊到nacos中去
該方案的實際操作
  • 啓動一個service
apiVersion: v1
kind: Service
metadata:
  name: service-to-external
  namespace: testuser
spec:
  selector:
    app:  nginx-to-external
  type: NodePort 
  ports:   
    - name: http 
      port: 80
  • 啓動deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: to-external-deployment
  namespace: testuser
  labels:
    app: to-external
spec:
  replicas: 1
  selector:
    matchLabels:
      app:  nginx-to-external
  template:
    metadata:
      labels:
        app: nginx-to-external
    spec:
      containers:
      - name:  nginx-to-external-deployment
        env:
        - name: node_ip
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - name: namespace
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: service_name
          value: service-to-external
        image:  172.16.0.96:800/demaxieya/python-script:v1.0
        ports:
           - containerPort: 80
             name: web
  • node_ip 就是通過downward ApI獲取節點的Ip
  • namespace 就是通過downward ApI獲取namespace
    service_name 前面創建的service的名字
  • 鏡像啓動時執行的腳本
import os 
import requests

namespace = os.getenv("namespace")
node_ip = os.getenv("node_ip")
service_name = os.getenv("service_name")
url = "https://kubernetes.default.svc/api/v1/namespaces/%s/services/%s" % (namespace, service_name)
cert = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"

response = requests.get(url, verify=cert)
print("節點的ip:" , node_ip)
print("service的信息: ", response.json())
  • kubernetes.default.svc 這個是API server的地址
  • 默認pod啓動的時候使用的是default的serviceAccount,沒有訪問service的權限,需要我們做一個角色綁定。或者自己創建一個具有查看service權限的賬戶
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-secrets-global
subjects:
- kind: User
  name: system:anonymous
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io
  • 查看腳本的輸出
    下圖中可以看到我們已經獲取到ip地址和Nodeport了, 後面就可以向nacos註冊了。我就省略了註冊的步驟了
    在這裏插入圖片描述

先寫到這裏了,服務註冊是大話題,小弟也只是理解一部分, 如果有異議或者問題 請進QQ羣630300475,大家聊聊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章