在《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
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数据可以正常提交和显示。