***如果你的kubernetes的集群已經完成了搭建,當你不知道怎么使用這套架構,下面我們一起來用k8s集群搭建一個簡單的微服務應用:***
* [ ] 這個微服務應用是一個簡單的php程序留言板:
* [ ] web應用是基于appche運行php程序
* [ ] 后面是一個redis主從結構,我們用redis一主兩從的模式
* * * * *
本例中將用到3個Docker鏡像,鏡像下載地址為:https://hup.docker.com/u/kubeguide
1. redis-master:用于前端web進行寫留言操作的redis服務,其中已經保存了一條內容為hello world的留言。
2. redis-slave: 用于前端web進行讀留言的操作熱redis,并與redis-master同步
3. frontend:phpweb服務,在網頁上展示內容,也提供一個文本框提供訪客添加留言
* * * * *

* * * * *
下面我們來一起操作:
我們先為redis-master創建一個RC定義文件:(RC主要是來定義副本的)
~~~
[root@localhost gustboo]# cat redis-master-controller.yaml
apiVersion: v1
kind: ReplicationController
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
~~~
* kind為ReplicationController 表示為副本控制器
* metadata.name: 第一rc名字
* metadata.labels:rc的標簽
* spec.replicas=1這里我們只運行一個master實例
* 當運行的實例的副本少于設置的當前的副本數量時,他會根據定義的template來重新生成副本。
* containerPort:設置redis在容器中運行的port
* * * * *
當定義好了rc文件后,我們在k8s集群中來城建這個rc
~~~
kubectl create -f redis-master-controller.yaml
[root@localhost gustboo]# kubectl get rc
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 2h
[root@localhost gustboo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
redis-master-r04fz 1/1 Running 0 2h
~~~
當READY=1和status=Running 說名我們當rc創建好了
* * * * *
下面我們來創建master的svc:(svc就是service,用來定義服務的)
~~~
[root@localhost gustboo]# 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
~~~
注意:port:6379 和targetport:6379 把容器里面的redis端口映射映射到虛擬ip的6379
來創建redis-master的svc
~~~
[root@localhost gustboo]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-master 10.254.211.158 <none> 6379/TCP 2h
~~~
這樣redis-master就搭建好了
下一步我們來搭建redis-slave
我們一樣也是準備好redis-slave的rc和svc的文件
~~~
[root@localhost gustboo]# 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
~~~
* * * * *
~~~
[root@localhost gustboo]# cat redis-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
ports:
- port: 6379
selector:
name: redis-slave
~~~
這redis-slave和redis-master的rc文件有所不同:
我們可以看到redis-slave的rc文件中多出了env這個配置,這個是環境變量的配置,我們都知道,redis主從模式,需要redis-slave去同步主的redis,這個時候,我們不能提前知道k8分配給redismaster的ip是多少,k8s里面有有兩個方式去獲取redis-master的ip
第一中是通過環境變量,第二中是通過dns,我們這里用第一種,當redis-master生成好了后,系統會自動生成環境變量:
~~~
#env
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT=tcp://10.254.211.158:6379
~~~
我們可以看到master的環境變量已經生成好了,我們通過制作redis-slave的鏡像來實現主從,下面的腳本在redis-slave鏡像中,啟動時就運行
~~~
root@redis-slave-w3zr1:/# cat run.sh
#!/bin/bash
# Copyright 2014 The Kubernetes Authors All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
if [[ ${GET_HOSTS_FROM:-dns} == "env" ]]; then
redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379
else
redis-server --slaveof redis-master 6379
fi
~~~
這個腳本主要就是判斷容器設置中有無env環境變量,有就直接用env,沒有就用dns服務器發現。(前提是要搭好dns,這里我們不做討論)
我們來創建我們的redis-slave
~~~
kubectl create -f redis-slave-controller.yaml
kubectl create -f redis-slave-service.yaml
[root@localhost gustboo]# kubectl get svc pod rc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-slave 10.254.160.65 <none> 6379/TCP 2h
redis-slave-w3zr1 1/1 Running 0 2h
redis-slave-xq3pf 1/1 Running 0 2h
redis-slave 2 2 2 2h
~~~
這樣我們的redis-slave就搭建好了,redis的主從模式就搭建好了
最好我們來創建我們的前臺web
準備好我們svc和rc文件
~~~
[root@localhost gustboo]# 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_HOST_FROM
value: env
ports:
- containerPort: 80
~~~
~~~
[root@localhost gustboo]# cat frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: frontend
spec:
type: NodePort
ports:
- port: 80
nodePort: 30001
selector:
name: frontend
~~~
最后我們來看我們集群有些pod
~~~
[root@localhost gustboo]# kubectl get pod,svc,rc,endpoints
NAME READY STATUS RESTARTS AGE
po/frontend-7mfsh 1/1 Running 0 2h
po/frontend-m8fkw 1/1 Running 0 2h
po/frontend-x4tzj 1/1 Running 0 2h
po/my-nginx-543887649-4gh28 1/1 Running 14 19d
po/my-nginx-543887649-lxxcw 1/1 Running 14 19d
po/my-nginx-pod-2945913857-88lml 1/1 Running 14 19d
po/my-nginx-pod-2945913857-nwrlv 1/1 Running 14 19d
po/redis-master-r04fz 1/1 Running 0 3h
po/redis-slave-w3zr1 1/1 Running 0 2h
po/redis-slave-xq3pf 1/1 Running 0 2h
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/frontend 10.254.198.99 <nodes> 80:30001/TCP 1h
svc/kubernetes 10.254.0.1 <none> 443/TCP 31d
svc/my-nginx 10.254.78.8 <none> 80/TCP 19d
svc/redis-master 10.254.211.158 <none> 6379/TCP 3h
svc/redis-slave 10.254.160.65 <none> 6379/TCP 2h
NAME DESIRED CURRENT READY AGE
rc/frontend 3 3 3 2h
rc/redis-master 1 1 1 3h
rc/redis-slave 2 2 2 2h
NAME ENDPOINTS AGE
ep/frontend 172.30.1.21:80,172.30.1.22:80,172.30.1.23:80 1h
ep/kubernetes 172.16.168.129:6443 31d
ep/my-nginx 172.30.1.16:80,172.30.1.9:80 19d
ep/redis-master 172.30.1.18:6379 3h
ep/redis-slave 172.30.1.19:6379,172.30.1.20:6379 2h
~~~
這樣我們的redis主從和phpweb就搭建好了
