在手動安裝 Kubernetes 的基礎上搭建微服務

須要用到的鏡像

  • 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,這裏採用後一種方法。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
  • kind 字段的值爲「ReplicationController」,表示這是一個 RC
  • spec.selector 是 RC 的 Pod 選擇器,即監控和管理擁有這些標籤的 Pod 實例,確保集羣上始終有且僅有 replicas 個Pod 實例在運行

建立好 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
  • metadata.name 是 Service的服務名
  • spec.selector 肯定了選擇哪些 Pod, 這裏用name=redis-master 標籤的 Pod
  • port 屬性定義的是 Service 的虛擬端口號
  • targetPort 屬性指定的是 Pod 內容器應用監聽的端口號

運行 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 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
相關文章
相關標籤/搜索