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


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

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.快速安裝Kubernetes

 

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部署

•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    詳細信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM