基於redis和docker的guestbook留言簿案例

在正式介紹以前,你們有必要先理解Kubernetes幾個核心概念及其承擔的功能。如下爲Kubernetes的架構設計圖:php

1. Pods
在Kubernetes系統中,調度的最小顆粒不是單純的容器,而是抽象成一個Pod,Pod是一個被建立、銷燬、調度、管理的最小的部署單元。好比一個或一組容器。
2. Replication Controllers
Replication Controller是Kubernetes系統中最有用的功能,實現複製多個Pod副本,每每一個應用須要多個Pod來支撐,而且能夠保證其複製的副本數,即便副本所調度分配的宿主機出現異常,經過Replication Controller能夠保證在其它主宿機啓用同等數量的Pod。Replication Controller能夠經過repcon模板來建立多個Pod副本,一樣也能夠直接複製已存在Pod,須要經過Label selector來關聯。
3. Services
Services是Kubernetes最外圍的單元,經過虛擬一個訪問IP及服務端口,能夠訪問咱們定義好的Pod資源,目前的版本是經過iptables的nat轉發來實現,轉發的目標端口爲Kube_proxy生成的隨機端口,目前只提供GOOGLE雲上的訪問調度,如GCE。若是與咱們自建的平臺進行整合?請關注下篇《kubernetes與HECD架構的整合》文章。
4. Labels
Labels是用於區分Pod、Service、Replication Controller的key/value鍵值對,僅使用在Pod、Service、Replication Controller之間的關係識別,但對這些單元自己進行操做時得使用name標籤。
5. Proxy
Proxy不但解決了同一主宿機相同服務端口衝突的問題,還提供了Service轉發服務端口對外提供服務的能力,Proxy後端使用了隨機、輪循負載均衡算法。
說說我的一點見解,目前Kubernetes 保持一週一小版本、一個月一大版本的節奏,迭代速度極快,同時也帶來了不一樣版本操做方法的差別,另外官網文檔更新速度相對滯後及欠缺,給初學者帶來必定挑戰。在上游接入層官方側重點還放在GCE(Google Compute Engine)的對接優化,針對我的私有云還未推出一套可行的接入解決方案。在v0.5版本中才引用service代理轉發的機制,且是經過iptables來實現,在高併發下性能使人擔心。但做者依然看好Kubernetes將來的發展,至少目前還未看到另一個成體系、具有良好生態圈的平臺,相信在V1.0時就會具有生產環境的服務支撐能力。

 

1.Kubernetes介紹前端

1.1 簡介
Kubernetes是什麼?
首先,它是一個全新的基於容器技術的分佈式架構領先方案。
其次,它是一個開放的開發平臺。
最後,它是一個完備的分佈式系統支撐平臺。
Kubernetes是Google團隊發起的開源項目,它的目標是管理跨多個主機的容器,提供基本的部署,維護以及運用伸縮,主要實現語言爲Go語言。
Kubernetes特色是:
•易學:輕量級,簡單,容易理解
•便攜:支持公有云,私有云,混合雲,以及多種雲平臺
•可拓展:模塊化,可插拔,支持鉤子,可任意組合
•自修復:自動重調度,自動重啓,自動複製。
Kubernets目前在https://github.com/kubernetes/kubernetes進行維護。
1.2 基本概念
•Node(節點):在Kubernetes中,節點是實際工做的點,較早版本稱爲Minion。節點能夠是虛擬機或者物理機器,依賴於一個集羣環境。每一個節點都有一些必要的服務以運行Pod容器組,而且它們均可以經過主節點來管理。在Node上運行的服務進程包括docker daemon,Kubelet和 Kube-Proxy。
•Pod(容器組):是Kubernetes的基本操做單元,把相關的一個或多個容器構成一個Pod,一般Pod裏的容器運行相同的應用。Pod包含的容器運行在同一個節點上,看做一個統一管理單元,共享相同的volumes和network namespace/IP和Port空間。
•Pod的生命週期:Pod的生命週期是經過Replication Controller來管理的。在整個過程當中,Pod處於4種狀態之一:Pending, Running, Succeeded, Failed。
•Replication Controller(RC):用於定義Pod副本的數量。確保任什麼時候候Kubernetes集羣中有指定數量的Pod副本在運行, 若是少於指定數量的Pod副本,Replication Controller會啓動新的Pod,反之會殺死多餘的以保證數量不變。
•Service(服務):一個Service能夠看做一組提供相同服務的Pod的對外訪問接口。
•Volume(存儲卷):Volume是Pod中可以被多個容器訪問的共享目錄。
•Label(標籤):用於區分Pod、Service、Replication Controller的key/value鍵值對,Pod、Service、 Replication Controller能夠有多個label,可是每一個label的key只能對應一個value。Labels是Service和Replication Controller運行的基礎,爲了將訪問Service的請求轉發給後端提供服務的多個容器,正是經過標識容器的labels來選擇正確的容器。一樣,Replication Controller也使用labels來管理經過pod 模板建立的一組容器,這樣Replication Controller能夠更加容易,方便地管理多個容器,不管有多少容器。
•Proxy(代理):是爲了解決外部網絡可以訪問跨機器集羣中容器提供的應用服務而設計的。Proxy提供TCP/UDP sockets的proxy,每建立一種Service,Proxy主要從etcd獲取Services和Endpoints的配置信息,或者也能夠從file獲取,而後根據配置信息在Minion上啓動一個Proxy的進程並監聽相應的服務端口,當外部請求發生時,Proxy會根據Load Balancer將請求分發到後端正確的容器處理。
•Namespace(命名空間):經過將系統內部的對象「分配」到不一樣的Namespace中,造成邏輯上的不一樣分組,便於在共享使用整個集羣的資源同時還能分別管理。
•Annotation(註解):與Label相似,但Label定義的是對象的元數據,而Annotation則是用戶任意定義的「附加」信息。
1.3 組件
1.3.1 Master運行三個組件:
•apiserver:做爲kubernetes系統的入口,封裝了核心對象的增刪改查操做,以RESTFul接口方式提供給外部客戶和內部組件調用。它維護的REST對象將持久化到etcd(一個分佈式強一致性的key/value存儲)。
•scheduler:負責集羣的資源調度,爲新建的Pod分配機器。這部分工做分出來變成一個組件,意味着能夠很方便地替換成其餘的調度器。
•controller-manager:負責執行各類控制器,目前有兩類:
(1)endpoint-controller:按期關聯service和Pod(關聯信息由endpoint對象維護),保證service到Pod的映射老是最新的。
(2)replication-controller:按期關聯replicationController和Pod,保證replicationController定義的複製數量與實際運行Pod的數量老是一致的。
1.3.2 Worker運行兩個組件:
•kubelet:負責管控docker容器,如啓動/中止、監控運行狀態等。它會按期從etcd獲取分配到本機的Pod,並根據Pod信息啓動或中止相應的容器。同時,它也會接收apiserver的HTTP請求,彙報Pod的運行狀態。
•proxy:負責爲Pod提供代理。它會按期從etcd獲取全部的service,並根據service信息建立代理。當某個客戶Pod要訪問其餘Pod時,訪問請求會通過本機proxy作轉發。

2.快速安裝Kubernetesnode

 

2.1 關閉防火牆
     systemctl disable firewalld
     systemctl stop firewalld
2.2 安裝etcd和Kubernetes
     vi  virt7-docker-common-release.repo
[virt7-docker-common-release]
name=virt7-docker-common-release
baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
gpgcheck=0
      yum install -y etcd kubernetes    (docker版本衝突請先卸載)
Dependencies Resolved
================================================================================================
 Package                     Arch       Version                                Repository  Size
================================================================================================
Installing:
 kubernetes                  x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras      34 k
