k8s docker總結特殊點
- 前言
- 一、docker 的驅動。
- 1、cgroup:(Control Groups)
- 2、日志驅動(log driver)
- 3、存儲驅動
- 4、網絡驅動:
- 二、k8s中網絡插件(常用calico,次flannel)
- **Flannel:**
- **Calico:**
- **Weave:**
- **Cilium:**
- **Antrea:**
- 三、Dockerfile中極個別字段作用、區別
- ADD、COPY
- CMD 、RUN、ENTRYPOINT
- 四、k8s中pv回收策略的異同點
- Retain:
- Recycle:
- Delete:
- 異同點:
- 手動處理 vs. 自動處理:
- 數據處理方式:
- 數據安全性:
- 適用場景:
- 五、k8s如何管控一個有狀態集從開始創建到卷掛載綁定再到svc,最后到容器正常運行
- 用戶創建 StatefulSet 對象:
- kube-controller-manager 創建 StatefulSet 控制器:
- kube-scheduler 調度 Pod:
- 創建 PersistentVolumeClaim(PVC):
- Pod 啟動及 Volume 掛載:
- 創建 Headless Service:
前言
多點docker、k8s了解與某些參數配置的異同點,出現問題便于排查,有助于學習。
一、docker 的驅動。
看一個/etc/docker/daemon.json
顯而易見的driver有cgroupdriver、log-driver
優先看他倆:
1、cgroup:(Control Groups)
查看本地所使用的
docker info | grep "Cgroup Driver"
概念: cgroup 是 Linux 內核提供的一種機制,用于限制、賬戶和隔離進程組。目前使用最多的systemd,次cgroupfs。其他作為了解
錯誤:最常見的是當你k8s某些服務器資源重啟后加入不了集群時,一看報錯驅動問題
cgroupfs: cgroupfs 是 Docker 最早支持的 cgroup 驅動,它使用 cgroup 文件系統進行資源管理和隔離。這是 Docker 1.13 之前版本的默認 cgroup 驅動。
systemd: systemd 是 Linux 上的一個系統和服務管理器,也是一種 cgroup 驅動。Docker 可以通過配置使用 systemd 作為 cgroup 驅動,這種方式通常與運行 systemd 的系統集成得更好。
unified(Unified Control Group): 統一的 cgroup 驅動是 Linux 4.5 及以上內核引入的,它將 cgroup v1 和 cgroup v2 合并為一個單一的層次結構。Docker 從版本 20.10 開始默認使用 unified cgroup 驅動。這種驅動對 cgroup v2 的支持更為完整,但仍然保留對 cgroup v1 的兼容性。
{"data-root": "/var/lib/docker","exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"], "insecure-registries": ["127.0.0.1/8","k8s.harbor.com"],"max-concurrent-downloads": 10,"live-restore": true,"log-driver": "json-file","log-level": "warn","log-opts": {"max-size": "50m","max-file": "1"},"storage-driver": "overlay2"
}
2、日志驅動(log driver)
**概念:**用于處理和存儲容器的日志。以下是一些常見的 Docker 日志驅動:最常用的json-file、syslog。其他作為了解
錯誤:當某些開源軟件部署方面遇到syslog錯誤時,那可能就是你開源軟件自定義了log驅動與你本地docker環境log驅動不匹配導致。
json-file: 默認的日志驅動,將容器的標準輸出和標準錯誤輸出保存到 JSON 格式的文件中。可以使用 docker logs 命令查看容器的日志。
syslog: 將容器日志發送到 syslog(系統日志)中,使其可由宿主機上的 syslog 守護程序處理。這對于集中管理日志非常有用。
journald: 將容器日志發送到 systemd-journald,適用于運行 systemd 的系統。可以使用 journalctl 命令查看容器的日志。
fluentd: 使用 Fluentd 進行日志收集。Fluentd 是一款開源的日志收集工具,支持靈活的日志傳輸和處理。
gelf: 將容器日志發送到 Graylog Extended Log Format(GELF)兼容的日志收集器。GELF 是一種結構化的日志格式,適用于分布式日志系統。
awslogs: 將容器日志發送到 Amazon CloudWatch Logs,適用于在 AWS 上運行的容器。
etwlogs: 僅適用于 Windows 容器,將容器日志發送到 Windows Event Tracing for Windows (ETW)。
splunk: 將容器日志發送到 Splunk,適用于使用 Splunk 進行日志分析的環境。
logentries: 將容器日志發送到 Logentries,適用于集中管理和分析日志。
可以通過在運行容器時使用 --log-driver 選項來指定日志驅動。例如:
docker run --log-driver=json-file my-container
要查看系統上可用的日志驅動,可以運行以下命令:
docker info | grep "Logging Driver"
3、存儲驅動
概念:
存儲驅動負責實現鏡像和容器存儲的組件。基本選用默認overlay2。其他作為了解
overlay2: overlay2 是 Docker 默認的存儲驅動,適用于大多數 Linux 發行版。它提供了高性能的聯合文件系統,支持鏡像分層和容器存儲。
aufs: aufs(Advanced Multi-Layered Unification Filesystem)是一個老化的存儲驅動,已被 overlay2 取代。aufs 適用于較早版本的 Docker,但在新的內核版本中可能不再受支持。
overlay: overlay 是 overlay2 的前身,也是一個聯合文件系統,但相對于 overlay2,它在性能和功能上有一些限制。
btrfs: btrfs 是一種先進的文件系統,Docker 可以使用它作為存儲驅動。btrfs 支持快照、復制等高級功能。
devicemapper: devicemapper 是一種基于設備映射技術的存儲驅動。它提供了塊設備的級別的存儲,支持快照和寫時復制。
vfs(Virtual File System): vfs 是一種簡單的存儲驅動,適用于測試和開發環境。它是 Docker 最基本的存儲驅動,性能較差,不建議在生產環境中使用。
要查看當前 Docker 實例正在使用的存儲驅動,可以運行以下命令:
docker info | grep "Storage Driver"
4、網絡驅動:
概念: 允許用戶根據應用程序的需求選擇合適的網絡模式。
bridge: bridge 是 Docker 默認的網絡驅動,用于創建容器默認的橋接網絡。每個容器都連接到這個默認的橋接網絡,可以通過容器名稱或 IP 地址直接相互通信。
docker run --network bridge my-container
host: host 網絡模式允許容器共享主機的網絡命名空間,即與主機相同的網絡。這樣容器可以直接使用主機的網絡配置,適用于性能敏感的場景。
docker run --network host my-container
none: none 網絡模式會禁用容器的網絡棧,使其無法訪問網絡。適用于特定安全場景或僅需要本地 IPC 通信的容器。
docker run --network none my-container
overlay: overlay 網絡模式用于創建多主機之間的覆蓋網絡。適用于跨多個主機的容器通信,通常與 Docker Swarm 結合使用。
docker run --network overlay my-container
macvlan: macvlan 允許容器直接映射到物理網絡,每個容器都有唯一的 MAC 地址。適用于需要容器直接暴露到物理網絡的場景。
docker run --network macvlan my-container
ipvlan: ipvlan 類似于 macvlan,但允許多個容器共享相同的 MAC 地址。適用于需要在物理網絡上分配 IP 地址的場景。
docker run --network ipvlan my-container
bridge、host、none 的自定義橋接網絡: 可以使用 bridge、host 或 none 模式創建自定義橋接網絡,通過 docker network create 命令。
docker network create my-bridge-network
docker run --network my-bridge-network my-container
二、k8s中網絡插件(常用calico,次flannel)
**網絡插件:**用于配置容器間的通信和網絡策略。這些網絡插件負責實現 Kubernetes 群集中 Pod 之間的網絡通信。
Flannel:
特點: Flannel 是一個簡單且易于部署的網絡插件,使用基于層級的虛擬網絡(Overlay Network)實現容器間的通信。
工作原理: 使用 VXLAN 或 UDP 封裝技術在不同節點上創建虛擬網絡,允許 Pod 通過該虛擬網絡進行通信。
適用場景: 適用于需要快速部署和簡單網絡配置的場景。
Calico:
特點: Calico 是一個開源的網絡插件,提供了強大的網絡策略和安全性功能。它支持 BGP 協議用于路由。
工作原理: 使用路由表來處理容器之間的通信,支持網絡隔離和安全策略。
適用場景: 適用于需要強大網絡策略和安全性的場景,特別是多租戶環境。
Weave:
特點: Weave 是一個輕量級的網絡插件,支持容器的動態發現和路由。它通過 DNS 提供服務發現功能。
工作原理: 使用虛擬網絡技術,包括 Overlay Network 和路由。
適用場景: 適用于需要輕量級網絡插件和服務發現的場景。
Cilium:
特點: Cilium 是一個強大的網絡和安全插件,支持容器的負載均衡、網絡隔離和安全策略。
工作原理: 使用 eBPF(Extended Berkeley Packet Filter)技術,允許對網絡數據包進行高級的處理。
適用場景: 適用于需要強大網絡功能和安全性的場景,尤其是具有復雜網絡需求的環境。
Antrea:
特點: Antrea 是一個基于 Open vSwitch(OVS)的網絡插件,提供網絡策略和安全性功能。
工作原理: 使用 OVS 技術來處理容器之間的通信,并支持網絡策略。
適用場景: 適用于需要基于 OVS 的網絡插件的場景。
三、Dockerfile中極個別字段作用、區別
ADD、COPY
COPY: 用于將本地文件或目錄復制到容器中。它是比較基礎的文件復制指令,不做任何解壓或處理。
COPY <src> <dest>
ADD: 類似于 COPY,但具有一些額外的功能,如自動解壓縮 tar 文件和從 URL 復制文件。由于 ADD 具有更多功能,建議在不需要這些額外功能時使用 COPY。
ADD <src> <dest>
CMD 、RUN、ENTRYPOINT
RUN: 用于在構建時執行命令,通常用于安裝軟件包、更新系統等。每個 RUN 指令都會在新的鏡像層中執行,并在構建期間對鏡像進行修改。
RUN apt-get update && apt-get install -y nginx
CMD: 用于定義容器啟動時執行的默認命令。它可以在 Dockerfile 中出現多次,但只有最后一次有效。如果用戶在啟動容器時提供了命令,則會覆蓋 CMD。
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT: 用于配置容器啟動時執行的默認命令,并且這個命令不會被覆蓋。如果用戶在啟動容器時提供了命令,則會被附加到 ENTRYPOINT 后面。ENTRYPOINT 經常與 CMD 結合使用,以提供默認參數。
ENTRYPOINT ["nginx", "-g", "daemon off;"]
四、k8s中pv回收策略的異同點
Retain:
特點: PV 的數據在釋放后不會被刪除,而是保留在存儲中。管理員需要手動處理這些資源。
適用場景: 適用于需要手動處理 PV 數據回收的場景,例如希望保留數據以便進一步分析的情況。
Recycle:
特點: PV 的數據在釋放后會被刪除,但不同于 Delete 策略,它會嘗試簡單地清除數據,而不是進行安全擦除。
適用場景: 適用于不需要進行安全擦除、可以簡單清除數據的場景。
Delete:
特點: PV 的數據在釋放后會被刪除,同時 Kubernetes 會嘗試使用 Volume 插件進行安全擦除。
適用場景: 適用于需要安全擦除數據的場景,以確保數據不被不相關的用戶訪問。
異同點:
手動處理 vs. 自動處理:
Retain: 需要管理員手動處理 PV 中的數據,確保數據的安全存儲或進一步使用。
Recycle 和 Delete: Kubernetes 會自動處理 PV 中的數據,但它們的處理方式不同。
數據處理方式:
Recycle: 簡單地清除 PV 中的數據,不進行安全擦除。
Delete: 嘗試使用 Volume 插件進行安全擦除,以確保數據不被不相關的用戶訪問。
數據安全性:
Retain 和 Delete: 提供更高水平的數據安全性,特別是在涉及敏感數據時。
Recycle: 提供較低水平的數據安全性,因為它不執行安全擦除。
適用場景:
Retain: 適用于需要手動處理數據的場景,如進一步分析或備份。
Recycle: 適用于不需要安全擦除、可以簡單清除數據的場景。
Delete: 適用于需要安全擦除數據的場景,以確保數據不被不相關的用
五、k8s如何管控一個有狀態集從開始創建到卷掛載綁定再到svc,最后到容器正常運行
在 Kubernetes 中,有狀態服務集(StatefulSet)的創建和管理涉及多個組件的協同工作。以下是從創建開始到 StatefulSet 中的 Pod 正常運行的主要過程:
用戶創建 StatefulSet 對象:
用戶通過定義 StatefulSet 對象來描述有狀態服務集的規模、模板和其他配置。StatefulSet 中包含有關每個 Pod 的模板以及 PVC 模板。
kube-apiserver 接收 StatefulSet 配置:
用戶提交 StatefulSet 配置時,kube-apiserver 接收并驗證配置信息,然后將其保存到 etcd 中。這將觸發后續的控制器和調度過程。
kube-controller-manager 創建 StatefulSet 控制器:
kube-controller-manager 中包含 StatefulSet 控制器,該控制器監視 etcd 中的 StatefulSet 配置。
控制器檢測到 StatefulSet 的創建后,根據規模信息開始創建 Pod。
kube-scheduler 調度 Pod:
kube-scheduler 負責將新創建的 Pod 分配到集群中的節點上。對于有狀態服務,調度時需要考慮 Pod 的唯一性、親和性和反親和性規則。
每個 Pod 根據 StatefulSet 中定義的模板和 PVC 模板進行創建。
創建 PersistentVolumeClaim(PVC):
StatefulSet 中的每個 Pod 都有一個對應的 PersistentVolumeClaim(PVC)。PVC 描述了 Pod 對存儲的需求。PVC 根據模板創建,并綁定到可用的 PersistentVolume(PV)上。
Pod 啟動及 Volume 掛載:
kubelet 接收到 Pod 的配置信息后,在節點上創建容器,并根據 PVC 中定義的 Volume 掛載到指定的路徑。這使應用程序可以使用這個持久化存儲。
創建 Headless Service:
StatefulSet 通常與 Headless Service 結合使用。這個服務的 Cluster IP 為 None,每個 Pod 都有唯一的 DNS 記錄,例如 web-0.service-name.namespace.svc.cluster.local。
Headless Service 為有狀態服務提供唯一的網絡標識符,確保每個 Pod 具有獨特的 DNS 記錄。
Pod 正常運行:
控制器負責監控 StatefulSet 中的 Pod,并確保它們按照定義正常運行。每個 Pod 具有唯一的標識符和關聯的 PVC 和 PV。
Pod 的唯一性、持久化存儲和網絡標識符等特性使有狀態服務能夠保持穩定和可靠的運行狀態。
整個過程中,kube-apiserver 接收和存儲配置信息,kube-controller-manager 創建和監控控制器,kube-scheduler 負責調度 Pod,kubelet 負責在節點上創建和監控容器。同時,Headless Service 提供唯一的網絡標識符,PersistentVolume 和 PersistentVolumeClaim 提供持久化存儲,確保有狀態服務集的正確運行。