參考地址:
環境:
centos7
[fu@centos server]$ uname -aLinux 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源:
[root@centos fu]# cd /etc/yum.repos.d/[root@centos yum.repos.d]# lsCentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repoCentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo[root@centos yum.repos.d]# vi virt7-docker-common-release.repo[root@centos yum.repos.d]# yum install -y etcd kubernetes
virt7
-
docker
-
common
-
release
.
repo:
[virt7-docker-common-release]name=virt7-docker-common-releasebaseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/gpgcheck=0
安裝 etcd與kubernetes:
[root@centos system]# yum install -y etcd kubernetes
3.安裝完成後修改配製:
3.1 修改docker配製文件
[root@centos system]# vi /etc/sysconfig/docker
將:
OPTIONS='--selinux-enabled --log-driver=journald'
改爲:
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald'
3.2 修改hubernetes 配製文件
[root@centos system]# vi /etc/kubernetes/apiserver
把
--admission-control=後面的參數
ServiceAccount 刪除掉
將:
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
改爲:
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
4.依次啓動全部的服務:
[root@centos system]# systemctl start etcd[root@centos system]# systemctl start docker[root@centos system]# systemctl start kube-apiserver[root@centos system]# systemctl start kube-controller-manager[root@centos system]# systemctl start kube-scheduler[root@centos system]# systemctl start kubelet[root@centos system]# systemctl start kube-proxy
或者:
- kubelet kube-proxy
systemctl start etcd docker kube-apiserver kube-controller-manager kube-scheduler
好啦,安裝完成!
5.運行測試案例:
Guestbook部署,最好是先將鏡像pull下來,固然也能夠交給kubernetees完成php
•redis-master: 用於前端Web應用進行「寫」留言的操做,其中已經保存了一條內容爲「Hello World!」的留言。
•guestbook-redis-slave: 用於前端Web應用進行「讀」留言的操做,並與redis-master的數據保持同步。
•guestbook-php-frontend: PHP Web服務,在網頁上展現留言內容,也提供一個文本輸入框供訪客添加留言。
#docker pull kubeguide/redis-master#docker pull kubeguide/guestbook-redis-slave#docker pull kubeguide/guestbook-php-frontend
咱們先建立pod ,而後定義與之關聯的service
能夠到git上下載所須的yaml文件:
而後統一運行:
cd 到存放目錄
也能夠一步步來,以下:
5.1 建立master-controller:redis-master-controller.yaml
apiVersion: v1kind: ReplicationControllermetadata: name: redis-master labels: name: redis-masterspec: replicas: 2 selector: name: redis-master template: metadata: labels: name: redis-master spec: containers: - name: master image: redis ports: - containerPort: 6379
運行 master-controller:
kubectl create -f redis-master-controller.yaml
5.2 建立master-service文件:redis-master-service.yaml
apiVersion: v1kind: Servicemetadata: name: redis-master labels: name: redis-masterspec: selector: name: redis-master ports: - port: 6379 targetPort: 6379
運行
master-service
:
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/
apiVersion: v1kind: ReplicationControllermetadata: name: redis-slave labels: name: redis-slavespec: replicas: 2 selector: name: redis-slave template: metadata: labels: name: redis-slave spec: containers: - name: slave image: kubeguide/guestbook-redis-slave ports: - containerPort: 6379 env: - name: GET_HOSTS_FROM value: env
運行
slave-controller
:
[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/
apiVersion: v1kind: Servicemetadata: name: redis-slave labels: name: redis-slavespec: selector: name: redis-slave ports: - port: 6379
運行:slave-service
[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/
apiVersion: v1kind: ReplicationControllermetadata: name: frontend labels: name: frontendspec: 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
運行
frontend-controller:
[root@centos kube-guestbook]# kubectl create -f frontend-controller.yaml
如遇到下面這些錯,都是由於格式問題。複製時,空格或製表符都是很嚴格的
yaml: line 17: mapping values are not allowed in this context
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
而後查看狀態:
[root@centos kube-guestbook]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-rx769 0/1 ContainerCreating 0 3mredis-master-za6q6 0/1 ContainerCreating 0 3m[root@centos kube-guestbook]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-rx769 0/1 ContainerCreating 0 3mredis-master-za6q6 0/1 ContainerCreating 0 3m
6.中止Pod和服務
kubectl stop rc redis-masterkubectl stop rc redis-slavekubectl stop rc frontendkubectl delete service redis-masterkubectl delete service redis-slavekubectl delete service frontend
6.1其餘
kubectl get node 獲取節點kubectl describe node xxx 詳細信息
獲取全部的pod (容器實例,docker container)
- [root@centos yum.repos.d]# kubectl get pods
獲取全部的service (服務,selector 肯定把哪些pod對應到本服務)
[root@centos yum.repos.d]# kubectl get service
獲取全部的RC,(rc根據template生成指定的pod實例)
[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介紹html
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作轉發。