K8s容器編排
Kubernetes(k8s)具有完備的集群管理能力:
- 包括多層次的安全防護和准入機制
- 多租戶應用支撐能力
- 透明的服務注冊和服務發現機制
- 內建智能負載均衡器
- 強大的故障發現和自我修復能力
- 服務滾動升級和在線擴容能力
- 可擴展的資源自動調度機制
- 以及多粒度的資源管理能力
Pod是在K8s集群中運行部署應用或服務的最小單元,它是可以支持多容器的。Pod的設計理念是支持多個容器在一個Pod中共享網絡地址和文件系統,可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。Pod對多容器的支持是K8s最基礎的設計理念。Pod是K8s集群中所有業務類型的基礎,可以看作運行在K8s集群中的小機器人,不同類型的業務就需要不同類型的小機器人去執行。
在K8s中,所有的容器均在Pod中運行,一個Pod可以承載一個或者多個相關的容器,同一個Pod中的容器會部署在同一個物理機器上並且能夠共享資源。
一個Pod也可以包含0個或者多個數據卷組(volumes),這些卷組將會以目錄的形式提供給一個容器,或者被所有Pod中的容器共享,對於用戶創建的每個Pod,系統會自動選擇那個健康並且有足夠容量的機器,然后創建類似容器的容器,當容器創建失敗的時候,容器會被node agent自動的重啟,這個node agent 叫 kubelet,但是,如果是Pod失敗或者機器它不會自動的轉移並且啟動,除非用戶定義了 replication controller。
用戶可以自己創建並管理Pod。K8s將這些操作簡化為兩個操作:可以基於相同的Pod配置文件部署多個Pod復制品;
創建可替代的Pod,當一個Pod掛了或者機器掛了的時候。而K8s API中負責來重新啟動,遷移等行為的部分叫做“replication controller”,它根據一個模板生成了一個Pod,然后系統就根據用戶的需求創建了許多冗余,這些冗余的Pod組成了一個整個應用或者服務或者服務中的一組。
一旦一個Pod被創建,系統就會不停的監控Pod的健康情況以及Pod所在主機的健康情況,如果這個Pod因為軟件原因掛掉了或者所在的機器掛掉了,replication controller 會自動在一個健康的機器上創建一個一摸一樣的Pod,來維持原來的Pod冗余狀態數量不變,一個應用的多個Pod可以共享一個機器。
Kubernetes直接管理Pod而不是容器:
一個pod可以是一個容器,也可以是多個容器,例如你運行一個服務項目,其中需要使用nginx、mysql、tomcat,可以將這三個應用在同一個pod中,對他們提供統一的調配能力。
一個pod只能運行在一個主機上,而一個主機上可以有多個pod。
1、復制控制器(Replication Controller,RC)
RC是K8s集群中保證Pod高可用的API對象。通過監控運行中的Pod來保證集群中運行指定數目的Pod副本。
指定的數目可以是多個也可以是1個;少於指定數目,RC就會啟動運行新的Pod副本;多於指定數目,RC就會殺死多余的Pod副本。
即使在指定數目為1的情況下,通過RC運行Pod也比直接運行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有1個Pod在運行。
RC只適用於長期伺服型的業務類型,比如控制小機器人提供高可用的Web服務。
2、副本集(Replica Set,RS)
RS是新一代RC,提供同樣的高可用能力,區別主要在於RS后來居上,能支持更多種類的匹配模式。副本集對象一般不單獨使用,而是作為Deployment的理想狀態參數使用。
3、部署(Deployment)
部署表示用戶對K8s集群的一次更新操作。
部署是一個比RS應用模式更廣的API對象,可以是創建一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。
4、服務(Service)
RC、RS和 Deployment只是保證了支撐服務的微服務Pod的數量,但是沒有解決如何訪問這些服務的問題。 一個Pod只是一個運行服務的實例,隨時可能在一個節點上掛掉,在另一個節點以一個新的IP啟動一個新的Pod,因此不能以固定的IP和端口號對外提供服務。
要穩定地提供服務需要服務發現和負載均衡能力。每個Service會對應一個集群內部有效的虛擬VIP,集群內部通過VIP訪問一個服務。
在K8s集群中微服務的負載均衡是由Kube-proxy負載均衡器來實現的。它是一個分布式代理服務器,在K8s的每個節點上都有一個。
5、名稱空間(Namespace)
名稱空間為K8s集群提供虛擬的隔離作用,K8s集群初始有兩個名稱空間:默認名稱空間 default、系統名稱空間 kube-system。
除此以外,管理員可以創建新的名稱空間滿足需要。
6、存儲卷(Volume)
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上部署您的第一個應用程序
使用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
您可以使用這些命令查看應用程序的部署時間,當前狀態,運行位置以及配置。
如何對外暴露我們的應用(通過service服務)
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本地服務器方案、托管方案、全套雲端方案、定制方案
如果你只是想試一試Kubernetes,我們推薦基於Docker的本地方案。
基於Docker的本地方案是眾多能夠完成快速搭建的本地集群方案中的一種,但是局限於單台機器。
Vagrant 是一款用來構建虛擬開發環境的工具,非常適合 php/python/ruby/java 這類語言開發 web 應用,“代碼在我機子上運行沒有問題”這種說辭將成為歷史。
我們可以通過 Vagrant 封裝一個 Linux 的開發環境,分發給團隊成員。成員可以在自己喜歡的桌面系統(Mac/Windows/Linux)上開發程序,代碼卻能統一在封裝好的環境里運行,非常霸氣。
Vagrant的安裝
本文教程的虛擬機是基於VirtualBox的(VMWare也可以,但是需要破解),下面來介紹安裝VirtualBox和Vagrant的安裝。
1、VirtualBox的安裝
下載地址:https://www.virtualbox.org/wiki/Downloads
歷史版本:https://www.virtualbox.org/wiki/Download_Old_Builds_4_3_pre24
2、Vagrant的安裝
https://www.vagrantup.com/downloads.html
3. centos7.box:
http://cloud.centos.org/centos/7/vagrant/x86_64/images/
3、版本兼容性
VirtualBox:自版本4.3.12后啟動虛擬機會存在各種問題,因此建議安裝4.3.12版本。
Vagrant:從1.0.x可以直接升級到1.x版本,Vagrant向后兼容Vagrant1.0.x,但是1.1+版本不在支持1.0.x版本的插件,因此插件也要做相應升級。
4、其他安裝建議
建議安裝好之后將VirtualBox的虛擬機位置設置到其他盤,否則占用默認C盤空間較大,已安裝的虛擬機需要移動到新的目錄下,具體設置辦法請見下圖:
Vagrant啟動
簡單來說,使用以下兩條命令就可以啟動一個Vagrant環境了:
$ vagrant init hashicorp/precise32 $ vagrant up
通過上面兩個命令,就可以在VirtualBox中啟動並運行Ubuntu 12.04 LTS 32-bit了,可以使用命令vagrant ssh
登錄到這台虛擬機上,當完成一切操作之后,可以使用vagrant destroy
命令來銷毀它。
下面我們分步驟來介紹怎么配置並且啟動一個基於VirtualBox虛擬機的Vagrant環境:
1、建立工程(Project)
開始任何一個項目需要一個名為Vagrantfile的文件來配置Vagrant,這個文件的作用有一下兩個:
- 標識Vagrant項目的根目錄,后續的大部分Vagrant配置都與此目錄有關。
- 描述工程啟動所需的虛擬機類型和資源,以及需要安裝的軟件和你的訪問方式。
可以使用命令vagrant init
來初始化項目目錄,可以按照以下步驟操作
$ mkdir vagrant_project $ cd vagrant_project $ vagrant init
這樣在當前目錄下就會生成名為Vagrantfile的文件,當然也可以在已有的工程目錄下執行vagrant init
命令來初始化生成這個文件。
2、添加虛擬機(Boxes)
可以使用命令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在運行。下載鏡像可能需要等待幾分鍾。
暴露為service
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下運行的所有容器,請謹慎使用。
CentOS部署Kubernetes集群
前提條件 你需要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
搭建集群的Kubeadm、kops、play with k8s
環境規划
主機名 | 操作系統 | 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