系統版本:CentOS Linux release 7.5.1804 (Core)php
kubernetes版本:kubernetes1.3前端
Guestbook留言板系統將經過 Pod、RC、Service 等資源對象搭建完成,成功啓動後網頁中顯示一條"Hello World"留言。其系統架構是一個基於PHP+Redis的分佈式Web應用,前端PHP Web網站經過訪問後端的 Redis 來完成用戶留言的查詢和添加功能。同時Redis以Master+Slave 的模式進行部署,實現數據的讀寫分離能力。node
Web層是一個基於 PHP 頁面的 Apache 服務,啓動 3 個實例組成集羣,實現訪問網站的負載均衡。Redis Master啓動 1 個實例用於寫操做(添加留言),Redis Slave 啓動兩個實例用於讀操做(讀取留言)。Redis Master與 Slave 的數據同步由 Redis 具有的數據同步機制完成。web
能夠先定義 Service,而後定義一個 RC來建立和控制相關聯的 Pod,或者先定義 RC 來建立 Pod,而後定義與之關聯的 Service。redis
首先爲 redis-master 建立一個名爲 redis-master 的 RC 定義文件 redis-master-controller.yaml。後端
# cat redis-master-controller.yaml apiVersion: v1 kind: ReplicationController #表示這是一個RC metadata: name: redis-master labels: name: redis-master spec: replicas: 1 selector: name: redis-master template: metadata: labels: name: redis-master spec: containers: - name: master image: kubeguide/redis-master ports: - containerPort: 6379
建立完成以後,在master節點上發佈到集羣中api
# kubectl create -f redis-master-controller.yaml replicationcontroller/redis-master created
用kubectl get 命令確認RC和Pod 建立成功網絡
# kubectl get rc NAME DESIRED CURRENT READY AGE redis-master 1 1 0 70s # kubectl get pods -o wide| grep redis redis-master-j58mw 1/1 Running 0 3m59s 172.17.39.7 192.168.200.130 <none> <none>
redis-master Pod 已建立且正常運行後,在建立與之關聯的Service架構
# cat redis-master-service.yaml apiVersion: v1 kind: Service metadata: name: redis-master labels: name: redis-master spec: ports: - port: 6379 targetPort: 6379 selector: name: redis-master
運行kubectl create 命令建立該service負載均衡
# kubectl create -f redis-master-service.yaml service/redis-master created # kubectl get services | grep redis-master redis-master ClusterIP 10.0.0.116 <none> 6379/TCP 40s
本示例啓動啓動 redis-slave 服務的兩個副本,每一個副本上的 Redis 進程都與 redis-master進行數據同步,與 redis-master 共同組成了一個具有讀寫分離能力的 Redis集羣。留言板的PHP網頁經過訪問 redis-slave 服務來讀取留言數據。
# cat redis-slave-controller.yaml apiVersion: v1 kind: ReplicationController metadata: name: redis-slave labels: name: redis-slave spec: replicas: 2 selector: name: redis-slave template: metadata: labels: name: redis-slave spec: containers: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379
在容器的配置部分設置了一個環境變量 GET_HOSTS_FROM=env ,意思是從環境變量中獲取 redis-master服務的 IP 地址信息。
redis-slave 鏡像中的啓動腳本 /run.sh 的內容爲:
# kubectl create -f redis-slave-controller.yaml replicationcontroller/redis-slave created # kubectl get rc | grep redis redis-master 1 1 1 45m redis-slave 2 2 2 103s # kubectl get pod | grep redis redis-master-j58mw 1/1 Running 0 45m redis-slave-c42bx 1/1 Running 0 2m3s redis-slave-s74b8 1/1 Running 0 2m3s
建立與redis-slave 相關的Service 服務,相似於 redis-master服務。
# cat redis-slave-service.yaml apiVersion: v1 kind: Service metadata: name: redis-slave labels: name: redis-slave spec: ports: - port: 6379 targetPort: 6379 selector: name: redis-slave
運行kubectl 建立 Service
# kubectl create -f redis-slave-service.yaml service/redis-slave created # kubectl get svc | grep redis redis-master ClusterIP 10.0.0.116 <none> 6379/TCP 39m redis-slave ClusterIP 10.0.0.173 <none> 6379/TCP 49s
3.1 建立部署 frontend rc
# cat frontend-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
labels:
name: frontend
spec:
replicas: 3
selector:
name: frontend
template:
metadata:
labels:
name: frontend
spec:
containers:
- name: frontend
image: kubeguide/guestbook-php-frontend
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 80
在容器的配置部分設置了一個環境變量 GET_HOSTS_FROM=env ,意思是從環境變量中獲取 redis-master 和 redis-slave 服務的 IP 地址信息。
# kubectl create -f frontend-controller.yaml replicationcontroller/frontend created
查看建立的
# kubectl get rc NAME DESIRED CURRENT READY AGE frontend 3 3 3 5m1s redis-master 1 1 1 67m redis-slave 2 2 2 24m # kubectl get pods NAME READY STATUS RESTARTS AGE frontend-mnd85 1/1 Running 0 5m43s frontend-pmpdb 1/1 Running 0 5m43s frontend-zd2n5 1/1 Running 0 5m43s
3.2 建立部署 frontend service
最後建立 frontend Service,主要目的是使用 Service 的 NodePort 給 Kuberbetes 集羣中的 Service 映射一個外網能夠訪問的端口,這樣,外部網絡就能夠經過 NodeIP+NodePort 的方式訪問集羣中的服務了。
# cat frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: frontend
spec:
type: NodePort
ports:
- port: 80
nodePort: 30003
selector:
name: frontend
運行kubectl create 命令發佈到集羣中
# kubectl create -f frontend-service.yaml service/frontend created # kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend NodePort 10.0.0.145 <none> 80:30003/TCP 24s
web頁面瀏覽
http://192.168.200.129:30003/,http://192.168.200.130:30003/ 備註:爲 Node節點的IP
再次登陸會查看到留言,說明數據讀取寫入沒有問題。