Kubernetes(k8s)具備完備的集羣管理能力:php
Pod是在K8s集羣中運行部署應用或服務的最小單元,它是能夠支持多容器的。Pod的設計理念是支持多個容器在一個Pod中共享網絡地址和文件系統,能夠經過進程間通訊和文件共享這種簡單高效的方式組合完成服務。Pod對多容器的支持是K8s最基礎的設計理念。Pod是K8s集羣中全部業務類型的基礎,能夠看做運行在K8s集羣中的小機器人,不一樣類型的業務就須要不一樣類型的小機器人去執行。html
在K8s中,全部的容器均在Pod中運行,一個Pod能夠承載一個或者多個相關的容器,同一個Pod中的容器會部署在同一個物理機器上而且可以共享資源。java
一個Pod也能夠包含0個或者多個數據卷組(volumes),這些卷組將會以目錄的形式提供給一個容器,或者被全部Pod中的容器共享,對於用戶建立的每一個Pod,系統會自動選擇那個健康而且有足夠容量的機器,而後建立相似容器的容器,當容器建立失敗的時候,容器會被node agent自動的重啓,這個node agent 叫 kubelet,可是,若是是Pod失敗或者機器它不會自動的轉移而且啓動,除非用戶定義了 replication controller。node
用戶能夠本身建立並管理Pod。K8s將這些操做簡化爲兩個操做:能夠基於相同的Pod配置文件部署多個Pod複製品;python
建立可替代的Pod,當一個Pod掛了或者機器掛了的時候。而K8s API中負責來從新啓動,遷移等行爲的部分叫作「replication controller」,它根據一個模板生成了一個Pod,而後系統就根據用戶的需求建立了許多冗餘,這些冗餘的Pod組成了一個整個應用或者服務或者服務中的一組。mysql
一旦一個Pod被建立,系統就會不停的監控Pod的健康狀況以及Pod所在主機的健康狀況,若是這個Pod由於軟件緣由掛掉了或者所在的機器掛掉了,replication controller 會自動在一個健康的機器上建立一個一摸同樣的Pod,來維持原來的Pod冗餘狀態數量不變,一個應用的多個Pod能夠共享一個機器。linux
Kubernetes直接管理Pod而不是容器:
一個pod能夠是一個容器,也能夠是多個容器,例如你運行一個服務項目,其中須要使用nginx、mysql、tomcat,能夠將這三個應用在同一個pod中,對他們提供統一的調配能力。
一個pod只能運行在一個主機上,而一個主機上能夠有多個pod。
RC是K8s集羣中保證Pod高可用的API對象。經過監控運行中的Pod來保證集羣中運行指定數目的Pod副本。
指定的數目能夠是多個也能夠是1個;少於指定數目,RC就會啓動運行新的Pod副本;多於指定數目,RC就會殺死多餘的Pod副本。
即便在指定數目爲1的狀況下,經過RC運行Pod也比直接運行Pod更明智,由於RC也能夠發揮它高可用的能力,保證永遠有1個Pod在運行。
RC只適用於長期伺服型的業務類型,好比控制小機器人提供高可用的Web服務。
RS是新一代RC,提供一樣的高可用能力,區別主要在於RS後來居上,能支持更多種類的匹配模式。副本集對象通常不單獨使用,而是做爲Deployment的理想狀態參數使用。nginx
部署表示用戶對K8s集羣的一次更新操做。
部署是一個比RS應用模式更廣的API對象,能夠是建立一個新的服務,更新一個新的服務,也能夠是滾動升級一個服務。
RC、RS和 Deployment只是保證了支撐服務的微服務Pod的數量,可是沒有解決如何訪問這些服務的問題。 一個Pod只是一個運行服務的實例,隨時可能在一個節點上掛掉,在另外一個節點以一個新的IP啓動一個新的Pod,所以不能以固定的IP和端口號對外提供服務。
要穩定地提供服務須要服務發現和負載均衡能力。每一個Service會對應一個集羣內部有效的虛擬VIP,集羣內部經過VIP訪問一個服務。
在K8s集羣中微服務的負載均衡是由Kube-proxy負載均衡器來實現的。它是一個分佈式代理服務器,在K8s的每一個節點上都有一個。
五、名稱空間(Namespace)web
名稱空間爲K8s集羣提供虛擬的隔離做用,K8s集羣初始有兩個名稱空間:默認名稱空間 default、系統名稱空間 kube-system。sql
除此之外,管理員能夠建立新的名稱空間知足須要。
K8s集羣中的存儲卷跟Docker的存儲卷有些相似,只不過Docker的存儲卷做用範圍爲一個容器,而K8s的存儲卷的生命週期和做用範圍是一個Pod。
每一個Pod中聲明的存儲卷由Pod中的全部容器共享。
集羣中 master 節點上運行三個進程: 分別是:kube-apiserver,kube-controller-manager和kube-scheduler。 羣集每一個node節點都運行兩個進程: kubelet,與Kubernetes Master進行通訊。 kube-proxy,一個網絡代理,反映每一個節點上的Kubernetes網絡服務。
https://kubernetes.io/docs/tutorials/kubernetes-basics/
使用Katacoda在運行Minikube的Web瀏覽器中運行虛擬終端,這是一個能夠在任何地方運行的Kubernetes的小規模本地部署。
無需安裝任何軟件或配置任何東西; 每一個交互式教程都直接從您的Web瀏覽器自己運行。在命令行進行單擊就能夠,無需手動輸入
中文文檔:http://docs.kubernetes.org.cn/
使用Kubernetes命令行界面Kubectl建立和管理部署,建立部署時,您須要指定應用程序的容器映像以及要運行的副本數。
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
kubectl get deployments
kubectl proxy
curl http://localhost:8001/version
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
查看節點信息和pod信息
一個node節點能夠部署多個pod,一個pod能夠部署一個或多個app和volume
kubectl get pods 獲取列表資源
kubectl describe pods 顯示有關資源的詳細信息
kubectl logs $POD_NAME 從pod中的容器打印日誌
kubectl exec $POD_NAME env 在pod中的容器上執行命令
kubectl exec -ti $POD_NAME bash
cat server.js
curl localhost:8080
exit
您可使用這些命令查看應用程序的部署時間,當前狀態,運行位置以及配置。
Kubernetes服務是一個抽象層,它定義了一組邏輯Pod,併爲這些Pod啓用外部流量暴露,負載平衡和服務發現。
不一樣方式公開服務: ClusterIP(默認) - 在羣集中的內部IP上公開服務。此類型使服務只能從羣集中訪問。 NodePort - 使用NAT在集羣中每一個選定節點的同一端口上公開服務。使用可從羣集外部訪問服務<NodeIP>:<NodePort>。ClusterIP的超集。 LoadBalancer - 在當前雲中建立外部負載均衡器(若是支持),併爲服務分配固定的外部IP。NodePort的超集。 ExternalName - externalName經過返回帶有名稱的CNAME記錄,使用任意名稱(在規範中指定)公開服務。沒有代理使用。此類型須要v1.7或更高版本kube-dns。
服務使用標籤和選擇器匹配一組Pod,這是一個容許對Kubernetes中的對象進行邏輯操做的分組。標籤是附加到對象的鍵/值對,能夠以多種方式使用:
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
kubectl delete service -l run=kubernetes-bootcamp
Pod數量的擴容和縮容
您可使用kubectl run命令的--replicas參數從頭開始建立具備多個實例的Deployment
kubectl get deployments
kubectl scale deployments/kubernetes-bootcamp --replicas=4
kubectl get pods -o wide
kubectl describe deployments/kubernetes-bootcamp
kubectl describe services/kubernetes-bootcamp
kubectl scale deployments/kubernetes-bootcamp --replicas=2
滾動更新容許經過使用新的實例逐步更新Pods實例來實現部署的更新,從而實現0停機。新的Pod將在具備可用資源的節點上進行調度。
滾動更新容許如下操做:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl rollout status deployments/kubernetes-bootcamp
kubectl rollout undo deployments/kubernetes-bootcamp
解決方案:docker本地服務器方案、託管方案、全套雲端方案、定製方案
若是你只是想試一試Kubernetes,咱們推薦基於Docker的本地方案。
基於Docker的本地方案是衆多可以完成快速搭建的本地集羣方案中的一種,可是侷限於單臺機器。
Vagrant 是一款用來構建虛擬開發環境的工具,很是適合 php/python/ruby/java 這類語言開發 web 應用,「代碼在我機子上運行沒有問題」這種說辭將成爲歷史。
咱們能夠經過 Vagrant 封裝一個 Linux 的開發環境,分發給團隊成員。成員能夠在本身喜歡的桌面系統(Mac/Windows/Linux)上開發程序,代碼卻能統一在封裝好的環境裏運行,很是霸氣。
本文教程的虛擬機是基於VirtualBox的(VMWare也能夠,可是須要破解),下面來介紹安裝VirtualBox和Vagrant的安裝。
下載地址:https://www.virtualbox.org/wiki/Downloads
歷史版本:https://www.virtualbox.org/wiki/Download_Old_Builds_4_3_pre24
https://www.vagrantup.com/downloads.html
3. centos7.box:
http://cloud.centos.org/centos/7/vagrant/x86_64/images/
VirtualBox:自版本4.3.12後啓動虛擬機會存在各類問題,所以建議安裝4.3.12版本。
Vagrant:從1.0.x能夠直接升級到1.x版本,Vagrant向後兼容Vagrant1.0.x,可是1.1+版本不在支持1.0.x版本的插件,所以插件也要作相應升級。
建議安裝好以後將VirtualBox的虛擬機位置設置到其餘盤,不然佔用默認C盤空間較大,已安裝的虛擬機須要移動到新的目錄下,具體設置辦法請見下圖:
簡單來講,使用如下兩條命令就能夠啓動一個Vagrant環境了:
$ vagrant init hashicorp/precise32 $ vagrant up
經過上面兩個命令,就能夠在VirtualBox中啓動並運行Ubuntu 12.04 LTS 32-bit了,可使用命令vagrant ssh
登陸到這臺虛擬機上,當完成一切操做以後,可使用vagrant destroy
命令來銷燬它。
下面咱們分步驟來介紹怎麼配置而且啓動一個基於VirtualBox虛擬機的Vagrant環境:
開始任何一個項目須要一個名爲Vagrantfile的文件來配置Vagrant,這個文件的做用有一下兩個:
可使用命令vagrant init
來初始化項目目錄,能夠按照如下步驟操做
$ mkdir vagrant_project $ cd vagrant_project $ vagrant init
這樣在當前目錄下就會生成名爲Vagrantfile的文件,固然也能夠在已有的工程目錄下執行vagrant init
命令來初始化生成這個文件。
可使用命令vagrant box add
來添加虛擬機,例如要添加Ubuntu12.04,咱們可使用:
$ vagrant box add hashicorp/precise32
在不進入虛擬機的狀況下,還可使用下面的命令對 虛擬機進行管理:
vagrant up (啓動虛擬機)
vagrant halt (關閉虛擬機——對應就是關機)
vagrant suspend (暫停虛擬機——只是暫停,虛擬機內存等信息將以狀態文件的方式保存在本地,能夠執行恢復操做後繼續使用)
vagrant resume (恢復虛擬機 —— 與前面的暫停相對應)
vagrant destroy (刪除虛擬機,刪除後在當前虛擬機所作進行的除開Vagrantfile中的配置都不會保留)
當在啓動Vagrant後,對於虛擬機有進行過安裝環境相關的配置,若是並不但願寫在Vagrant的啓動shell裏面每次都從新安裝配置一遍,能夠將當前配置好的虛擬機打包成box,
vagrant package --output NAME --vagrantfile FILE
1. 你必須擁有一臺安裝有Docker的機器。
2. 你的內核必須支持 memory內存 和 swap交換分區 accounting 。確認你的linux內核開啓了以下配置:
CONFIG_RESOURCE_COUNTERS=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y CONFIG_MEMCG_SWAP_ENABLED=y CONFIG_MEMCG_KMEM=y
第一步:運行Etcd
docker run --net=host -d gcr.io/google_containers/etcd:2.0.12 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data
第二步:啓動master
docker run -d \ --volume=/:/rootfs:ro \ --volume=/sys:/sys:ro \ --volume=/dev:/dev \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/var/lib/kubelet/:/var/lib/kubelet:rw \ --volume=/var/run:/var/run:rw \ --net=host \ --pid=host \ --privileged=true \ gcr.io/google_containers/hyperkube:v1.0.1 \ /hyperkube kubelet --containerized --hostname-override="127.0.0.1" --address="0.0.0.0" --api-servers=http://localhost:8080 --config=/etc/kubernetes/manifests
這一步實際上運行的是 kubelet ,並啓動了一個包含其餘master組件的[pod](../userguide/pods.md)。
第三步:運行service proxy
docker run -d --net=host --privileged gcr.io/google_containers/hyperkube:v1.0.1 /hyperkube proxy --master=http://127.0.0.1:8080 --v=2
若是你運行了不一樣的Kubernetes集羣,你可能須要指定 -s http://localhost:8080 選項來訪問本地集羣。
kubectl -s http://localhost:8080 run nginx --image=nginx --port=80
運行 docker ps 你應該就能看到nginx在運行。下載鏡像可能須要等待幾分鐘。
kubectl expose rc nginx --port=80
運行如下命令來獲取剛纔建立的service的IP地址。有兩個IP,第一個是內部的
(CLUSTER_IP),第二個是外部的負載均衡IP。
kubectl get svc nginx
一樣你也能夠經過運行如下命令只獲取第一個IP(CLUSTER_IP):
kubectl get svc nginx --template={{.spec.clusterIP}}
經過第一個IP(CLUSTER_IP)訪問服務:
curl <insert-cluster-ip-here>
上面的各類容器都是運行在 kubelet 程序的管理下,它會保證容器一直運行,甚至容器意外退出時也不例外。因此,若是想關閉集羣,你須要首先關閉 kubelet 容器,再關閉其餘。
可使用 docker kill $(docker ps -aq) 。注意這樣會關閉Docker下運行的全部容器,請謹慎使用。
前提條件 你須要3臺或以上安裝有CentOS的機器 啓動一個集羣 Kubernetes包提供了一些服務:kube-apiserver, kube-scheduler, kube-controller-manager,kubelet, kube-proxy。
這些服務經過systemd進行管理,配置信息都集中存放在一個地方:/etc/kubernetes。咱們將會把這些服務運行到不一樣的主機上。
第一臺主機,centosmaster,將是Kubernetes 集羣的master主機。這臺機器上將運行kube-apiserver, kubecontroller-manager和kube-scheduler這幾個服務,此外,master主機上還將運行etcd。
其他的主機,fed-minion,將是從節點,將會運行kubelet, proxy和docker。
單機部署方案 Minikube。
kubectl
啓動k8s集羣:minikube start
命令:
a.啓動:vagrant up
b. 關機:vagrant halt
c. 重啓:vagrant reload
d. 查看運行狀態:vagrant status
e. 銷燬:vagrant destroy
主機名 | 操做系統 | IP地址 |
master | Centos 7.4-x86_64 | 192.168.1.100 |
node1 | Centos 7.4-x86_64 | 192.168.1.102 |
node2 | Centos 7.4-x86_64 | 192.168.1.104 |
臨時關閉swap ,永久關閉直接註釋fstab中swap行
swap off -a
中文文檔:https://www.kubernetes.org.cn
資料:https://idc.wanyunshuju.com/K8S/
Kubernetes提供在線培訓的網站:
https://kubernetes.io/docs/tutorials/online-training/overview/
使用交互式實踐場景(Katacoda)學習Kubernetes
https://www.katacoda.com/courses/kubernetes/
https://learnk8s.io/academy/
國外視頻教程:
https://linuxacademy.com/linux/training/course/name/kubernetes-quick-start
https://www.filepicker.io/api/file/MsezgDBwTFW7uXjEhooI