需要用到的镜像
- redis-master: 用于前端 Web 应用进行“写”留言操作的 Redis 服务,其中已经保存了一条内容为“Hello World!”的留言。
- guestbook-redis-slave: 用于前端 Web 应用进行读留言操作的 Redis 服务,并与 Redis-Master的数据保持同步
- guestbook-php-frontend:php Web 服务,在网页上展示留言的内容,也提供一个文本输入框供访客添加留言
创建 redis-master RC 和 Service
先定义 Service,然后顶一个 RC 来控制相关联的 Pod,或者先定义 RC 来创建 Pod,然后定义与之关联的 Service,这里采用后一种方法。
首先为 redis-master 创建一个名为 redis-master 的 RC 定义文件 redis-master-controller.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
- kind 字段的值为“ReplicationController”,表示这是一个 RC
- spec.selector 是 RC 的 Pod 选择器,即监控和管理拥有这些标签的 Pod 实例,确保集群上始终有且仅有 replicas 个Pod 实例在运行
创建好 redis-master-controller.yaml 文件后,在 Master 节点执行命令:
kubectl create -f redis-master-controller.yaml
将它发布到 Kubernetes 集群中,就完成了 redis-master 的创建过程。
# 查看刚刚创建 redis-master
kubect get rc
# Kubernetes 会人居 redis-master 这个 rc 的定义自动创建 Pod
kubectl get pods
Pods 创建好了之后,接下来就创建与之相关的 Service:redis-master-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
ports:
- port: 6379
targetPort: 6379
selector:
name: redis-master
- metadata.name 是 Service的服务名
- spec.selector 确定了选择哪些 Pod, 这里用name=redis-master 标签的 Pod
- port 属性定义的是 Service 的虚拟端口号
- targetPort 属性指定的是 Pod 内容器应用监听的端口号
运行 kubectl create 创建该 Service
# 创建
kubectl create -f redis-master-service.yaml
# 查看创建的 Service
kubectl get services
redis-master 服务分配了一个值为 虚拟IP地址,随后 Kubernetes 集群中的其他新创建的 Pod 就可以通过这个虚拟 IP + 端口 6379 来访问这个服务了
但是由于 IP 地址是在服务创建后 由 Kubernetes 系统自动分配的,在其他 Pod 中无法预先知道某个 Service的 虚拟 IP地址,因此需要一个机制来找到这个服务。
Kubernetes 巧妙地使用了Linux 的环境变量,在每个 Pod 的容器都增加了一组 Service 相关的环境变量,用来记录从服务名到虚拟IP地址的映射关系。
以 redis-master 为例,在容器的环境变量中会增加下面两条记录:
REDIS_MASTER_SERVICE_HOST=169.169.144.74
REDIS_MASTER_SERVICE_PORT=6379
创建 redis-slave RC 和 Service
redis-slave-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
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
在容器的配置部分设置了一个 环境变量 GET_HOST_FROM=env,意思是从环境变量中获取 redis-master 服务的 IP 信息
如果在容器配置部分不设置该env,则将使用 redis-master 服务的名称 “redis-master”来访问它,这将使用 DNS 的方式 发现服务,需要预先启动 Kubernetes 集群中的 skydns 服务。
kubectl create -f redis-slave-controller.yaml
kubectl get rc
redis-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
ports:
- port: 6379
selector:
name: redis-slave
运行 Kubernetes 创建 Service
kubectl create -f redis-slave-service.yaml
kubectl get services
创建 frontend RC 和 Service
定义 frontend 的 RC 配置文件: frontend-controller.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: frontend
image: kubeguide/guestbook-php-frontend
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 80
kubectl create -f frontend-controller.yaml
frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: frontend
spec:
type: NodePort
ports:
- port: 80
nodePort: 30001
selector:
name: frontend
设置 type=NodePort 并指定一个 NodePort 的值,表示使用 Node 上的物理机端口提供对外的的访问服务,需要注意的是 spec.ports.NodePort 的端口号范围可以进行限制,--service-node-port-range 指定,默认是 30000-32767,如果是其他范围的端口号,则 Service 创建失败。
kubectl create -f frontend-service.yaml
kubectl get services