K8s環(huán)境內(nèi)部的服務(wù)如何注冊到外部
描述
最近在使用nacos和k8s的時候遇到一個問題:nacos部署在k8s的外部,服務(wù)部署在K8s內(nèi)部,服務(wù)注冊該怎么玩呢?
其實我們現(xiàn)實環(huán)境中,不可能所有的服務(wù)都部署在k8s內(nèi)部的,總有些服務(wù)要部署在k8s外部的。
下面我聊一下我的想法
LoadBalancer
創(chuàng)建一個LoadBalancer類型的service,這樣就會把我們服務(wù)映射到外部的負載均衡上了。
我們k8s內(nèi)部的服務(wù)需要注冊負載均衡的地址到nacos。
如果你的k8s是安裝在下面這些環(huán)境的,那么你可以使用這種方式(居然沒有阿里云)


使用Kong
這種方式是在K8s內(nèi)部安裝一套Kong,K8s內(nèi)部的服務(wù)首先注冊到Kong上,然后向nacos注冊的時候,注冊Kong的地址

注冊節(jié)點的Ip和Pod的hostPort
這種方式我覺得最好了,但是實際環(huán)境中我沒有實現(xiàn),還請大神相助
- 我們的服務(wù)在k8s里面啟動成deployment
- 利用k8s的downward ApI將pod所在的節(jié)點的IP,設(shè)置成容器的環(huán)境變量
我卡在此處了, 沒有辦法將hostPort設(shè)置成容器的環(huán)境變量- pod啟動的時候,程序通過環(huán)境變量獲取節(jié)點的Ip和hostPort,并注冊到nacos
- 外部服務(wù)通過NodeIP + hostPort訪問服務(wù)

注冊service的Nodeport和pod所在的節(jié)點的IP
- 啟動一個NodePort類型的service
- 我們的服務(wù)在k8s里面啟動成deployment, 通過downward ApI將pod所在節(jié)點的IP,設(shè)置為容器內(nèi)部的環(huán)境變量
- pod啟動的時候通過K8s的API獲取service的Nodeport
- 將節(jié)點的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獲取節(jié)點的Ip
namespace 就是通過downward ApI獲取namespace
service_name 前面創(chuàng)建的service的名字
- 鏡像啟動時執(zhí)行的腳本
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("節(jié)點的ip:" , node_ip)
print("service的信息: ", response.json())
- kubernetes.default.svc 這個是API server的地址
- 默認pod啟動的時候使用的是default的serviceAccount,沒有訪問service的權(quán)限,需要我們做一個角色綁定?;蛘咦约簞?chuàng)建一個具有查看service權(quán)限的賬戶
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
- 查看腳本的輸出
下圖中可以看到我們已經(jīng)獲取到ip地址和Nodeport了, 后面就可以向nacos注冊了。我就省略了注冊的步驟了

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Hadoop 2.x與3.x 22點比較,Hadoop 3.x比2.x的改進
本文介紹了Hadoop3版本中添加的新功能,Hadoop 2和Hadoop 3的區(qū)別,在這篇文章中,我們將討論Hadoop 2.x與Hadoop 3.x之間的比較。感興趣的朋友跟隨小編一起看一下2018-09-09
刪除k8s環(huán)境過期鏡像&docker磁盤清理方式
文章介紹了如何清理Kubernetes環(huán)境中的過期鏡像和Docker磁盤空間,包括使用`docker system prune`命令和編寫腳本進行鏡像刪除2025-12-12

