先定義 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