先定义 Service,而后顶一个 RC 来控制相关联的 Pod,或者先定义 RC 来建立 Pod,而后定义与之关联的 Service,这里采用后一种方法。php
首先为 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
建立好 redis-master-controller.yaml 文件后,在 Master 节点执行命令:node
kubectl create -f redis-master-controller.yaml
将它发布到 Kubernetes 集群中,就完成了 redis-master 的建立过程。redis
# 查看刚刚建立 redis-master kubect get rc # Kubernetes 会人居 redis-master 这个 rc 的定义自动建立 Pod kubectl get pods
Pods 建立好了以后,接下来就建立与之相关的 Service:redis-master-service.yamlapi
apiVersion: v1 kind: Service metadata: name: redis-master labels: name: redis-master spec: ports: - port: 6379 targetPort: 6379 selector: name: redis-master
运行 kubectl create 建立该 Servicebash
# 建立 kubectl create -f redis-master-service.yaml # 查看建立的 Service kubectl get services
redis-master 服务分配了一个值为 虚拟IP地址,随后 Kubernetes 集群中的其余新建立的 Pod 就能够经过这个虚拟 IP + 端口 6379 来访问这个服务了frontend
可是因为 IP 地址是在服务建立后 由 Kubernetes 系统自动分配的,在其余 Pod 中没法预先知道某个 Service的 虚拟 IP地址,所以须要一个机制来找到这个服务。ide
Kubernetes 巧妙地使用了Linux 的环境变量,在每一个 Pod 的容器都增长了一组 Service 相关的环境变量,用来记录从服务名到虚拟IP地址的映射关系。ui
以 redis-master 为例,在容器的环境变量中会增长下面两条记录:code
REDIS_MASTER_SERVICE_HOST=169.169.144.74 REDIS_MASTER_SERVICE_PORT=6379
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 配置文件: 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