K8s容器編排


K8s容器編排

Kubernetes(k8s)具有完備的集群管理能力:

    1. 包括多層次的安全防護和准入機制
    2. 多租戶應用支撐能力
    3. 透明的服務注冊和服務發現機制
    4. 內建智能負載均衡器
    5. 強大的故障發現和自我修復能力
    6. 服務滾動升級和在線擴容能力
    7. 可擴展的資源自動調度機制
    8. 以及多粒度的資源管理能力

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=&quot;127.0.0.1&quot; --address=&quot;0.0.0.0&quot; --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


免責聲明!

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



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