2、启动master service
一个kubernetes service会对一个或多个Container进行负载均衡,这是通过我们上面redis-master中定义的labels元数据实现的,值得注意的是,在redis中只有一个master,但是我们依然为它创建一个service,这是因为这样我们就能使用一个elastic IP来路由到具体某一个master。
kubernetes集群中的service是通过container中的环境变量实现服务发现的,service基于pod label实现container的负载均衡。
在第一步中创建的pod包含了一个label“name=redis-master”,service的selector字段决定了service将流量转发给哪个pod,port和targetPort信息定义了service proxy运行在什么端口。
[root@master guestbook]# kubectl create -f redis-master-service.yaml
service "redis-master" created
[root@master guestbook]#
root@master guestbook]# kubectl get svc
NAME
CLUSTER-IP
EXTERNAL-IP PORT(S) AGE
kubernetes
10.254.0.1
443/TCP 33m
redis-master 10.254.203.144
6379/TCP 58s
[root@master guestbook]#
上面的运行成功后,所有pods都能发现redis master运行在6379端口,从salve到master流量走向会有以下两步:
1) 一个redis slave会连接到redis master service的port上
2) 流量会从service节点上的port到targetPort,如果targetPort未指定,默认和port一致
3、启动replicated slave pod
虽然redis master是一个单独的pod,redis slaves是一个replicated pod,在Kubernetes中,一个Replication Controller负责管理一个replicated pod的多个实例,RC会自动拉起down掉的replica(可以通过杀死docker 进程方式简单测试)
[root@master guestbook]# kubectl create -f redis-slave-deployment.yaml
deployment "redis-slave" created
[root@master guestbook]#
[root@master guestbook]# kubectl get deploy
NAME
DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
redis-master 1
1
1
1
17m
redis-slave 2
2
2
2
24s
[root@master guestbook]#
[root@master guestbook]# kubectl get pods -o wide
NAME
READY
STATUS RESTARTS AGE
IP
NODE
redis-master-517881005-c3qek 1/1
Running 0
18m
10.255.73.2 node2
redis-slave-1885102530-brg9b 1/1
Running 0
1m
10.255.73.3 node2
redis-slave-1885102530-o8y5p 1/1
Running 0
1m
10.255.70.2 node1
[root@master guestbook]#
可以看到一个master pod和两个slave pod
4、启动slave service
和master一样,我们希望有一个代理服务连接到redis slave,除了服务发现之外,slave service还为web app client提供了透明代理。
这次service 的selector是name=redis-slave,我们可以方便的使用kubectl get services -l “label=value”命令来定位这些服务
[root@master guestbook]# kubectl create -f redis-slave-service.yaml
service “redis-slave” created
[root@master guestbook]#
[root@master guestbook]# kubectl get svc -o wide
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes 10.254.0.1 443/TCP 44m
redis-master 10.254.203.144 6379/TCP 12m app=redis,role=master,tier=backend
redis-slave 10.254.0.214 6379/TCP 38s app=redis,role=slave,tier=backend
[root@master guestbook]#
5、创建frontend pod
这是一个简单的PHP 服务,用来和master service(写请求)或slave service(读请求)交互
[root@master guestbook]# kubectl create -f frontend-deployment.yaml
deployment "frontend" created
[root@master guestbook]#
[root@master guestbook]# kubectl get deploy
NAME
DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
frontend
3
3
3
2
13s
redis-master 1
1
1
1
22m
redis-slave 2
2
2
2
5m
[root@master guestbook]#
[root@master guestbook]# kubectl get pods -o wide
NAME
READY
STATUS RESTARTS AGE
IP
NODE
frontend-941252965-8rvrb
1/1
Running 0
1m
10.255.73.4 node2
frontend-941252965-ka3vd
1/1
Running 0
1m
10.255.70.3 node1
frontend-941252965-qqamp
1/1
Running 0
1m
10.255.70.4 node1
redis-master-517881005-c3qek 1/1
Running 0
24m
10.255.73.2 node2
redis-slave-1885102530-brg9b 1/1
Running 0
7m
10.255.73.3 node2
redis-slave-1885102530-o8y5p 1/1
Running 0
7m
10.255.70.2 node1
[root@master guestbook]#
可以看到一个redis master,两个redis slave和三个frontend pods
6、创建guestbook service
和其他service一样,你可以创建一个service管理frontend pods
[root@master guestbook]# kubectl create -f frontend-service.yaml
service "frontend" created
[root@master guestbook]#
[root@master guestbook]# kubectl get svc -o wide
NAME
CLUSTER-IP
EXTERNAL-IP PORT(S) AGE
SELECTOR
frontend
10.254.18.215
80/TCP
44s
app=guestbook,tier=frontend
kubernetes
10.254.0.1
443/TCP 50m
redis-master 10.254.203.144
6379/TCP 18m
app=redis,role=master,tier=backend
redis-slave 10.254.0.214
6379/TCP 6m
app=redis,role=slave,tier=backend
[root@master guestbook]#
我们可以通过frontend service(10.254.18.215)访问pods
7、外部网络访问guestbook
:30001 可以直接访问了
[root@node2 ~]# curl :30001
Guestbook
Guestbook
Submit
{{msg}}
[root@node2 ~]#
附: 本案例用到的6个.yaml文件