kubernetes 部署redis 集群 guestbook
节选自 《kubernetes 权威指南2 》 2.3节 guestbook 示例下载 docker imagesdocker pull kubeguide/redis-masterdocker pull kubeguide/guestbook-redis-slavedocker pull kubeguide/guestbook-php-frontend下载后 doc...
节选自 《kubernetes 权威指南2 》 2.3节 guestbook 示例
下载 docker images
docker pull kubeguide/redis-master
docker pull kubeguide/guestbook-redis-slave
docker pull kubeguide/guestbook-php-frontend
下载后 docker images 看看结果
docker.io/kubeguide/guestbook-php-frontend latest 47ee16830e89 2 years ago 510 MB
docker.io/kubeguide/redis-master latest 405a0b586f7e 3 years ago 419 MB
docker.io/kubeguide/guestbook-redis-slave latest e0c36a1fa372 3 years ago 110 MB
redis-master
redis-master-rc.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
redis-master-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
selector:
name: redis-master
ports:
- port: 6379
targetPort: 6379
启动
kubectl create -f redis-master-rc.yaml -f redis-master-svc.yaml
redis slave
redis-slave-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
replicas: 1
selector:
name: redis-slave
template:
metadata:
labels:
name: redis-slave
spec:
containers:
- name: slave
image: kubeguide/guestbook-redis-slave
imagePullPolicy: Never
ports:
- containerPort: 6379
redis-slave-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
selector:
name: redis-slave
ports:
- port: 6379
启动
kubectl create -f redis-slave-rc.yaml -f redis-slave-svc.yaml
搞完看看,salve 和 master 都被分配了集群ip。
kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 12d
redis-master 10.254.211.68 <none> 6379/TCP 4h
redis-slave 10.254.201.55 <none> 6379/TCP 1h
pod间可以通过这些ip相互访问。但是ip是pod创建后才有的,无法预先知道,而slave又需要知道 master的 ip。 k8s 通过添加环境变量来解决这个难题。具体到本例子,k8s 会在 slave 创建后添加下面2个环境变量
REDIS_MASTER_SERVICE_HOST=10.254.211.68
REDIS_MASTER_SERVICE_PORT=6379
我们进入 docker 容器后求证下
先看看 容器的 id ,如下 我的 slave id 是 eb (不用输入完整的,前面几位能区别开其他的即可)
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb786e351e99 kubeguide/guestbook-redis-slave "/entrypoint.sh /b..." About an hour ago Up About an hour k8s_slave.9c2a077e_redis-slave-9198p_default_fce94396-130a-11e9-9205-000c29687cb4_375b7aa4
702c153f537b kubeguide/redis-master "redis-server /etc..." 4 hours ago Up 4 hours k8s_master.dd7e04d1_redis-master-mw1mn_default_c8cb0c25-12f2-11e9-9205-000c29687cb4_7830960e
然后进去后输出 环境变量看看
docker exec -it eb /bin/bash
root@redis-slave-9198p:/data# echo $REDIS_MASTER_SERVICE_HOST
echo $REDIS_MASTER_SERVICE_HOST
10.254.211.68
root@redis-slave-9198p:/data# echo $REDIS_MASTER_SERVICE_PORT
echo $REDIS_MASTER_SERVICE_PORT
6379
这样 由于制作 slave 容器的时候,启动参数添加了 类似下面的语句,就可以让他和 master 联系上了
redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379
前端
fe-rc.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: php-redis
image: kubeguide/guestbook-php-frontend
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 80
fe-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: frontend
spec:
selector:
name: frontend
type:
NodePort
ports:
- port: 80
nodePort: 30001
启动
kubectl create -f fe-rc.yaml -f fe-svc.yaml
网页访问
http://192.168.255.130:30001/
登陆redis 看看结果
如果没有安装可以参考 redis 安装
先看看 slave 或 master 的ip地址
kubectl get ep
NAME ENDPOINTS AGE
frontend 10.0.34.4:80,10.0.34.6:80,10.0.34.7:80 1h
kubernetes 192.168.255.130:6443 12d
redis-master 10.0.34.3:6379 4h
redis-slave 10.0.34.2:6379 1h
然后 登陆了 看看, 由于我不知道 这个例子 用的是哪个 key 所以先 keys * 看看,发现是 messages
redis-cli -h 10.0.34.2
10.0.34.2:6379> keys *
1) "messages"
10.0.34.2:6379> get messages
"Hello World!,wjs,i am here"
更多推荐
所有评论(0)