kubenetes中指定web服务器使用的数据库(集群配置管理方案--ConfigMap)

在《kubernetes权威指南中》,frontend及redis跑起来后,在web页面上无法添加messages,通过进入容器中查看使用的redis server及slave的IP地址,与实际redis pod中的地址不符(后来发现这个地址是redis service 的虚拟ip,在创建完redis服务再创建frontend的顺序下,不指定环境变量又重新创建frontend后,可以通过这个service ip进行添加操作了。不过仍然通过本文的例子学习如果配置和使用ConfigMap),这个文章描述了如果指定启动的frontend中的redis server地址。


ConfigMap的典型用法:

(1)生成为容器内的环境变量。

(2)设置容器启动命令的启动参数(需设置为环境变量)。

(3)以Volume的形式挂载为容器内部的文件或目录。

ConfigMap以一个或多个key:value的形式保存在Kubernetes系统中供应用使用。

创建ConfigMap的方式有:yaml文件方式、kubectl命令行方式。

使用ConfigMap的方式有:环境变量方式、volumeMount模式。


使用ConfigMap解决上面的问题:

查看frontend中指定redis server的方式为从环境变量中获取地址:

root@frontend-4lkjk:/var/www/html# cat guestbook.php

  if (getenv('GET_HOSTS_FROM') == 'env') {
    $host = getenv('REDIS_MASTER_SERVICE_HOST');
  }
  header('Content-Type: application/json');
  if ($_GET['cmd'] == 'set') {
    $client = new Predis\Client([
      'scheme' => 'tcp',
      'host'   => $host,
      'port'   => 6379,
    ]);

    $client->set($_GET['key'], $_GET['value']);
    print('{"message": "Updated"}');
  } else {
    $host = 'redis-slave';
    if (getenv('GET_HOSTS_FROM') == 'env') {
      $host = getenv('REDIS_SLAVE_SERVICE_HOST');
    }
    $client = new Predis\Client([
      'scheme' => 'tcp',
      'host'   => $host,
      'port'   => 6379,
    ]);

一、查看redis server 的ip地址: 
root@kubernetes1:~/test# kubectl describe pod redis-slave-lgrdp –namespace=common 
Name: redis-slave-lgrdp 
Namespace: common 
Node: kubernetes2/192.168.3.101 
Start Time: Wed, 19 Apr 2017 18:29:53 +0800 
Labels: name=redis-slave 
Status: Running 
IP: 10.244.1.88

root@kubernetes1:~/test# kubectl describe pod redis-master-tddz8 –namespace=common 
Name: redis-master-tddz8 
Namespace: common 
Node: kubernetes3/192.168.3.102 
Start Time: Wed, 19 Apr 2017 18:25:11 +0800 
Labels: name=redis-master 
Status: Running 
IP: 10.244.3.6

二、创建一个ConfigMap文件,指定环境变量: 
root@kubernetes1:~/test# cat frontend-cm.yaml 
apiVersion: v1 
kind: ConfigMap 
metadata: 
name: frontend-cm 
namespace: common 
data: 
redis_master_service_host: 10.244.3.6 
redis_slave_service_host: 10.244.1.88

三、创建ConfigMap: 
kubectl create -f frontend-cm.yaml

root@kubernetes1:~/test# kubectl get configmap --namespace=common
NAME          DATA      AGE
frontend-cm   2         1m
root@kubernetes1:~/test# kubectl describe configmap frontend-cm  --namespace=common
Name: frontend-cm
Namespace: common
Labels:
Annotations:


Data
====
redis_master_service_host: 10 bytes

redis_slave_service_host:11 bytes


四、修改frontend controller文件,指定要使用的环境变量,在containers部分:

      containers:
      - name: frontend
        image: harbor.itopka.com/test/guestbook-php-frontend
        env:
        - name: GET_HOSTS_FROM
          value: env
        - name: REDIS_MASTER_SERVICE_HOST
          valueFrom:
            configMapKeyRef:
              name: frontend-cm
              key: redis_master_service_host
        - name: REDIS_SLAVE_SERVICE_HOST
          valueFrom:
            configMapKeyRef:
              name: frontend-cm
              key: redis_slave_service_host


五、根据frontend controller文件创建pod:

kubectl create -f frontend-controller.yaml


六、检查环境变量是否生效:

root@kubernetes1:~/test# kubectl get pods --namespace=common
NAME                 READY     STATUS    RESTARTS   AGE
frontend-4lkjk       1/1       Running   0          14s
redis-master-tddz8   1/1       Running   0          4d
redis-slave-f23l5    1/1       Running   0          4d
redis-slave-lgrdp    1/1       Running   0          4d
root@kubernetes1:~/test# kubectl exec frontend-4lkjk  --namespace=common -it -- bash
root@frontend-4lkjk:/var/www/html# echo $REDIS_MASTER_SERVICE_HOST
10.244.3.6
root@frontend-4lkjk:/var/www/html# echo $REDIS_SLAVE_SERVICE_HOST
10.244.1.88


七、通过web访问,message数据可以正常提交和显示。

你可能感兴趣的:(kubernetes)