自動化集成:Kubernetes容器引擎詳解
- 2022 年 1 月 6 日
- 筆記
- docker, Kubernetes, linux, Linux 系統.運維
前言:該系列文章,圍繞持續集成:Jenkins+Docker+K8S相關組件,實現自動化管理源碼編譯、打包、鏡像構建、部署等操作;本篇文章主要描述Kubernetes引擎用法。
一、基礎簡介
Kubernetes簡稱K8S,是一個開源的分散式的容器編排引擎,用來對容器化應用進行自動化部署和管理。
Control-Plane-Components:控制平面組件,對集群做出全局決策,例如:調度、檢測和事件響應,可以在集群中的任何節點上運行;
- api:作為K8S控制面的組件,開放K8S的API,相當於控制面的前端;
- etcd:兼具一致性和高可用性的鍵值資料庫,作為保存K8S數據的後台庫;
- scheduler:監聽新建未指定運行節點的Pods,並為Pod選擇運行節點;
- controllermanager:運行控制器進程,邏輯上是一個單獨的進程;
Node:節點組件:每個節點上運行,維護運行的Pod並提供Kubernetes運行環境;
- kubelet:在每個節點上運行的代理,保證容器都運行在Pod中;
- kube-proxy:每個節點上運行的網路代理, 維護節點上的網路規則;
Container-Runtime:容器運行時,負責運行容器的軟體,支援Docker、containerd、CRI-O等多個容器運行環境,以及任何實現Kubernetes-CRI容器運行環境介面。
二、環境配置
1、服務搭建
使用Git拉取k8s-docker-desktop-for-mac
倉庫,執行load_images.sh
腳本,會拉取本地docker對應的k8s版本,注意這裡要等到腳本流程執行完畢,可能因為Git連接的問題,耗時較長,下面是腳本拉取的鏡像:
docker images
REPOSITORY TAG
docker/desktop-kubernetes kubernetes-v1.21.5-cni-v0.8.5-critools-v1.17.0-debian
k8s.gcr.io/kube-apiserver v1.21.5
k8s.gcr.io/kube-proxy v1.21.5
k8s.gcr.io/kube-controller-manager v1.21.5
k8s.gcr.io/kube-scheduler v1.21.5
docker/desktop-vpnkit-controller v2.0
docker/desktop-storage-provisioner v2.0
k8s.gcr.io/pause 3.4.1
k8s.gcr.io/coredns/coredns v1.8.0
k8s.gcr.io/etcd 3.4.13-0
上述鏡像下載完成後,通過docker桌面軟體啟動k8s即可,這裡啟動時間相對偏長,啟動成功之後介面左下角K8S顯示綠色狀態:
2、環境查看
# 查看版本:kubectl version
Client Version GitVersion:v1.21.5
Server Version GitVersion:v1.21.5
# 查看集群:kubectl cluster-info
Kubernetes control plane is running at local-host:6443
# 查看節點:kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker-desktop Ready control-plane,master 23h v1.21.5
三、部署Docker鏡像
1、核心組件
在執行Docker鏡像部署之前,首先要理解該流程中幾個核心的概念:
- Pod:是可以在Kubernetes中創建和管理的、最小的可部署的計算單元;就Docker概念的術語而言,Pod類似於共享命名空間和文件系統卷的一組Docker容器;
- ReplicaSet:目的是維護一組在任何時候都處於運行狀態的Pod副本的穩定集合;通常用來保證一定數量的、完全相同的Pod的可用性;
- Deployment:為Pods和ReplicaSets提供聲明式的更新能力,可以定義Deployment以創建新的ReplicaSet,或刪除現有Deployment;
- Service:抽象的方式將運行在一組Pods上的應用程式公開為網路服務,在K8S中邏輯上Pods集合與訪問策略,這種模式被稱為微服務;
2、腳本文件
這裡將Deployment與Service放在一個.yaml
文件中;鏡像載入設置imagePullPolicy:Never
即本地讀取;其中服務發現採用的是NodePort
類型,並沒有設置具體埠,控制平面會在默認範圍內分配一個埠號;
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloud-app-deployment
labels:
app: cloud-app
spec:
selector:
matchLabels:
app: cloud-app
template:
metadata:
labels:
app: cloud-app
spec:
containers:
- name: cloud-app
image: Cloud_Url/cicada-image/cloud-app
imagePullPolicy: Never
ports:
- containerPort: 8079
---
apiVersion: v1
kind: Service
metadata:
name: cloud-app-service
labels:
app: cloud-app
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8079
selector:
app: cloud-app
3、資源管理
創建資源
kubectl create -f pod.yaml
查看資源
# 1、查看Pod資訊
kubectl get pods -o wide
# 2、查看Service資訊
kubectl get svc -o wide
# 3、查看Node資訊
kubectl get nodes -o wide
也可以在K8S的Web控制台上,查看資源的可視化介面,下面截圖幾個腳本中明確聲明的資源資訊:
刪除資源
# 1、通過文件刪除
kubectl delete -f pod.yaml
# 2、通過具體資源名刪除
kubectl delete pod cloud-app
4、訪問資源
# 查看服務的詳細描述
kubectl describe svc cloud-app-service
Name: cloud-app-service
NodePort: <unset> 30930/TCP
Endpoints: Pod_IP:Pod_埠
這裡NodePort
埠默認分配30930
,當外部訪問流量到達Service時,會路由到指定Endpoints
(端點),通過上面的資源查看可知,這裡Endpoints即Pod的IP與埠;
通過:本機IP:分配埠/API
方式,即localhost:30930/client
訪問到docker容器中應用,也可以在Web介面的Pod模組查看具體的日誌輸出:
四、控制台組件
Dashboard是基於Web的Kubernetes用戶介面,可以使用Dashboard將容器應用部署到Kubernetes集群中,也可以對容器應用排錯,還能管理集群資源,查看日誌等。
1、創建命名空間
kubectl create namespace cm-dev
查看命名空間
2、查看Pod
3、查看Deployment
4、查看Service
同系列推薦:
五、源程式碼地址
GitEE·地址
//gitee.com/cicadasmile/butte-auto-parent
Wiki·地址
//gitee.com/cicadasmile/butte-java-note