Kubernetes 集群管理与 Docker 基础概述
1. Kubernetes 集群管理要点
1.1 探针
探针是 kubelet 基于配置对容器进行的例行健康检查。若要对容器或其内部运行的应用程序进行健康检查,可配置探针。运行探针有四种机制:exec、httpGet、tcpSocket 和 grpc。探针分为三种类型:
-
存活探针(Liveness Probe)
:用于检查容器是否正在运行。
-
就绪探针(Readiness Probe)
:用于检查容器是否准备好接受传入请求。
-
启动探针(Startup Probe)
:用于检查容器内运行的应用程序是否已完全加载。
若同时配置了存活、就绪和启动探针,在启动探针成功之前,存活和就绪探针不会启动。
1.2 资源控制
控制容器资源(CPU 和内存)使用的主要方式有请求(requests)和限制(limits),二者均在 Pod 规范的容器部分指定,适用于容器级别。
-
资源配额(Resource Quotas)
:确保单个命名空间中的对象不会占用所有集群资源,约束命名空间级别的资源使用。
-
限制范围(Limit Range)
:确保单个 Pod 不会占用所有命名空间资源,约束 Pod 级别的资源使用。
若尝试创建违反 ResourceQuota 对象指定限制的 Pod,该 Pod 的调度将失败并报错。同样,Pod 不能违反 LimitRange 对象指定的最小和最大限制。
1.3 污点和容忍度
污点和容忍度用于避免在某些节点上调度特定的 Pod。可以给节点添加污点,只有能容忍该污点的 Pod 才能在该节点上调度。污点和容忍度的 effect 字段有三个值:
-
NoSchedule
:不能调度。
-
PreferNoSchedule
:尽量不调度。
-
NoExecute
:立即驱逐。
例如,若节点有优化的 GPU 处理器,可使用污点和容忍度确保只有需要 GPU 处理的 Pod 能在该节点上调度。
1.4 调度示例
若 Pod 的第一个容忍度与节点的第一个污点匹配,第二个容忍度与节点的第二个污点匹配,但节点的第三个污点没有匹配的容忍度,则该 Pod 无法在节点上调度。若在添加三个污点时 Pod 已在节点上运行,由于第三个污点的效果为 NoExecute,Pod 将被驱逐;若为 NoSchedule,Pod 则不会被驱逐。
2. Docker 基础概述
2.1 Docker 历史
Docker 项目由 Solomon Hykes 在法国的 dotCloud 公司作为内部项目启动。2013 年在圣克拉拉的 PyCon 上首次向技术社区介绍,并在同月开源。其发布开启了容器化应用开发的革命。
2.2 Docker 平台
Docker 是一个用于开发、交付和运行应用程序的开放平台,提供构建、部署、运行、更新和管理容器所需的一切。可用于:
- 跨所有环境快速一致地交付应用程序。
- 响应式部署和扩展应用程序。
- 在同一物理/虚拟服务器上运行更多工作负载。
Docker Inc. 是销售 Docker 商业版本的美国科技公司,Docker 是一个开源项目,众多个人和组织为其做出贡献。
2.3 Docker 架构
Docker 基于客户端 - 服务器架构,主要有五个组件:
-
Docker 守护进程(Docker Daemon)
:负责构建、运行和分发 Docker 容器,管理 Docker 对象,如镜像、容器、卷和网络。
-
Docker 客户端(Docker Client)
:供最终用户连接 Docker 守护进程,使用 Docker 命令时,客户端将命令发送给守护进程。
-
Docker 桌面(Docker Desktop)
:具有图形用户界面的应用程序,可轻松构建、运行和分发容器化应用程序。
-
Docker 注册表(Docker Registries)
:用于存储 Docker 镜像,分为公共注册表和私有注册表。Docker Hub 是最流行的公共注册表,大多数公司出于安全原因使用私有注册表。
-
Docker 对象(Docker Objects)
:包括镜像、容器等。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Docker 客户端):::process -->|REST API/网络接口/Unix 套接字| B(Docker 守护进程):::process
B --> C(Docker 桌面):::process
B --> D(Docker 注册表):::process
B --> E(Docker 对象):::process
2.4 Docker 关键特性
Docker 的主要特性围绕隔离展开:
-
资源隔离
:每个容器拥有自己的系统资源份额,如 CPU 和内存。
-
网络隔离
:每个容器在自己的网络命名空间中运行,有自己的虚拟接口和 IP 地址。
-
文件系统隔离
:每个容器有自己独立的根文件系统来运行进程。
-
写时复制(Copy-on-write)
:用于隔离的根文件系统使用写时复制创建,部署速度快,占用内存和磁盘空间少。
-
变更管理
:对容器文件系统所做的任何更改都可以保存为新镜像,用于创建更多容器。
2.5 Docker 容器
容器是容器镜像的运行实例,容器镜像包含运行应用程序所需的一切:应用程序代码、所有依赖库和运行时。容器具有以下优点:
-
硬件可移植性
:不依赖底层硬件或操作系统,只要容器运行时支持,可在任何硬件或操作系统上运行。
-
轻量级和低开销
:共享服务器操作系统的内核,只需打包运行应用程序所需的库和依赖项,容器体积小。
-
快速应用部署
:由于轻量级和可移植性,可快速部署。
-
适合敏捷和 CI/CD 管道
:支持快速应用部署,符合频繁发布应用程序、缩短上市时间的需求。
-
可扩展性
:可快速创建和销毁,支持垂直和水平扩展。垂直扩展是增加现有容器的资源限制,水平扩展是创建更多具有相同规格的容器,通常水平扩展更优。
-
微服务架构的支柱
:适合将应用程序分解为更小的服务并运行。
-
可共享性
:可通过远程存储库与他人共享。
2.6 Docker 文件
2.6.1 Dockerfile
Dockerfile 是包含构建镜像代码指令的文件,Docker 根据其中的指令构建镜像。格式如下:
# Comment
INSTRUCTION arguments
指令不一定要大写,但为了更好的可读性,建议使用大写。指令按定义顺序执行,第一个指令必须是 FROM 指令,指定构建镜像的基础镜像。例如:
FROM ubuntu:10.0.1
# Update the image's metadata
LABEL org.hagrawal7777.image.authors="query@h7.com"
# Remove the tmp directory
RUN rm -r $HOME/tmp
# Command to run within the container
CMD python /apps/ha.py
2.6.2 .dockerignore 文件
.dockerignore 文件用于指定在构建镜像时要排除的文件和目录列表,可防止将不必要的敏感或大文件和目录发送给守护进程。例如:
# comment
*/opt*
*/*/opt*
opt?
其规则如下:
- 以 # 开头的行被视为注释,忽略。
-
*/opt*
:排除根目录任何直接子目录中名称以 opt 开头的所有文件和目录。
-
*/*/opt*
:排除根目录下两层子目录中名称以 opt 开头的所有文件和目录。
-
opt?
:排除名称在 opt 后有一个其他字符的所有文件和目录。
2.7 Docker 镜像
Docker 镜像是包含在运行时创建容器的指令的模板。可以基于其他基础镜像创建镜像,也可直接使用镜像创建容器。创建的镜像存储在镜像注册表中,可推送到注册表以便其他开发者拉取使用。
2.8 Docker 层
Docker 层分为两种类型:
-
镜像层(Image Layer)
:Dockerfile 中的每个指令都会在 Docker 镜像中创建一个新层。更改 Dockerfile 中的指令并重建镜像时,只有更改的层会重建,其他层保持不变。镜像层是只读的,FROM 命令会创建镜像的第一层,后续命令是否创建新层取决于是否修改文件系统。
-
容器层(Container Layer)
:在容器创建/启动时,在底层镜像层之上创建。容器层是读写层,容器运行时的任何文件更改都会记录在该层。容器删除时,容器层及其存储的数据也会被删除,因此容器数据是临时的。
例如,对于以下 Dockerfile:
FROM ubuntu:10.0.1
LABEL org.hagrawal7777.image.authors="query@h7.com"
COPY . /apps
RUN make /apps
RUN rm -r $HOME/tmp
CMD python /apps/ha.py
FROM 命令为 ubuntu:10.0.1 镜像创建第一层;LABEL 命令只修改元数据,不创建新层;COPY 命令修改文件系统,创建新层;RUN 命令修改文件系统,创建新层;CMD 命令只修改元数据,不创建新层。
3. Docker 开发与安全最佳实践
3.1 开发最佳实践
-
使用官方基础镜像
:官方镜像经过严格测试和维护,具有较高的安全性和稳定性。例如,使用
ubuntu、alpine等官方基础镜像来构建自己的镜像。 -
最小化镜像层数
:减少 Dockerfile 中的指令,避免不必要的层创建。因为每一个指令都会创建一个新的镜像层,过多的层会增加镜像的大小和构建时间。例如,将多个
RUN命令合并为一个,减少层的数量。
RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
-
使用
.dockerignore文件 :排除不必要的文件和目录,避免将敏感信息或大文件包含在镜像中,从而减小镜像大小。 - 多阶段构建 :对于复杂的应用程序,可以使用多阶段构建来分离构建环境和运行环境。例如,在第一阶段使用一个包含编译工具的镜像来构建应用程序,在第二阶段使用一个轻量级的运行时镜像来运行应用程序。
# 第一阶段:构建阶段
FROM golang:1.17 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 第二阶段:运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
3.2 安全最佳实践
- 及时更新镜像 :定期更新基础镜像和应用程序依赖,以修复已知的安全漏洞。
-
最小化容器权限
:在容器中运行应用程序时,尽量减少容器的权限。例如,避免以
root用户运行容器,可以创建一个非特权用户来运行应用程序。
# 创建非特权用户
RUN adduser -D myuser
USER myuser
- 使用安全的注册表 :使用受信任的 Docker 注册表,如 Docker Hub 或公司内部的私有注册表,避免从不可信的来源拉取镜像。
- 扫描镜像漏洞 :使用镜像扫描工具,如 Trivy、Clair 等,定期扫描镜像以检测潜在的安全漏洞。
4. Kubernetes 最佳实践
4.1 资源管理
- 合理设置请求和限制 :根据应用程序的实际需求,合理设置容器的 CPU 和内存请求和限制。避免设置过高的请求导致资源浪费,或设置过低的限制导致应用程序性能下降。
- 使用资源配额和限制范围 :在命名空间级别使用资源配额来限制资源使用,在 Pod 级别使用限制范围来确保单个 Pod 不会占用过多资源。
4.2 探针配置
-
正确配置探针
:根据应用程序的特点,正确配置存活探针、就绪探针和启动探针。例如,对于一个 Web 应用程序,可以使用
httpGet探针来检查应用程序是否正常响应。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp:1.0
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 5
- 避免过度依赖探针 :探针只是一种检测机制,不能替代应用程序的自我修复能力。应该确保应用程序本身具有一定的容错能力。
4.3 部署策略
- 使用滚动更新 :在更新应用程序时,使用滚动更新策略,逐步替换旧的 Pod 为新的 Pod,确保应用程序的高可用性。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:2.0
- 使用金丝雀部署 :在大规模部署新应用程序或更新之前,先在一小部分 Pod 上进行金丝雀部署,验证新应用程序的稳定性和性能,然后再逐步扩大部署范围。
4.4 监控与日志
- 使用监控工具 :使用 Prometheus、Grafana 等监控工具来监控 Kubernetes 集群和应用程序的性能指标,及时发现和解决问题。
- 收集日志 :使用 Fluentd、Elasticsearch、Kibana 等日志收集和分析工具,收集和分析应用程序的日志,以便进行故障排查和性能优化。
5. 总结
本文介绍了 Kubernetes 集群管理和 Docker 的相关知识,包括 Kubernetes 中的探针、资源控制、污点和容忍度等概念,以及 Docker 的历史、平台、架构、关键特性、容器、文件、镜像和层等内容。同时,还分享了 Docker 开发与安全最佳实践以及 Kubernetes 最佳实践。通过遵循这些最佳实践,可以提高应用程序的开发效率、安全性和稳定性,更好地利用 Kubernetes 和 Docker 技术来构建和管理容器化应用程序。
| 技术点 | 要点 |
|---|---|
| Kubernetes 集群管理 | 探针用于健康检查,资源控制包括请求和限制、资源配额和限制范围,污点和容忍度用于调度控制 |
| Docker 基础 | 历史、平台、架构、特性、容器、文件、镜像和层等 |
| Docker 最佳实践 | 开发上使用官方镜像、最小化层数等,安全上及时更新、最小化权限等 |
| Kubernetes 最佳实践 | 资源管理、探针配置、部署策略、监控与日志等 |
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Kubernetes 集群管理):::process --> B(资源管理):::process
A --> C(探针配置):::process
A --> D(调度控制):::process
E(Docker 基础):::process --> F(架构):::process
E --> G(容器):::process
E --> H(镜像):::process
I(最佳实践):::process --> J(Docker 最佳实践):::process
I --> K(Kubernetes 最佳实践):::process
Kubernetes与Docker核心实践指南
超级会员免费看
51

被折叠的 条评论
为什么被折叠?



