kubernetes單機板


參考地址:


環境:  centos7
   
   
   
           
  1. [fu@centos server]$ uname -a
  2. Linux centos 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

1,關閉centos自帶防火牆

systemctl stop firewalld
systemctl disable firewalld

2.安裝etcd和kubernetes 軟件(自動安裝)
 
添加yum源:
   
   
   
           
  1. [root@centos fu]# cd /etc/yum.repos.d/
  2. [root@centos yum.repos.d]# ls
  3. CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
  4. CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
  5. [root@centos yum.repos.d]# vi virt7-docker-common-release.repo
  6. [root@centos yum.repos.d]# yum install -y etcd kubernetes
virt7 - docker - common - release . repo
   
   
   
           
  1. [virt7-docker-common-release]
  2. name=virt7-docker-common-release
  3. baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
  4. gpgcheck=0
安裝 etcd與kubernetes:

   
   
   
           
  1. [root@centos system]# yum install -y etcd kubernetes




3.安裝完成后修改配制:

   3.1 修改docker配制文件
   
   
   
           
  1. [root@centos system]# vi /etc/sysconfig/docker
將:
   
   
   
           
  1. OPTIONS='--selinux-enabled --log-driver=journald'
改成:
   
   
   
           
  1. OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald'
   3.2 修改hubernetes 配制文件
   
   
   
           
  1. [root@centos system]# vi /etc/kubernetes/apiserver
--admission-control=后面的參數 ServiceAccount 刪除掉
將:
   
   
   
           
  1. KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
改成:
   
   
   
           
  1. KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

4.依次啟動所有的服務:

    
    
    
            
  1. [root@centos system]# systemctl start etcd
  2. [root@centos system]# systemctl start docker
  3. [root@centos system]# systemctl start kube-apiserver
  4. [root@centos system]# systemctl start kube-controller-manager
  5. [root@centos system]# systemctl start kube-scheduler
  6. [root@centos system]# systemctl start kubelet
  7. [root@centos system]# systemctl start kube-proxy
或者:
   
   
   
           
  1. systemctl start etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy

好啦,安裝完成!

5.運行測試案例:

Guestbook部署,最好是先將鏡像pull下來,當然也可以交給kubernetees完成

•redis-master: 用於前端Web應用進行“寫”留言的操作,其中已經保存了一條內容為“Hello World!”的留言。
•guestbook-redis-slave: 用於前端Web應用進行“讀”留言的操作,並與redis-master的數據保持同步。
•guestbook-php-frontend: PHP Web服務,在網頁上展示留言內容,也提供一個文本輸入框供訪客添加留言。
   
   
   
           
  1. #docker pull kubeguide/redis-master
  2. #docker pull kubeguide/guestbook-redis-slave
  3. #docker pull kubeguide/guestbook-php-frontend

我們先創建pod ,然后定義與之關聯的service
可以到git上下載所須的yaml文件:

然后統一運行:
cd 到存放目錄
   
   
   
           
  1. kubectl create -f ./


也可以一步步來,如下:
 5.1 創建master-controller:redis-master-controller.yaml
   
   
   
           
  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: redis-master
  5. labels:
  6. name: redis-master
  7. spec:
  8. replicas: 2
  9. selector:
  10. name: redis-master
  11. template:
  12. metadata:
  13. labels:
  14. name: redis-master
  15. spec:
  16. containers:
  17. - name: master
  18. image: redis
  19. ports:
  20. - containerPort: 6379
運行 master-controller
   
   
   
           
  1. kubectl create -f redis-master-controller.yaml

5.2 創建master-service文件:redis-master-service.yaml
   
   
   
           
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: redis-master
  5. labels:
  6. name: redis-master
  7. spec:
  8. selector:
  9. name: redis-master
  10. ports:
  11. - port: 6379
  12. targetPort: 6379
運行 master-service
   
   
   
           
  1. kubectl create -f redis-master-service.yaml

