swarm | kubernetes | k3s | ||
---|---|---|---|---|
背景 | docker公司 | google公司 | rancher公司 | |
部署 | 簡單 | 複雜 | 簡單 | |
最小調度單元 | docker | pod | ||
資源清單 | yml文件格式 | yml文件格式 | ||
控制器 | Service | ReplicationController 和 ReplicaSet Deployment 、DaemonSet、 StateFulSet Job/CronJob、 Horizontal Pod Autoscaling | ||
Services | 無 | ClusterIp、 HeadlessService、 NodePort、 LoadBalancer ExternalName | ||
存儲 | Volume | ConfigMap、 Secret、 volume、 PV/PVC | ||
調度策略 | spread binpack random | |||
灰度發佈 | swarm的灰度發佈是一次梭哈。當執行swarm update操做時,全部舊的docker逐一所有替換成新的版本。若是在替換過程當中我發現新版本存在問題時,我只能強行終止update,而後執行回滾。在這個過程當中對線上的應用會有影響。 | k8s有replication controller的機制,能夠人爲控制灰度發佈的過程。在發佈的過程當中,我可讓k8s經過replication controller起一小部分新版本的pod並減小對應數量老版本的pod,新的pod可響應用戶的請求,若是新的pod比較順利,則慢慢增長新版本的數量而減小老版本數量,直至新版本所有替換老版本,若是新的pod出現了問題,此時讓新pod當即下線,從而不對線上業務形成影響。k8s的發佈過程能夠人爲干預,所以在重大發布時,這種方式其實更優。 | ||
彈性伸縮 | 無 | 彈性伸縮是指根據宿主機硬件資源承載的狀況而作出的一種容器部署架構動態變化的過程。好比某臺宿主機的CPU使用率使用偏高,k8s能夠根據Pod的使用率自動調整一個部署裏面Pod的個數,保障服務可用性 |
一個經過 Docker 鏡像建立的運行實例,一個節點可運行多個容器。容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的命名空間。html
Docker 鏡像是一個模板,是容器應用打包的標準格式,用於建立 Docker 容器。或者說,Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。在部署容器化應用時能夠指定鏡像,鏡像能夠來自於 Docker Hub、華爲雲容器鏡像服務或者用戶的私有 Registry。例如一個 Docker 鏡像能夠包含一個完整的 Ubuntu 操做系統環境,裏面僅安裝了用戶須要的應用程序及其依賴文件。node
鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的「類」 和「實例」 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。mysql
鏡像倉庫用於存放 Docker 鏡像,包括公共鏡像倉庫(如 DockerHub)和私有鏡像倉庫(如 Harbor)。nginx
支持應用程序的容器的部署和組織稱爲容器編排,這是經過容器編排工具完成的。一些流行的開源容器編排工具包括Kubernetes、Docker Swarm和LXC。sql
docker擁抱k8sdocker
集羣指容器運行所須要的雲資源組合,關聯了若干雲服務器節點、負載均衡等雲資源。您能夠理解爲集羣是「同一個子網中一個或多個彈性雲服務器(又稱:節點)」經過相關技術組合而成的計算機羣體,爲容器運行提供了計算資源池。json
也叫「主機」,每個節點對應一臺服務器(能夠是虛擬機實例或者物理服務器),容器應用運行在節點上。節點上運行着 Agent 代理程序(kubelet),用於管理節點上運行的容器實例。集羣中的節點數量能夠伸縮。segmentfault
實例(Pod)是 Kubernetes 部署應用或服務的最小的基本單位。一個 Pod 封裝多個應用容器(也能夠只有一個容器)、存儲資源、一個獨立的網絡 IP 以及管理控制容器運行方式的策略選項。api
工做負載即 Kubernetes 對一組 Pod 的抽象模型,用於描述業務的運行載體,包括 Deployment、Statefulset、Daemonset、Job、CronJob 等多種類型。數組
即 Kubernetes 中的「Deployments」,無狀態工做負載支持彈性伸縮與滾動升級,適用於實例徹底獨立、功能相同的場景,如:nginx等。
即 Kubernetes 中的「StatefulSets」,有狀態工做負載支持實例有序部署和刪除,支持持久化存儲,適用於實例間存在互訪的場景,如 ETCD、mysql-HA 等
命名空間是對一組資源和對象的抽象整合。在同一個集羣內可建立不一樣的命名空間,不一樣命名空間中的數據彼此隔離。使得它們既能夠共享同一個集羣的服務,也可以互不干擾。
例如:能夠將開發環境、測試環境的業務分別放在不一樣的命名空間。
核心部署命令
docker swarm initdocker swarm join-token worker
複製代碼
##k3s server安裝curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \INSTALL_K3S_EXEC="server --docker --node-name=wiki-server --write-kubeconfig-mode=664 " \sh -s - \--datastore-endpoint="mysql://userName:password@tcp(ip:3306)/k3s"##k3s agent安裝curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | \INSTALL_K3S_MIRROR="cn" \K3S_URL="https://server_ip:6443" \K3S_TOKEN="K10455b2e8dc85b1d0592c5407a37071f1d6f44a97911ac::server:1ebcf18daba1e82cfd" \INSTALL_K3S_EXEC="--docker --node-name=qanew-agent" \sh -s -##輸出tokencat /var/lib/rancher/k3s/server/node-token
複製代碼
任務 (Task)是 Swarm 中的最小的調度單位,目前來講就是一個單一的容器。
在pod內的docker共享volume和網絡namespace,彼此之間能夠經過localhost通訊或者標準進程間通訊。
k8s中全部的內容都被抽象爲資源,資源實例化以後,叫作對象。
僅在此名稱空間下生效,k8s的系統組件是默認放在kube-system名稱空間下的,而kubectl get pod等價於kubectl get pod -n default,所以查看不到k8s的系統組件。
工做負載型資源(workload):Pod【k8s最小組成部分,共享網絡棧共享存儲卷】、ReplicaSet【RS,調度器、控制器,經過標籤去控制pod的建立、副本數量】、Deployment【控制器,經過控制RS的建立去建立pod】、StatefulSet【爲有狀態服務所創建的管理器】、DaemonSet【能夠在每個節點都運行一個pod的組件】、Job【工做、任務】、CronJob【輪詢工做、輪詢任務,爲批處理而生的】(ReplicationController在v1.11版本被廢棄)
服務發現及負載均衡型資源(ServiceDiscovery LoadBalance):Service【簡稱svc,服務,將服務暴露出去】、Ingress【將服務暴露出去】、...
配置與存儲型資源:Volume(存儲卷)【給pod提供持久化的能力】、CSI(容器存儲接口,能夠擴展各類各樣的第三方存儲卷)
特殊類型的存儲卷:ConfigMap(當配置中心來使用的資源類型)【通常用來存儲配置文件達到熱更新的狀態】、Secret(保存敏感數據)【加密方案存儲數據,通常用來保存密碼文件、密鑰等等】、DownwardAPI(把外部環境中的信息輸出給容器)【相似於CSI,】
無論在任何名稱空間下定義,在其餘的名稱空間下都能看獲得,在定義的時候無需指定名稱空間
例如:Namespace【名稱空間】、Node【節點】、Role【角色】、ClusterRole、RoleBinding、ClusterRoleBinding
提供一個指標,不像是名稱空間類型又不像集羣級別,本質上更像是在二者之間,可是它有本身的特色,因此更應該做爲一個單獨的分類,例如HPA【經過cpu的利用率進行平滑擴展】就是一個很明顯的元數據類型,經過指標進行操做。
根據一些指標去進行對應的操做
例如:HPA、PodTemplate【pod模板】、LimitRange【資源限制】
k8s通常都是經過定義資源清單的方式去建立資源
資源清單等價於劇本,寫好了每一步應該如何去作
在k8s中,通常使用yaml格式的文件來建立符合咱們預期指望的資源,這樣的yaml文件咱們通常稱爲資源清單
必須存在的屬性【建立資源清單的時候沒有這些屬性的存在它是不容許被執行的】
參數名稱 | 字段類型 | 說明 |
---|---|---|
version | String | 這裏是指的是K8SAPI的版本,目前基本上是v1,能夠用kubectlapi-version命令查詢 |
kind | String | 這裏指的是yam文件定義的資源類型和角色,好比:Pod |
metadata | Object | 元數據對象,固定值就寫metadata |
metadata.name | String | 元數據對象的名字,這裏由咱們編寫,好比命名Pod的名字 |
metadata.namespace | String | 元數據對象的命名空間,由咱們自身定義,若是不定義的話則默認是default名稱空間 |
Spec | Object | 詳細定義對象,固定值就寫Spec |
spec.containers[] | List | 這裏是Spec對象的容器列表定義,是個列表 |
spec.containers[].name | String | 這裏定義容器的名字 |
spec.containers[].image | String | 這裏定義要用到的鏡像名稱 |
主要屬性【這些屬性比較重要,若是不指定的話系統會自動補充默認值】
參數名稱 | 字段類型 | 說明 |
---|---|---|
spec.containers[].name | String | 這裏定義容器的名字 |
spec.containers[].image | String | 這裏定義要用到的鏡像名稱 |
spec.containers[].imagePullPolicy | String | 定義鏡像拉取策略,有Always、Never、IfNotPresent三個值可選(1)Always:意思是每次都嘗試從新拉取鏡像(2)Never:表示僅使用本地鏡像(3)lfNotPresent:若是本地有鏡像就使用本地鏡像,沒有就拉取在線鏡像。上面三個值都沒設置的話,默認是Always。 |
spec.containers[].command[] | List | 指定容器啓動命令,由於是數組能夠指定多個,不指定則使用鏡像打包時使用的啓動命令。 |
spec.containers[].args[] | List | 指定容器啓動命令參數,由於是數組能夠指定多個。 |
spec.containers[].workingDir | String | 指定容器的工做目錄,進入容器時默認所在的目錄 |
spec.containers[].volumeMounts[] | List | 指定容器內部的存儲卷配置 |
spec.containers[].volumeMounts[].name | String | 指定能夠被容器掛載的存儲卷的名稱 |
spec.containers[].volumeMounts[].mountPath | String | 指定能夠被容器掛載的存儲卷的路徑 |
spec.containers[].volumeMounts[].readOnly | String | 設置存儲卷路經的讀寫模式,true或者false,默認爲讀寫模式 |
spec.containers[].ports[] | List | 指定容器須要用到的端口列表 |
spec.containers[].ports[].name | String | 指定端口名稱 |
spec.containers[].ports[].containerPort | String | 指定容器須要監聽的端口號 |
spec.containers[].ports[].hostPort | String | 指定容器所在主機須要監聽的端口號,默認跟上面containerPort相同,注意設置了hostPort同一臺主機沒法啓動該容器的相同副本(由於主機的端口號不能相同,這樣會衝突) |
spec.containers[].ports[].protocol | String | 指定端口協議,支持TCP和UDP,默認值爲 TCP |
spec.containers[].env[] | List | 指定容器運行前需設置的環境變量列表 |
spec.containers[].env[].name | String | 指定環境變量名稱 |
spec.containers[].env[].value | String | 指定環境變量值 |
spec.containers[].resources | Object | 指定資源限制和資源請求的值(這裏開始就是設置容器的資源上限) |
spec.containers[].resources.limits | Object | 指定設置容器運行時資源的運行上限 |
spec.containers[].resources.limits.cpu | String | 指定CPU的限制,單位爲core數,將用於docker run --cpu-shares參數這裏前面文章 Pod資源限制有講過) |
spec.containers[].resources.limits.memory | String | 指定MEM內存的限制,單位爲MlB、GiB |
spec.containers[].resources.requests | Object | 指定容器啓動和調度時的限制設置 |
spec.containers[].resources.requests.cpu | String | CPU請求,單位爲core數,容器啓動時初始化可用數量 |
spec.containers[].resources.requests.memory | String | 內存請求,單位爲MIB、GiB,容器啓動的初始化可用數量 |
額外的參數項
參數名稱 | 字段類型 | 說明 |
---|---|---|
spec.restartPolicy | String | 定義Pod的重啓策略,可選值爲Always、OnFailure,默認值爲Always。1.Always:Pod一旦終止運行,則不管容器是如何終止的,kubelet服務都將重啓它。2.OnFailure:只有Pod以非零退出碼終止時,kubelet纔會重啓該容器。若是容器正常結束(退出碼爲0),則kubelet將不會重啓它。3.Never:Pod終止後,kubelet將退出碼報告給Master,不會重啓該Pod。 |
spec.nodeSelector | Object | 定義Node的Label過濾標籤,以key:value格式指定,選擇node節點去運行 |
spec.imagePullSecrets | Object | 定義pull鏡像時使用secret名稱,以name:secretkey格式指定 |
spec.hostNetwork | Boolean | 定義是否使用主機網絡模式,默認值爲false。設置true表示使用宿主機網絡,不使用docker網橋,同時設置了true將沒法在同一臺宿主機上啓動第二個副本。 |
查看資源有那些資源清單屬性,使用如下命令
kubectl explain pod
複製代碼
查看屬性說明,使用如下命令
kubectl explain pod.apiVersion
複製代碼
ImagePullPolicy
支持三種ImagePullPolicy
Always:無論鏡像是否存在都會進行一次拉取。
Never:無論鏡像是否存在都不會進行拉取
IfNotPresent:只有鏡像不存在時,纔會進行鏡像拉取。
注意:
默認爲IfNotPresent,但:latest標籤的鏡像默認爲Always。
拉取鏡像時docker會進行校驗,若是鏡像中的MD5碼沒有變,則不會拉取鏡像數據。
生產環境中應該儘可能避免使用:latest標籤,而開發環境中能夠藉助:latest標籤自動拉取最新的鏡像。
RestartPoliy
支持三種RestartPolicy
Always:只要退出就重啓
OnFailure:失敗退出(exit code不等於0)時重啓
Never:只要退出就再也不重啓
注意,這裏的重啓是指在Pod所在Node上面本地重啓,並不會調度到其餘Node上去。
apiVersion: group/apiversion #若是沒有給定group名稱,那麼默認爲core,可使用kubectlapi-versions命令獲取當前k8s版本上全部的apiversion版本信息(每一個版本可能不一樣)kind: #資源類別metadata: #資源元數據 name: namespace: lables: annotations: #主要目的是方便用戶閱讀查找spec: #指望的狀態(disired state)status: #當前狀態,本字段由Kubernetes自身維護,用戶不能去定義
1.獲取apiVersion版本信息
kubectl api-versions
複製代碼
2.獲取資源的apiVersion的版本信息(以pod爲例),該命令同時輸出屬性設置幫助文檔
kubectl explain pod
複製代碼
3.字段配置格式
apiVersion <string> #表示字符串類型 metadata <Object> #表示須要嵌套多層字段 1abels <map[string]string> #表示由k:v組成的映射 finalizers <[]string> #表示字串列表 ownerReferences <[]Object>#表示對象列表 hostPID <boolean> #布爾類型 priority <integer> #整型 name <string> -required- #若是類型後面接-required-,表示爲必填字段
複製代碼
apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default 1abels: app:myapp spec: containers: - name: myapp-1 image: hub.coreqi.cn/1ibrary/myapp:v1 - name: busybox-1 image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600"
複製代碼
經過yaml文件建立pod
kubectl create -f xxx.yaml
獲取資源的資源配置文件
#使用 -o 參數 加 yaml,能夠將資源的配置以yaml的格式輸出出來,也可使用json,輸出爲json格式
滾動更新kubectl set image deployment/myapp-deployment myapp-container=index-demo:2.0回滾kubectl rollout undo deployment/myapp-deployment查看回滾狀態kubectl rollout status deployment/myapp-deployment擴容kubectl scale deployment myapp-deployment --replicas=2
複製代碼