#这里的hello world的意思实现一个Web留言板功能,并且是一个基于PHP+Redis两层分布式架构的web应用,前端PHP Web网站通过访问后端Redis完成留言查询和添加,redis具备
#这里的hello world的意思实现一个Web留言板功能,并且是一个基于PHP+Redis两层分布式架构的web应用,前端PHP Web网站通过访问后端Redis完成留言查询和添加,redis具备读写分离功能,本实例就实现此需求#留言板系统部署#redis采用一个master两个salve,master实现写,slave实现读,php web启动三个实例组成集群,实现负载均衡#主要是为了体验kubernetes安装中的一些解释不做详细解释环境说明:centos 7[root@localhost ~]# uname -r3.10.0-514.el7.x86_64[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)1.关闭防火墙和selinux[root@localhost ~]# systemctl disable firewalld.service[root@localhost ~]# systemctl stop firewalld.service[root@localhost ~]# setenforce 0[root@localhost ~]# getenforce Disabled或者Permissive2.安装etcd和kubernetes[root@localhost ~]# yum install etcd kubernetes3.修改配置文件[root@localhost ~]# vim /etc/sysconfig/dockerOPTIONS='--selinux-enabled=false --insecure-registry gcr.io'[root@localhost ~]# vim /etc/kubernetes/apiserverKUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"把ServiceAccount去掉4.启动按顺序启动[root@localhost ~]# systemctl start etcd[root@localhost ~]# systemctl start docker[root@localhost ~]# systemctl start kube-apiserver[root@localhost ~]# systemctl start kube-controller-manager[root@localhost ~]# systemctl start kube-scheduler[root@localhost ~]# systemctl start kubelet[root@localhost ~]# systemctl start kube-proxy至此一个单机版kubernetes集群环境已经安装并启动了下面下载docker镜像了https://hub.docker.com/u/kubeguide/ 所需docker镜像可以下载5.1创建redis-master Pod和服务先定义一个Service,然后定义个RC来创建和控制关联Pod,或者先定义RC来创建Pod然后在于Service管理这里选则RC---->Pod--->Service首先创建一个名为redis-master的RC定义文件redis-master-controller.yaml[root@localhost ~]# vim redis-master-controller.yamlapiVersion: v1kind: ReplicationControllermetadata: name: redis-master labels: name: redis-masterspec: replicas: 1 selector: name: redis-master template: metadata: labels: name: redis-master spec: containers: - name: master image: kubeguide/redis-master ports: - containerPort: 6379启动kind: ReplicationController表示这是一个RC,sepc.selector是RC的Pod选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里是1,表示只能运行一个名为redis-master的Pod实例,当集群中运行的Pod数量小雨replicas时,RC会根据spec.template段定义的Pod模版来生成一个新的Pod实例,labels属性指定了该Pod的标签,注意这里的labels必须匹配RC的spec.selector[root@localhost ~]# kubectl create -f redis-master-controller.yaml replicationcontroller "redis-master" created[root@localhost ~]# kubectl get rcNAME DESIRED CURRENT READY AGEredis-master 1 1 0 15s[root@localhost ~]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-1t0n6 0/1 ContainerCreating 0 8m[root@localhost ~]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-1t0n6 0/1 ContainerCreating 0 9m[root@localhost ~]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-1t0n6 1/1 Running 0 14m可以看到会有一个创建过程知道RUNNING之后表示正常5.2创建redis-master-service提供Redis服务的Pod已经创建并正常运行了,接下来创建一个与之关联的Service,redis-master的定义文件[root@localhost ~]# vim redis-master-service.yaml apiVersion: v1kind: Servicemetadata: name: redis-master labels: name: redis-masterspec: ports: - port: 6379 targetPort: 6379 selector: name: redis-master其中metadata.name是Service的服务名,spec.selector确定了那些Pod对应的本服务,这里定义表明拥有redis-master标签的Pod属于redis-master服务,另外ports部分的targetPort属性来确定提供该服务的容器暴露EXPOSE的端口号,具体的服务进程在容器内的targetPort上提供服务,而port属性定义了Service的虚端口[root@localhost ~]# kubectl create -f redis-master-service.yaml service "redis-master" created[root@localhost ~]# kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 37mredis-master 10.254.249.4 <none> 6379/TCP 1m注意到redis-master服务分配一个值为10.254.249.4的ip地址虚拟ip随后kubernetes集群中其他新建的Pod就可以通过这个虚拟ip的6379访问了,还要创建redis-slave和frontend两组Pod都将通过10.254.249.4:6379来访问redis-master服务但是用于IP地址是在服务创建后由kubernetes系统自动分配的,在其他Pod中无法预先知道某个Service的虚拟IP地址,因此需要一个机制来找到这个服务,为此kubernetes使用linux环境变了,在为每个Pod容器里都增加了一组Service相关的环境变量,用来记录从服务名到虚拟Ip地址的映射关系,以redis-master服务为例,在容器的环境变量中会增加下面两条记录REDIS_MASTER_SERVICE_HOST=10.254.249.4REDIS_MASTER_SERVICE_PORT=6379于是redis-slave和frontend等Pod中应用程序就可以通过环境变量得到相关信息5.3创建redis-slave Pod依然先创建RC[root@localhost ~]# vim redis-slave-controller.yamlapiVersion: v1kind: ReplicationControllermetadata: name: redis-slave labels: name: redis-slavespec: replicas: 2 selector: name: redis-slave template: metadata: labels: name: redis-slave spec: containers: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379[root@localhost ~]# kubectl create -f redis-slave-controller.yaml replicationcontroller "redis-slave" created[root@localhost ~]# kubectl get rcNAME DESIRED CURRENT READY AGEredis-master 1 1 1 35mredis-slave 2 2 0 8s[root@localhost ~]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-1t0n6 1/1 Running 0 35mredis-slave-0nh1g 0/1 ContainerCreating 0 15sredis-slave-cz342 0/1 ContainerCreating 0 15s为了实现Redis集群的主从同步,redis-slave需要知道redis-master的地址,所以在redis-slave镜像启动命令/run.sh中我们可以输入以下内容redis-server --salveof ${REDIS_MASTER_SERVICE_HOST} 6379由于在创建redis-salve Pod时系统自动在容器内部生成了与redis-master Service相关的环境变量,所以redis-slave应用能够直接使用环境变量来进行获取redis-master的ip地址5.4创建redis-slave Service[root@localhost ~]# cat redis-slave-service.yaml apiVersion: v1kind: Servicemetadata: name: redis-slave labels: name: redis-slavespec: ports: - port: 6379 targetPort: 6379 selector: name: redis-slave[root@localhost ~]# kubectl create -f redis-slave-service.yaml service "redis-slave" created[root@localhost ~]# kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 53mredis-master 10.254.249.4 <none> 6379/TCP 17mredis-slave 10.254.168.208 <none> 6379/TCP 8s5.5创建frontend Pod[root@localhost ~]# cat frontend-controller.yaml apiVersion: v1kind: ReplicationControllermetadata: name: frontend labels: name: frontendspec: replicas: 3 selector: name: frontend template: metadata: labels: name: frontend spec: containers: - name: master image: kubeguide/guestbook-php-frontend env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 80[root@localhost ~]# kubectl create -f frontend-controller.yaml replicationcontroller "frontend" created[root@localhost ~]# kubectl get rcNAME DESIRED CURRENT READY AGEfrontend 3 3 0 5sredis-master 1 1 1 48mredis-slave 2 2 2 13m[root@localhost ~]# kubectl get podsNAME READY STATUS RESTARTS AGEfrontend-kkb8q 0/1 ContainerCreating 0 12sfrontend-p5hwm 0/1 ContainerCreating 0 12sfrontend-r70dz 0/1 ContainerCreating 0 12sredis-master-1t0n6 1/1 Running 0 48mredis-slave-0nh1g 1/1 Running 0 13mredis-slave-cz342 1/1 Running 0 13m5.6创建frontend Service[root@localhost ~]# cat frontend-service.yaml apiVersion: v1kind: Servicemetadata: name: frontend labels: name: frontendspec: type: NodePort ports: - port: 80 nodePort: 30001 selector: name: frontend这里的关键点设置type: NodePort并指定一个NodePort的值,表示使用Node上的物理机端口提供对外访问能力,需要注意的是spec.ports.NodePort的端口号定义范围是有限制的,默认30000-32767,如果使用范围外的端口号Service将会失败[root@localhost ~]# kubectl create -f frontend-service.yaml service "frontend" created[root@localhost ~]# kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEfrontend 10.254.91.211 <nodes> 80:30001/TCP 7skubernetes 10.254.0.1 <none> 443/TCP 1hredis-master 10.254.249.4 <none> 6379/TCP 31mredis-slave 10.254.168.208 <none> 6379/TCP 14m5.7验证打开浏览器输入http://本机的物理IP:30001能看到欢迎页面至此完成kubernetes的hello world例子