5.3 創建:redis-slave-controller.yaml
[root@centos kube-guestbook]# cp /home/fu/redis-slave-controller.yaml /root/kube-guestbook/
    
    
    
            
  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: redis-slave
  5. labels:
  6. name: redis-slave
  7. spec:
  8. replicas: 2
  9. selector:
  10. name: redis-slave
  11. template:
  12. metadata:
  13. labels:
  14. name: redis-slave
  15. spec:
  16. containers:
  17. - name: slave
  18. image: kubeguide/guestbook-redis-slave
  19. ports:
  20. - containerPort: 6379
  21. env:
  22. - name: GET_HOSTS_FROM
  23. value: env
運行 slave-controller
    
    
    
            
  1. [root@centos kube-guestbook]# kubectl create -f redis-slave-controller.yaml

5.4 創建 redis-slave-service.yaml
[root@centos kube-guestbook]# cp /home/fu/redis-slave-service.yaml /root/kube-guestbook/
    
    
    
            
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: redis-slave
  5. labels:
  6. name: redis-slave
  7. spec:
  8. selector:
  9. name: redis-slave
  10. ports:
  11. - port: 6379
運行:slave-service
    
    
    
            
  1. [root@centos kube-guestbook]# kubectl create -f redis-slave-service.yaml

5.5 創建 frontend-controller.yaml:
[root@centos kube-guestbook]# cp /home/fu/frontend-controller.yaml /root/kube-guestbook/
    
    
    
            
  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: frontend
  5. labels:
  6. name: frontend
  7. spec:
  8. replicas: 3
  9. selector:
  10. name: frontend
  11. template:
  12. metadata:
  13. labels:
  14. name: frontend
  15. spec:
  16. containers:
  17. - name: frontend
  18. image: kubeguide/guestbook-php-frontend
  19. env:
  20. - name: GET_HOSTS_FROM
  21. value: env
  22. ports:
  23. - containerPort: 80
運行 frontend-controller:
    
    
    
            
  1. [root@centos kube-guestbook]# kubectl create -f frontend-controller.yaml

如遇到下面這些錯,都是因為格式問題。復制時,空格或制表符都是很嚴格的
   
   
   
           
  1. yaml: line 17: mapping values are not allowed in this context
    
    
    
            
  1. error validating "redis-master-controller.yaml": error validating data: [found invalid field spec for v1.ReplicationControllerSpec, found invalid field labels for v1.PodTemplateSpec]; if you choose to ignore these errors, turn validation off with --validate=false

然后查看狀態:
   
   
   
           
  1. [root@centos kube-guestbook]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. redis-master-rx769 0/1 ContainerCreating 0 3m
  4. redis-master-za6q6 0/1 ContainerCreating 0 3m
  5. [root@centos kube-guestbook]# kubectl get pods
  6. NAME READY STATUS RESTARTS AGE
  7. redis-master-rx769 0/1 ContainerCreating 0 3m
  8. redis-master-za6q6 0/1 ContainerCreating 0 3m


6.停止Pod和服務

     
     
     
             
  1. kubectl stop rc redis-master
  2. kubectl stop rc redis-slave
  3. kubectl stop rc frontend
  4. kubectl delete service redis-master
  5. kubectl delete service redis-slave
  6. kubectl delete service frontend

6.1其他

    
    
    
            
  1. kubectl get node 獲取節點
  2. kubectl describe node xxx 詳細信息
 獲取所有的pod (容器實例,docker container)
   
   
   
           
  1. [root@centos yum.repos.d]# kubectl get pods
 
獲取所有的service (服務,selector 確定把哪些pod對應到本服務)
   
   
   
           
  1. [root@centos yum.repos.d]# kubectl get service
 獲取所有的RC,(rc根據template生成指定的pod實例)
   
   
   
           
  1. [root@centos yum.repos.d]# kubectl get rc


最終效果:
 
 

大家有必要先理解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做轉發。







免責聲明!

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



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