Installing for dependencies:
 docker                      x86_64     1.9.1-25.el7.centos                    extras      13 M
 docker-forward-journald     x86_64     1.9.1-25.el7.centos                    extras     824 k
 docker-selinux              x86_64     1.9.1-25.el7.centos                    extras      70 k
 kubernetes-client           x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras     9.3 M
 kubernetes-master           x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras      15 M
 kubernetes-node             x86_64     1.2.0-0.9.alpha1.gitb57e8bd.el7        extras     9.3 M
 socat                       x86_64     1.7.2.2-5.el7                          base       255 k
Transaction Summary
================================================================================================
Install  1 Package (+7 Dependent packages)
Installed:
  kubernetes.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                           
Dependency Installed:
  docker.x86_64 0:1.9.1-25.el7.centos                                                           
  docker-forward-journald.x86_64 0:1.9.1-25.el7.centos                                          
  docker-selinux.x86_64 0:1.9.1-25.el7.centos                                                   
  kubernetes-client.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                    
  kubernetes-master.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                    
  kubernetes-node.x86_64 0:1.2.0-0.9.alpha1.gitb57e8bd.el7                                      
  socat.x86_64 0:1.7.2.2-5.el7                                                                  
Complete!
2.3 修改配置
 
      vim /etc/sysconfig/docker
      修改成OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
      vim /etc/kubernetes/apiserver
      刪除ServiceAccount   KUBE_ADMISSION_CONTROL="--admission
      -control=NamespaceLifecycle,NamespaceExists,LimitRanger, ServiceAccount,SecurityContextDeny,ResourceQuota"
2.4 啓動服務
     systemctl start etcd
     systemctl start docker
     systemctl start kube-apiserver
     systemctl start kube-controller-manager
     systemctl start kube-scheduler
     systemctl start kubelet
     systemctl start kube-proxy

3.Guestbook部署linux

•redis-master: 用於前端Web應用進行「寫」留言的操做,其中已經保存了一條內容爲「Hello World!」的留言。
•guestbook-redis-slave: 用於前端Web應用進行「讀」留言的操做,並與redis-master的數據保持同步。
•guestbook-php-frontend: PHP Web服務,在網頁上展現留言內容,也提供一個文本輸入框供訪客添加留言。

3.1 下載鏡像
      #docker pull kubeguide/redis-master
      #docker pull kubeguide/guestbook-redis-slave
      #docker pull kubeguide/guestbook-php-frontend
           REPOSITORY                                   TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
        docker.io/kubeguide/guestbook-php-frontend   latest              38658844a359        7 months ago        509.6 MB
        docker.io/kubeguide/redis-master             latest              423e126c2ad4        8 months ago        419.1 MB
        docker.io/kubeguide/guestbook-redis-slave    latest              00206e07dd92        8 months ago        109.5 MB
 
3.2 設置工做目錄
      #mkdir kube-guestbook
      #cd kube-guestbook
 
3.3 建立redis-master Pod和服務
     #vi 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: docker.io/kubeguide/redis-master 
                      ports: 
                      - containerPort: 6379
         建立redis-master Pod
        #kubectl create -f redis-master-controller.yaml
        #kubectl get pods
       一開始pod在pending狀態
       [root@CentOS7 kube-guestbook]# kubectl get pods
       NAME                 READY     STATUS              RESTARTS   AGE
       redis-master-7i338   0/1       ContainerCreating   0          47s
         第一次啓動容器時間比較久,若是沒什麼問題,狀態會更新爲Running
       [root@CentOS7 kube-guestbook]# kubectl get pods
       NAME                 READY     STATUS    RESTARTS   AGE
       redis-master-7i338   1/1       Running   0          11m
       #vi redis-master-service.yaml
       apiVersion: v1
       kind: Service
       metadata:
           name: redis-master
           labels:
              name: redis-master
       spec:
       ports:
       # the port that this service should serve on
       - port: 6379
       targetPort: 6379
       selector:
          name: redis-master   
