Model: GPT-4
Avatar of the person chatting

#zh_tw 請寫一個 Kubernetes 的配置範例,建置二個 Deployment 而讓他們能夠內網互相溝通, 一個 loadbalancer 對應到其中一個 Deployment

以下是一個 Kubernetes 配置範例,建立兩個 Deployment 並讓它們能夠內網互相溝通,以及一個 LoadBalancer 服務對應到其中一個 Deployment:

yamlCopy code
apiVersion: 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

這個範例中:

  1. 建立了兩個 Deployment,分別名為 deployment-1deployment-2。每個 Deployment 都有 2 個副本,分別使用標籤 app: app-1app: app-2

  2. deployment-1deployment-2 建立了兩個對應的 ClusterIP 服務,分別名為 service-1service-2。這兩個 ClusterIP 服務會將流量轉發到標籤為 app: app-1app: app-2 的 Pod。

  3. deployment-2 建立了一個名為 service-2 的 LoadBalancer 服務,將外部流量轉發到標籤為 app: app-2 的 Pod。

通過這個配置,兩個 Deployment 的 Pod 可以通過 ClusterIP 服務在內網進行通信,而 LoadBalancer 服務則允許外部流量訪問其中一個 Deployment 的 Pod。

Avatar of the person chatting

我的 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 code
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 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 code
import os app_1_service_url = os.environ['APP_1_SERVICE_URL']

之後,您可以使用 app_1_service_url 作為 app-1 服務的基礎 URL 進行連接。

Avatar of the person chatting

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 和命名空間為 defaultservice-1.default.svc.cluster.local 的 DNS 名稱就不會變更。

當然,如果您將服務名稱或命名空間更改為其他值,則對應的 DNS 名稱也會相應更改。在這種情況下,您需要在應用程式配置或部署文件中更新相應的 DNS 名稱。