本例以 VMware 虛擬機(jī)進(jìn)行演示,旨在搭建一個萌新級別的 demo卖擅,開始教程之前墨技,請確保 Kubernetes 環(huán)境正常挎狸。
查看 kube-system 各個 pod 組件狀態(tài)
-
環(huán)境準(zhǔn)備:
- Windows 宿主機(jī) (192.168.244.1)锨匆、多個虛擬主機(jī)節(jié)點崭别,包括 master 節(jié)點 (192.168.244.143)恐锣、其他 worker 節(jié)點 (node1、node2...需確保主機(jī)間網(wǎng)絡(luò)互通)
-
構(gòu)建鏡像與發(fā)布到 Docker Hub:
- 這里以 Go 語言
json
方式實現(xiàn)一個 RPC 遠(yuǎn)程調(diào)用的 demo 代碼為例诀姚,項目結(jié)構(gòu)如下:
[root@master rpcproject]# tree ├── client.go ├── Dockerfile ├── go_deployment.yaml ├── go.mod ├── go_service.yaml ├── message │ └── message.go └── server.go
- Dockerfile 內(nèi)容:
# 使用官方的 Go 鏡像作為基礎(chǔ)鏡像 FROM golang:latest # 設(shè)置工作目錄 WORKDIR /app # 將本地的代碼復(fù)制到容器中的工作目錄 COPY . . # 構(gòu)建 Go 應(yīng)用程序 RUN go build -o server server.go # 暴露應(yīng)用程序運行的端口 EXPOSE 1234 # 運行應(yīng)用程序 CMD ["./server"]
- Docker 構(gòu)建本地鏡像:
docker build -t rpc-go-demo .
- 打個發(fā)布標(biāo)簽備后續(xù)推送到 Docker Hub 遠(yuǎn)程倉庫:
docker tag rpc-go-demo:latest dys12345678/rpc-go-demo:v1
- 使用
docker login
登錄到Docker Hub
(請事先登錄官網(wǎng)注冊個賬號)玷禽,docker push
推送鏡像到遠(yuǎn)程倉庫:
docker push dys12345678/rpc-go-demo:v1
- 這里以 Go 語言
-
以
Deployment
方式部署以上應(yīng)用程序:-
go_deployment.yaml
文件內(nèi)容:kind: Deployment metadata: name: gorpc-app-deployment spec: replicas: 3 # 根據(jù)需要調(diào)整副本數(shù)量 selector: matchLabels: app: gorpc-app template: metadata: labels: app: gorpc-app spec: containers: - name: gorpc-app image: docker.io/dys12345678/rpc-go-demo:v1 # 使用你的鏡像名稱和版本 imagePullPolicy: Always ports: - containerPort: 1234
- 執(zhí)行
kubectl apply -f go_deployment.yaml
部署應(yīng)用 - 以上
replicas
了三份矢赁,查看 pod 狀態(tài):
success
-
-
構(gòu)建部署
Service
,使用NodePort
類型進(jìn)行部署炬丸,暴露節(jié)點端口蜒蕾,這樣 Windows 宿主機(jī)能遠(yuǎn)程調(diào)用內(nèi)部集群:-
go_service.yaml
文件內(nèi)容:--- apiVersion: v1 kind: Service metadata: name: gorpc-app-service spec: selector: app: gorpc-app ports: - protocol: TCP port: 80 targetPort: 1234 nodePort: 30003 type: NodePort # 根據(jù)需要選擇 Service 的類型
執(zhí)行
kubectl apply -f go_service.yaml
部署 service-
查看 Service 狀態(tài):
success 以上
service
是在master
節(jié)點部署,暴露的節(jié)點端口為30003
首启,只要能互通到該節(jié)點的網(wǎng)絡(luò)機(jī)子都能通過192.168.244.143:30003
調(diào)用到目標(biāo)集群
-
-
宿主機(jī)執(zhí)行客戶端代碼成功訪問:
-
client.go
:package main import ( "fmt" "net/rpc/jsonrpc" "rpcproject/message" ) func main() { // 連接到 RPC 服務(wù) client, err := jsonrpc.Dial("tcp", "192.168.244.143:30003") if err != nil { fmt.Println("Error connecting to server:", err) return } defer client.Close() // 準(zhǔn)備遠(yuǎn)程方法的參數(shù) args := &message.Args{7, 3} // 調(diào)用遠(yuǎn)程方法 Multiply var reply int err = client.Call("Arith.Multiply", args, &reply) if err != nil { fmt.Println("Error calling Multiply:", err) return } fmt.Printf("Arith: %d * %d = %d\n", args.A, args.B, reply) // 調(diào)用遠(yuǎn)程方法 Divide var quo message.Quotient err = client.Call("Arith.Divide", args, &quo) if err != nil { fmt.Println("Error calling Divide:", err) return } fmt.Printf("Arith: %d / %d = %d remainder %d\n", args.A, args.B, quo.Quo, quo.Rem) }
success
-
Tip: 示例中的源碼請參見 GitHub