#zh_tw 請寫一個 Kubernetes 的配置範例,建置二個 Deployment 而讓他們能夠內網互相溝通, 一個 loadbalancer 對應到其中一個 Deployment
以下是一個 Kubernetes 配置範例,建立兩個 Deployment 並讓它們能夠內網互相溝通,以及一個 LoadBalancer 服務對應到其中一個 Deployment:
yamlCopy codeapiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-1
spec:
replicas: 2
selector:
matchLabels:
app: app-1
template:
metadata:
labels:
app: app-1
spec:
containers:
- name: container-1
image: your-image-repo/image-1:latest
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-2
spec:
replicas: 2
selector:
matchLabels:
app: app-2
template:
metadata:
labels:
app: app-2
spec:
containers:
- name: container-2
image: your-image-repo/image-2:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: service-1
spec:
selector:
app: app-1
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
name: service-2
spec:
selector:
app: app-2
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
這個範例中:
建立了兩個 Deployment,分別名為
deployment-1
和deployment-2
。每個 Deployment 都有 2 個副本,分別使用標籤app: app-1
和app: app-2
。為
deployment-1
和deployment-2
建立了兩個對應的 ClusterIP 服務,分別名為service-1
和service-2
。這兩個 ClusterIP 服務會將流量轉發到標籤為app: app-1
和app: app-2
的 Pod。為
deployment-2
建立了一個名為service-2
的 LoadBalancer 服務,將外部流量轉發到標籤為app: app-2
的 Pod。
通過這個配置,兩個 Deployment 的 Pod 可以通過 ClusterIP 服務在內網進行通信,而 LoadBalancer 服務則允許外部流量訪問其中一個 Deployment 的 Pod。
我的 app-2 要怎麼 ping 到 app-1 ?
在 Kubernetes 集群中,您可以使用內部的 Service DNS 名稱來讓 app-2
的 Pod 連接到 app-1
的 Pod。在本例中,app-2
可以透過 service-1
服務名稱來訪問 app-1
。
假設您的應用程式支持從環境變量讀取目標服務的 DNS 名稱,您可以在 deployment-2
的 Pod 模板中添加一個環境變量,指向 service-1
的 DNS 名稱,例如:
yamlCopy codeapiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-2
spec:
replicas: 2
selector:
matchLabels:
app: app-2
template:
metadata:
labels:
app: app-2
spec:
containers:
- name: container-2
image: your-image-repo/image-2:latest
ports:
- containerPort: 80
env:
- name: APP_1_SERVICE_URL
value: "http://service-1.default.svc.cluster.local:80"
這裡,我們為 container-2
添加了一個環境變量 APP_1_SERVICE_URL
,其值為 http://service-1.default.svc.cluster.local:80
。這個環境變量將被傳遞給 app-2
的應用程式,讓它可以連接到 app-1
。
在您的 app-2
應用程式中,您需要使用這個環境變量(例如,APP_1_SERVICE_URL
)作為 app-1
服務的基礎 URL 進行連接。根據您的應用程式語言和框架,讀取環境變量的方法可能會有所不同。
例如,如果您的應用程式是用 Python 編寫的,您可以使用以下方式讀取環境變量:
pythonCopy codeimport os
app_1_service_url = os.environ['APP_1_SERVICE_URL']
之後,您可以使用 app_1_service_url
作為 app-1
服務的基礎 URL 進行連接。
service-1.default.svc.cluster.local 是固定值嗎? 每次 deploy 會不會變更呢?
service-1.default.svc.cluster.local
是一個 Kubernetes 服務的內部 DNS 名稱。這個名稱是根據您的服務名稱和命名空間生成的。在本例中,服務名稱是 service-1
,命名空間是 default
。DNS 名稱的結構為 <service-name>.<namespace>.svc.cluster.local
。
這個 DNS 名稱在 Kubernetes 集群中是固定的,只要您不更改相應的服務名稱和命名空間。每次部署時,只要保持相同的服務名稱和命名空間,這個 DNS 名稱就不會變更。
在本例中,每次部署時,只要您保持服務名稱為 service-1
和命名空間為 default
,service-1.default.svc.cluster.local
的 DNS 名稱就不會變更。
當然,如果您將服務名稱或命名空間更改為其他值,則對應的 DNS 名稱也會相應更改。在這種情況下,您需要在應用程式配置或部署文件中更新相應的 DNS 名稱。