Docker-k8s
附件文档全文(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 等高级模式。