Workerman 是一個 PHP 編寫的高性能的 socket 服務(wù)器通訊框架,用于快速開發(fā)各種網(wǎng)絡(luò)應(yīng)用,包括tcp的、udp的、長連接、短連接應(yīng)用。
但他的官網(wǎng)并未提供 K8S 部署教程。下面咱們來用 K8S 部署一下 workerman-chat,他的源代碼在 https://github.com/walkor/workerman-chat。
本教程的包含了他的源代碼(僅作為示例代碼保存,代碼版權(quán)屬于原作者,正式部署請至 Workerman 官方下載),修改了部分代碼,修改處會在下文中說明。
本文的 git 地址在 https://github.com/cloudbeer/workerman-chat-k8s
我們將按照如下的架構(gòu)部署:
docker 鏡像均已經(jīng)上傳到 hub.docker.com,本文的腳本可以在騰訊云 TKE 中直接運(yùn)行。
部署腳本如下:
kubectl apply -f ns.yaml
kubectl apply -f register.yaml
kubectl apply -f gateway.yaml
kubectl apply -f businessworker.yaml
workerman 運(yùn)行環(huán)境,需要安裝 pcntl,代碼如下。
這個 docker 包標(biāo)記為:cloudbeer/workerman-base:1.0
FROM php:7.3
RUN docker-php-ext-configure pcntl --enable-pcntl \
&& docker-php-ext-install pcntl
我們使用分布式部署,所以需要修改 gateway 代碼中的注冊地址:127.0.0.1,但在容器中分布式部署,我們無法得知pod 的 ip,故改成動態(tài)獲取 ip 的方式。
register 的 ip 也未知,但在 K8S 中,這個地址可以通過 service 發(fā)布出來,我們暫且命名這個服務(wù)為 register,gateway 和 businessworker 中注冊中心的地址修改為 register 即可。
Applications/Chat/start_gateway.php,修改如下:
//....
// 分布式部署時請設(shè)置成內(nèi)網(wǎng)ip(非127.0.0.1)
// $gateway->lanIp = '127.0.0.1';
$gateway->lanIp = getHostByName(getHostName());
//....
// 服務(wù)注冊地址
// $gateway->registerAddress = '127.0.0.1:1236';
$gateway->registerAddress = 'register:1236';
//....
Applications/Chat/start_businessworker.php,修改如下:
//....
// 服務(wù)注冊地址
// $worker->registerAddress = '127.0.0.1:1236';
$worker->registerAddress = 'register:1236';
//....
打包代碼(別忘記 composer install 一下先):
FROM cloudbeer/workerman-base:1.0
RUN mkdir /app
COPY ./workerman-chat /app
apiVersion: apps/v1
kind: Deployment
metadata:
name: workerman-chat-register
namespace: workerman
labels:
app: workerman-chat-register
spec:
replicas: 1
selector:
matchLabels:
app: workerman-chat-register
template:
metadata:
labels:
app: workerman-chat-register
spec:
containers:
- name: register
image: cloudbeer/workerman-code:1.0
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
ports:
- containerPort: 1236
protocol: TCP
command: [php, /app/Applications/Chat/start_register.php, start]
---
apiVersion: v1
kind: Service
metadata:
name: register
namespace: workerman
spec:
selector:
app: workerman-chat-register
ports:
- protocol: TCP
port: 1236
targetPort: 1236
部署 gateway 的 pod,由于需要對外提供服務(wù),使用了 LoadBalancer 的 service 發(fā)布服務(wù)。這里也可以創(chuàng)建 ingress 來發(fā)布服務(wù)。
apiVersion: apps/v1
kind: Deployment
metadata:
name: workerman-chat-gateway
namespace: workerman
labels:
app: workerman-chat-gateway
spec:
replicas: 1
selector:
matchLabels:
app: workerman-chat-gateway
template:
metadata:
labels:
app: workerman-chat-gateway
spec:
containers:
- name: gateway
image: cloudbeer/workerman-code:1.0
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
ports:
- containerPort: 7272
protocol: TCP
command: [php, /app/Applications/Chat/start_gateway.php, start]
---
apiVersion: v1
kind: Service
metadata:
name: gateway
namespace: workerman
spec:
type: LoadBalancer
selector:
app: workerman-chat-gateway
ports:
- protocol: TCP
port: 7272
targetPort: 7272
businessworker 在內(nèi)部工作,只需要部署 pod 即可。
apiVersion: apps/v1
kind: Deployment
metadata:
name: workerman-chat-businessworker
namespace: workerman
labels:
app: workerman-chat-businessworker
spec:
replicas: 1
selector:
matchLabels:
app: workerman-chat-businessworker
template:
metadata:
labels:
app: workerman-chat-businessworker
spec:
containers:
- name: businessworker
image: cloudbeer/workerman-code:1.0
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
command: [php, /app/Applications/Chat/start_businessworker.php, start]
workerman-chat 提供了一個 聊天室的 web 測試端。
下面我們在本地啟動這個聊天室:
先修改 websocket 的目標(biāo)地址,為 gateway 的 Loadbalancer 的地址(假設(shè)為 1.2.3.4),修改 Applications/Chat/Web/index.php 文件如下:
// ws = new WebSocket("ws://"+document.domain+":7272");
ws = new WebSocket("ws://1.2.3.4:7272");
本地啟動:
php ./Applications/Chat/start_web.php start
打開瀏覽器:http://localhost:55151
多開幾個聊天室,完美運(yùn)行。
按照 workerman-chat 的文檔,gateway 和 businessworker 可以擴(kuò)展。register 為單實例,不能擴(kuò)。
現(xiàn)在可以試著擴(kuò)沖 businessworker 的數(shù)量:
kubectl scale --replicas=3 -f businessworker.yaml
或者直接修改 yaml 的 replicas 的數(shù)量。
擴(kuò)展成功后,多開幾個聊天室,就會發(fā)現(xiàn) businessworker 的 pod 的日志開始接收聊天信息了。
測試的時候需要注意:只有新用戶加入的時候,新擴(kuò)展的 businessworker 才提供服務(wù)。
同理可擴(kuò)充 gateway,gateway 的服務(wù)由 LoadBalancer 負(fù)載,經(jīng)測試,聊天正常。
正式運(yùn)行環(huán)境也可以使用 HPA 自動伸縮。