GoClub Pro

Docker-k8s

最近更新:2026-10-24
本页由同名 OneNote 笔记转换而来,可直接在线阅读;原始笔记文件见「Go语言相关笔记」页的原始链接。

附件文档全文(k8s)#

# Kubernetes (K8s) 集群详解

## 1. Kubernetes 简介

Kubernetes(常简称为 K8s)是一个开源的容器编排平台,用于自动部署、扩展和管理容器化应用程序。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation(CNCF)管理。

### 核心概念

- **集群(Cluster)**:一组节点机器,它们一起工作并作为一个整体。集群包括至少一个控制平面节点(Master)和多个工作节点(Node)。

- **节点(Node)**:可以是物理机或虚拟机,是运行 Pods 的工作负载的场所。

- **Pod**:K8s 中最小的部署单元,一个 Pod 可以包含一个或多个容器(通常是一个)。Pod 内的容器共享网络命名空间、存储和 IP 地址。

- **控制器(Controller)**:负责管理 Pods 的生命周期,如 Deployment、StatefulSet、DaemonSet 等。

- **服务(Service)**:定义了一组 Pod 的访问策略,提供稳定的网络端点,通常用于负载均衡和服务发现。

- **命名空间(Namespace)**:提供虚拟集群隔离机制,用于在同一物理集群中划分多个虚拟集群。

- **ConfigMap 和 Secret**:用于将配置数据和敏感信息与应用程序分离。

- **存储卷(Volume)**:提供 Pod 中容器可以访问的存储。

### 为什么使用 Kubernetes?

- **自动化**:自动调度、自愈、自动伸缩、滚动更新。

- **可移植性**:可在本地、云、混合环境中运行。

- **服务发现和负载均衡**:内置服务发现和负载均衡功能。

- **声明式配置**:通过 YAML 文件定义期望状态,系统自动达成。

- **资源利用率高**:高效的资源打包和隔离。

## 2. kubectl 命令行语法

`kubectl` 是 Kubernetes 的命令行工具,用于与集群交互。其基本语法为:

```bash

kubectl [command] [TYPE] [NAME] [flags]

```

- **command**:要执行的操作,如 `get`, `describe`, `create`, `apply`, `delete`, `logs`, `exec` 等。

- **TYPE**:资源类型(区分大小写),可以是单数、复数或缩写,如 `pod`, `pods`, `po`;`deployment`, `deploy`;`service`, `svc` 等。

- **NAME**:资源名称,如果省略则列出该类型的所有资源。

- **flags**:可选参数,如 `-n` 指定命名空间,`--all-namespaces` 查看所有命名空间,`-o wide` 输出更多信息等。

### 常用命令示例

- **查看资源**

```bash

kubectl get pods # 查看当前命名空间的 Pods

kubectl get pods -n kube-system # 查看 kube-system 命名空间的 Pods

kubectl get pods --all-namespaces # 查看所有命名空间的 Pods

kubectl get pods -o wide # 显示更多信息(如节点 IP)

kubectl describe pod my-pod # 查看 Pod 的详细信息

```

- **创建资源**

```bash

kubectl create deployment nginx --image=nginx # 创建一个 Deployment

kubectl expose deployment nginx --port=80 # 暴露服务

kubectl apply -f manifest.yaml # 应用 YAML 文件创建/更新资源

```

- **调试与交互**

```bash

kubectl logs my-pod # 查看 Pod 日志

kubectl logs -f my-pod # 实时流式查看日志

kubectl exec -it my-pod -- /bin/sh # 进入 Pod 内部终端

kubectl port-forward pod/my-pod 8080:80 # 端口转发

```

- **删除资源**

```bash

kubectl delete pod my-pod

kubectl delete -f manifest.yaml

```

- **查看帮助**

```bash

kubectl help

kubectl command --help

```

## 3. 注意事项与最佳实践

在使用 Kubernetes 时,需要注意以下几点:

### 资源管理

- **设置资源请求与限制**:每个容器都应设置 `resources.requests` 和 `resources.limits`,避免资源争抢和节点过载。

- **使用命名空间隔离环境**:为不同环境(dev, test, prod)或不同团队使用命名空间隔离资源。

- **避免特权容器**:除非绝对必要,不要在容器中运行特权模式,以减少安全风险。

### 安全性

- **最小权限原则**:为服务账户(ServiceAccount)分配最小必要的 RBAC 权限。

- **使用私有镜像仓库**:确保镜像安全,使用 ImagePullSecrets 访问私有仓库。

- **定期更新集群版本**:关注 Kubernetes 安全公告,及时升级。

- **网络策略**:使用 NetworkPolicy 限制 Pod 间通信,实现微服务安全。

### 高可用与容错

- **多副本部署**:关键应用应设置多个副本(replicas),并分布在不同的节点。

- **Pod 反亲和性**:将 Pod 调度到不同节点或可用区,提高容灾能力。

- **配置存活和就绪探针**:为容器配置 `livenessProbe` 和 `readinessProbe`,确保流量只发给健康的 Pod。

### 配置管理

- **使用 ConfigMap 和 Secret 管理配置**:避免在镜像中硬编码配置。

