节选自 《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"

 

Logo

开源、云原生的融合云平台

更多推荐