建立redis-master服務
#kubectl create -f redis-master-service.yaml
#kubectl get services
 [root@CentOS7 kube-guestbook]# kubectl get services
NAME           CLUSTER_IP     EXTERNAL_IP   PORT(S)    SELECTOR            AGE
kubernetes     10.254.0.1     <none>        443/TCP    <none>              8d
redis-master   10.254.137.9   <none>        6379/TCP   name=redis-master   7s
 
3.4 建立redis-slave Pod和服務
#vi 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: docker.io/kubeguide/guestbook-redis-slave
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 6379
建立redis-slave Pod
#kubectl create -f redis-slave-controller.yaml
#kubectl get rc
CONTROLLER     CONTAINER(S)   IMAGE(S)      SELECTOR                        REPLICAS  AGE
redis-master   master  docker.io/kubeguide/redis-master  name=redis-master   1    26m
redis-slave slave docker.io/kubeguide/guestbook-redis-slave name=redis-slave  2    10s
# kubectl get pods
NAME                 READY     STATUS    RESTARTS   AGE
redis-master-7i338   1/1       Running   0          27m
redis-slave-jju81    1/1       Running   0          28s
redis-slave-yzzmd    1/1       Running   0          28s
# vi redis-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    name: redis-slave
spec:
  ports:
  - port: 6379
  selector:
    name: redis-slave
建立redis-slave服務
#kubectl create -f redis-slave-service.yaml
#kubectl get services

# kubectl get services
NAME           CLUSTER_IP       EXTERNAL_IP   PORT(S)    SELECTOR            AGE
kubernetes     10.254.0.1       <none>        443/TCP    <none>              8d
redis-master   10.254.137.9     <none>        6379/TCP   name=redis-master   13m
redis-slave    10.254.181.125   <none>        6379/TCP   name=redis-slave    7s
 
3.5 建立frontend Pod和服務
# vi 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: php-redis
        image: docker.io/kubeguide/guestbook-php-frontend
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 80
建立frontend Pod
#kubectl create -f frontend-controller.yaml
#kubectl get rc
CONTROLLER     CONTAINER(S)   IMAGE(S)          SELECTOR            REPLICAS   AGE
frontend php-redis docker.io/kubeguide/guestbook-php-frontend name=frontend 3          7s
redis-master   master         docker.io/kubeguide/redis-master             name=redis-master   1          36m
redis-slave    slave          docker.io/kubeguide/guestbook-redis-slave    name=redis-slave    2          9m
# kubectl get pods
NAME                 READY     STATUS    RESTARTS   AGE
frontend-00drw       1/1       Running   0          2m
frontend-78d16       1/1       Running   0          2m
frontend-z2fmk       1/1       Running   0          2m
redis-master-7i338   1/1       Running   0          38m
redis-slave-jju81    1/1       Running   0          12m
redis-slave-yzzmd    1/1       Running   0          12m
# vi frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort:30001    
  selector:
    name: frontend
建立frontend服務
#kubectl create -f frontend-service.yaml
#kubectl get services
NAME           CLUSTER_IP       EXTERNAL_IP   PORT(S)    SELECTOR            AGE
frontend       10.254.131.102   nodes         80/TCP     name=frontend       19s
kubernetes     10.254.0.1       <none>        443/TCP    <none>              8d
redis-master   10.254.137.9     <none>        6379/TCP   name=redis-master   30m
redis-slave    10.254.181.125   <none>        6379/TCP   name=redis-slave    17m
 
3.6經過瀏覽器訪問網頁
訪問主機30001端口,咱們看到網頁已經默認有一條Hello World!
3.7中止Pod和服務
kubectl stop rc redis-master
kubectl stop rc redis-slave
kubectl stop rc frontend
kubectl delete service redis-master
kubectl delete service redis-slave
kubectl delete service frontend
3.8 其餘
kubectl get node  獲取節點
kubectl describe node xxx    詳細信息
相關文章
相關標籤/搜索