- **版本控制 YAML 文件**:将 Kubernetes 清单文件存入 Git,实现 GitOps 流程。

- **避免明文密码**:Secret 内容建议使用工具(如 Sealed Secrets, Helm Secrets)加密存储。

### 版本兼容性

- **kubectl 版本与集群版本匹配**:kubectl 的版本应与集群版本相差不超过一个次要版本。

- **API 版本废弃**:在升级集群前检查 API 版本是否被废弃,更新清单文件。

## 4. 如何编写 Kubernetes YAML 文件

Kubernetes 资源清单通常使用 YAML 格式定义。一个典型的 YAML 文件包含四个主要部分:

- **apiVersion**:使用的 API 版本,如 `v1`、`apps/v1`。

- **kind**:资源类型,如 `Pod`、`Deployment`、`Service`。

- **metadata**:元数据,包括 name、namespace、labels、annotations 等。

- **spec**:规格,描述资源的期望状态。

### YAML 基础语法

- 缩进使用空格,不能使用 Tab。

- 键值对形式:`key: value`。

- 数组使用 `-` 表示。

- 多行字符串可以使用 `|`(保留换行)或 `>`(折叠换行)。

### 编写示例

#### 示例 1:一个简单的 Pod

```yaml

apiVersion: v1

kind: Pod

metadata:

name: nginx-pod

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:1.21

ports:

- containerPort: 80

resources:

requests:

memory: "64Mi"

cpu: "250m"

limits:

memory: "128Mi"

cpu: "500m"

```

#### 示例 2:Deployment(部署无状态应用)

```yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

labels:

app: nginx

spec:

replicas: 3

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:1.21

ports:

- containerPort: 80

resources:

requests:

memory: "64Mi"

cpu: "250m"

limits:

memory: "128Mi"

cpu: "500m"

livenessProbe:

httpGet:

path: /

port: 80

initialDelaySeconds: 30

periodSeconds: 10

readinessProbe:

httpGet:

path: /

port: 80

initialDelaySeconds: 5

periodSeconds: 5

```

#### 示例 3:Service(暴露 Deployment)

```yaml

apiVersion: v1

kind: Service

metadata:

name: nginx-service

spec:

selector:

app: nginx # 匹配 Deployment 中 Pod 的标签

ports:

- protocol: TCP

port: 80 # Service 暴露的端口

targetPort: 80 # 容器监听的端口

type: ClusterIP # 默认为 ClusterIP,可选 NodePort、LoadBalancer

```

#### 示例 4:ConfigMap

```yaml

apiVersion: v1

kind: ConfigMap

metadata:

name: app-config

data:

app.properties: |

key1=value1

key2=value2

log.level: INFO

```

#### 示例 5:Secret(值需 base64 编码)

```yaml

apiVersion: v1

kind: Secret

metadata:

name: db-secret

type: Opaque

data:

username: dXNlcg== # "user" 的 base64

password: cGFzc3dvcmQ= # "password" 的 base64

```

### 编写 YAML 文件的步骤

1. **确定资源类型**:根据需求选择正确的 `kind`。

2. **查询 API 版本**:使用 `kubectl api-resources` 查看资源类型及其 API 版本。

3. **填写元数据**:为资源命名并添加标签,方便选择和管理。

4. **定义规范**:参考官方文档或现有示例,填写 `spec` 部分。对于 Pod 模板(如 Deployment 中的 template),必须包含标签和容器定义。

5. **验证 YAML 语法**:可使用 `kubectl create --dry-run=client -f file.yaml` 进行试运行,检查语法。

6. **应用配置**:`kubectl apply -f file.yaml`。

### 常用字段说明

- **apiVersion**: 可以通过 `kubectl explain <resource>` 查看,如 `kubectl explain pod` 会显示 API 版本和字段说明。

- **metadata.name**: 必须符合 DNS 子域名规范,只能包含小写字母、数字和 `-`,且不能以 `-` 开头或结尾。

- **spec.template.metadata.labels**: Deployment 中的 Pod 模板必须包含标签,且必须与 `spec.selector.matchLabels` 匹配。

- **spec.selector**: 用于标识资源管理的 Pod,不可变,创建后不能修改。

### 调试与生成 YAML 的技巧

- 使用 `kubectl create deployment nginx --image=nginx --dry-run=client -o yaml` 生成 Deployment YAML 模板。

- 使用 `kubectl get pod my-pod -o yaml` 导出已有资源的 YAML(可作为参考,但可能需要清理状态字段)。

- 使用 `kubectl explain` 命令查看字段详细说明,如 `kubectl explain deployment.spec.template.spec.containers`。

通过掌握这些基础知识,你就可以开始编写自己的 Kubernetes 清单文件并管理集群了。随着实践深入,可以进一步学习 Helm 打包、Operator 等高级模式。

附件原文:k8s.docx(点击下载)

内容反馈

发现错误或想补充内容?

GoClub Pro 是静态知识库,评论功能不再加载第三方脚本。你可以在 GitHub 仓库提交 Issue,反馈会直接进入项目协作流程。

提交 GitHub 反馈