first commit
All checks were successful
continuous-integration/drone Build is passing

This commit is contained in:
2025-12-13 18:06:23 +08:00
commit 8a87b699ba
333 changed files with 27094 additions and 0 deletions

View File

@@ -0,0 +1,382 @@
> 本文作者:丁辉
# Deployment的使用
[官方文档](https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/)
## 命令部署一个应用
```bash
kubectl create deployment nginx --image=nginx:alpine
```
## Yaml 部署一个 Deployment 应用
1. 部署应用(最小化 Yaml)
```yaml
cat <<EOF | kubectl apply -f -
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:alpine
ports:
- containerPort: 80
EOF
```
2. 验证
```bash
kubectl get deployments
```
## 更新和回滚
> Deployment 支持两种更新策略滚动更新RollingUpdate默认和删除式更新Recreate又称单批次更新
- ReCreate
**删除式更新Recreate**:更新时先删除所有运行中的 Pod待其彻底终止后创建新 ReplicaSet 及对应 Pod更新期间服务暂不可用。
```yaml
spec:
strategy:
type: Recreate
```
- RollingUpdate
**滚动更新RollingUpdate**:分批更新 Pod待一批更新后的 Pod 就绪后再更新下一批,实现服务不中断;更新过程中会存在新老版本应用共存的情况,不同客户端可能获取不同版本响应。
```yaml
spec:
strategy:
type: RollingUpdate
```
### 更新
1. 更新镜像
在这里,`deployment/nginx-deployment` 表明 Deployment 的名称,`nginx` 表明需要进行更新的容器, 而 `nginx:latest` 则表示镜像的新版本以及它的标签。
```bash
kubectl set image deployment/nginx-deployment nginx=nginx:latest
```
2. 查看进度
```bash
kubectl rollout status deployment/nginx-deployment
```
3. 查看状态
```bash
kubectl get rs
```
### 回滚
1. 查看 Deployment 修订历史
```bash
kubectl rollout history deployment/nginx-deployment
```
设置 `CHANGE-CAUSE` 消息
```bash
kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="image updated to latest"
```
2. 查看修订历史的详细信息
```bash
kubectl rollout history deployment/nginx-deployment --revision=2
```
3. 回滚
```bash
kubectl rollout undo deployment/nginx-deployment
```
或回滚到特定版本
```bash
kubectl rollout undo deployment/nginx-deployment --to-revision=2
```
### 重启
```bash
kubectl rollout restart deployment deployment/nginx-deployment
```
### 副本数调整
```bash
kubectl scale deployment/nginx-deployment --replicas=3
```
## 暂停、恢复 Deployment 的上线过程
1. 暂停上线
```bash
kubectl rollout pause deployment/nginx-deployment
```
2. 更新 Deployment 镜像
```bash
kubectl set image deployment/nginx-deployment nginx=nginx:latest
```
你可以根据需要执行很多更新操作,例如,可以要使用的资源
```bash
kubectl set resources deployment/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
```
3. 最终,恢复 Deployment 上线并观察新的 ReplicaSet 的创建过程,其中包含了所应用的所有更新
```bash
kubectl rollout resume deployment/nginx-deployment
```
4. 监视上线的状态,直到完成
```bash
watch kubectl get rs
```
## 更新失败标记为 **"Failed"** 状态
```bash
kubectl patch deployment/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":600}}'
```
`progressDeadlineSeconds`
- **作用**: 定义 Deployment 滚动更新Rolling Update的最大允许时间
- **值 600**: 表示 600 秒1 分钟)
- **默认值**: 通常为 600 秒,但显式设置可确保明确性
- **工作逻辑**:
1. 当 Deployment 开始更新(如镜像版本升级)时启动计时
2. 如果更新过程超过 600 秒仍未完成
3. Kubernetes 会将 Deployment 标记为 **"Failed"** 状态
4. 并自动回滚到之前的稳定版本(如果配置了回滚策略)
## 配置 ReplicaSet 清理策略
你可以在 Deployment 中设置 `.spec.revisionHistoryLimit` 字段以指定保留此 Deployment 的多少个旧有 ReplicaSet。其余的 ReplicaSet 将在后台被垃圾回收。 默认情况下,此值为 10。
```bash
kubectl patch deployment/nginx-deployment -p '{"spec":{"revisionHistoryLimit":10}}'
```
## 金丝雀部署
[官方文档](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/#canary-deployment)
### 通过副本数控制
**操作步骤:**
1. 先部署稳定版本v19个副本
2. 部署金丝雀版本v21个副本
3. Service会自动将约9%的流量1/10导向v2
4. 观察监控如果v2正常逐步增加v2副本数减少v1副本数
1. 部署 Pod-1
```yaml
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-1
labels:
app: nginx
spec:
replicas: 9
strategy:
type: RollingUpdate
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
version: v1
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/offends/demo:nginx-alpine-v1
ports:
- containerPort: 80
EOF
```
2. 部署 Pod-2
```yaml
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-2
labels:
app: nginx
spec:
replicas: 1
strategy:
type: RollingUpdate
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
version: v2
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/offends/demo:nginx-alpine-v2
ports:
- containerPort: 80
EOF
```
3. 部署 Service同时选择v1和v2的Pod
```yaml
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-service
spec:
selector:
app: nginx # 同时选择两个版本的Pod
ports:
- port: 80
targetPort: 80
EOF
```
4. 修改权重将流量导向 v2
- 增加 v2
```bash
kubectl scale deployment/nginx-deployment-2 --replicas=10
```
- 降低 v1
```bash
kubectl scale deployment/nginx-deployment-1 --replicas=0
```
### 通过 Ingress 实现基于权重的金丝雀
方法类似于前者,只是对象从副本数变换为 Ingress控制
1. 创建两个 Service
```bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-service-1
spec:
selector:
app: nginx
version: v1
ports:
- port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-service-2
spec:
selector:
app: nginx
version: v2
ports:
- port: 80
targetPort: 80
EOF
```
2. 创建 Ingress 资源
```yaml
cat <<EOF | kubectl apply -f -
# 金丝雀 Ingress 对象为 v1 版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-1
spec:
rules:
- host: demo.offends.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-deployment-service-1
port:
number: 80
---
# 金丝雀 Ingress 对象为 v2 版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-2
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10" # 10%流量到金丝雀
spec:
rules:
- host: demo.offends.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-deployment-service-2
port:
number: 80
EOF
```
3. 慢慢调整 nginx-ingress-2 流量到 100%,即完成更新

View File

@@ -0,0 +1,414 @@
> 本文作者:丁辉
# Pod水平自动缩放
[官方文档](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/#scaling-a-deployment)
## 基础配置准备
1. 确保 Metrics Server 已安装
[Github](https://github.com/kubernetes-sigs/metrics-server/)
检查 metrics-server 是否运行
```bash
kubectl get pods -n kube-system | grep metrics-server
```
如果没有,可以安装它(如果是标准的 Kubernetes 集群)
```bash
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
```
2. 确保 Pod 已设置资源请求
[Pod配置资源请求](https://gitee.com/offends/Kubernetes/blob/main/%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3/Pod%E9%85%8D%E7%BD%AE%E8%B5%84%E6%BA%90%E8%AF%B7%E6%B1%82.md)
## 介绍
> 自动伸缩HPA的计算是基于 `requests` 的,而不是 `limits`
**详细解释**
HPA 使用的计算公式是:
- 使用率(Utilization)= Pod 当前实际使用量 ÷ Pod 的 requests 值
- 绝对值(AverageValue) = 所有 Pod 的实际 CPU 使用量总和 ÷ Pod 数量
## 使用条件介绍
- ✅ **类型**`AverageValue`(绝对值)
- ✅ **目标**:所有 Pod 平均使用 **80m CPU**
- ✅ **特点**:不依赖 `requests` 设置
- ⚠️ **注意**:如果 Pod 的 `requests` 设置变化,可能需要调整这个值
- 🔄 **对比**:如果改为 `Utilization: 80%`,则目标是 CPU 使用量达到 `requests.cpu` 的 80%
**选择建议**
- 如果 Pod 的 `requests.cpu` 稳定且合理 → 使用 `Utilization`
- 如果 `requests` 经常变化或设置不合理 → 使用 `AverageValue`
- 两者可以互相转换:`averageValue = requests.cpu × (utilization/100)`
## 创建 HPA
**基础命令格式对比表**
| 参数/命令部分 | 基础命令 | 说明 |
| :------------: | :---------------------------: | :----------------------: |
| **命令结构** | `kubectl autoscale` | 创建或更新HPA |
| **目标资源** | `deployment/nginx-deployment` | 要自动扩缩容的Deployment |
| **最小副本数** | `--min=3` | 最少保持的Pod数量 |
| **最大副本数** | `--max=6` | 最多允许的Pod数量 |
| **CPU阈值** | `--cpu=80` | CPU使用率目标值 |
| **内存阈值** | `--memory=75` | 内存使用率目标值 |
### 命令创建(默认使用AverageValue算计)
- 绝对值 50m
```bash
kubectl autoscale deployment/nginx-deployment --min=1 --max=3 --cpu=50 --memory=50
```
- 绝对值50Mi
```bash
kubectl autoscale deployment/nginx-deployment --min=1 --max=3 --memory=50
```
### Yaml 创建(使用Utilization)
- CPU 80%
- 内存 75%
1. 编辑 Yaml
```bash
vi nginx-deployment-hpa-utilization.yaml
```
内容如下
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deployment
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 75
```
2. 部署
```bash
kubectl apply -f nginx-deployment-hpa-utilization.yaml
```
### Yaml 创建(使用AverageValue)
- CPU 绝对值 50m
- 内存 绝对值50Mi
1. 编辑 Yaml
```bash
vi nginx-deployment-hpa-averagevalue.yaml
```
内容如下
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deployment
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
target:
type: AverageValue
averageValue: 50m
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 50Mi
```
2. 部署
```bash
kubectl apply -f nginx-deployment-hpa-averagevalue.yaml
```
## 验证 HPA
创建后,可以检查 HPA 状态:
- 查看 HPA
```bash
kubectl get hpa
```
- 详细查看
```bash
kubectl describe hpa nginx-deployment
```
- 查看当前 CPU 使用率
```bash
kubectl top pods
```
## 增加负载验证
1. 模拟负载
```bash
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://nginx-deployment; done"
```
2. 观察
```bash
kubectl get hpa nginx-deployment --watch
```
## 其他类型
### 根据每个 Pod 每秒处理的数据包数量来扩缩容
具体解释:
- **监控指标**`packets-per-second`(每秒数据包数)
- **目标值**:每个 Pod 平均每秒处理 **1000 个数据包**1k = 1000
- **扩缩逻辑**
- 如果所有 Pod 的平均值 **超过** 1000 个包/秒 → 增加 Pod 数量
- 如果所有 Pod 的平均值 **低于** 1000 个包/秒 → 减少 Pod 数量
1. 编辑 Yaml
```bash
vi nginx-deployment-hpa-pod.yaml
```
内容如下
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deployment
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 3
metrics:
- type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k
```
2. 部署
```bash
kubectl apply -f nginx-deployment-hpa-pod.yaml
```
### 根据 Ingress 的每秒请求数来扩缩容后端应用
具体解释:
- **监控对象**:名为 `main-route` 的 Ingress
- **监控指标**`requests-per-second`Ingress 每秒处理的请求数)
- **目标值**:整个 Ingress 每秒处理 **2000 个请求**2k = 2000
- **扩缩逻辑**
- 如果这个 Ingress 的请求数 **超过** 2000 请求/秒 → 增加后端 Pod 数量
- 如果这个 Ingress 的请求数 **低于** 2000 请求/秒 → 减少后端 Pod 数量
1. 编辑 Yaml
```bash
vi nginx-deployment-hpa-object.yaml
```
内容如下
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deployment
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 3
metrics:
- type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-route # 但监控的是这个 Ingress 的流量
target:
type: Value
value: 2k # 整个 Ingress 的目标2000 请求/秒
```
2. 部署
```bash
kubectl apply -f nginx-deployment-hpa-object.yaml
```
### 根据带 GET 标签的 HTTP 请求指标来扩缩容
具体解释:
- **监控对象**:某个 Kubernetes 资源(如 Ingress、Service 等)
- **监控指标**`http_requests`HTTP 请求总数或速率)
- **指标筛选**:只选择带有 `verb: GET` 标签的指标
- **目标值**:需要在其他地方指定(这里没有显示完整的 target 部分)
1. 编辑 Yaml
```bash
vi nginx-deployment-hpa-object-api.yaml
```
内容如下
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Object
object:
describedObject:
apiVersion: v1
kind: Service
name: api-service
metric:
name: http_requests
selector:
matchLabels:
verb: GET # 只监控 GET 请求
path: "/api/v1/users" # 可以进一步指定路径
status: "200" # 还可以按状态码筛选
target:
type: AverageValue
averageValue: 500 # 目标:每秒 500 个 GET 请求
```
2. 部署
```bash
kubectl apply -f nginx-deployment-hpa-object-api.yaml
```
### 根据外部消息队列中的任务数量来扩缩容
具体解释:
- **监控来源**:外部系统(不是 Kubernetes 内部)
- **监控指标**`queue_messages_ready`(队列中待处理的消息数量)
- **队列筛选**:只监控名为 `worker_tasks` 的队列
- **目标值**:保持队列中大约有 **30 个待处理消息**
- **扩缩逻辑**
- 如果队列消息 **超过 30 个** → 增加 Worker Pod 数量
- 如果队列消息 **低于 30 个** → 减少 Worker Pod 数量
1. 编辑 Yaml
```bash
vi nginx-deployment-hpa-object-worker.yaml
```
内容如下
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: worker-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: task-worker # 处理队列任务的 Worker 应用
minReplicas: 1
maxReplicas: 20
metrics:
- type: External
external:
metric:
name: queue_messages_ready # 队列中"就绪"的消息数
selector:
matchLabels:
queue: "worker_tasks" # 只监控这个特定队列
# 还可以按其他标签筛选,如:
# vhost: "production"
# exchange: "orders"
target:
type: AverageValue
averageValue: 30 # 目标保持队列中有30个待处理消息
```
2. 部署
```bash
kubectl apply -f nginx-deployment-hpa-object-worker.yaml
```

View File

@@ -0,0 +1,88 @@
> 本文作者:丁辉
# Pod配置资源请求
**CPU配置基本表示法**
- **1 个完整的 CPU 核心** = `1``1000m`
- **100m** = `0.1` 个 CPU 核心100 毫核)
- **500m** = `0.5` 个 CPU 核心(半个核心)
- **250m** = `0.25` 个 CPU 核心
**Requests 和 Limits 核心区别**
- **`requests`****预约/保证的资源量** - 调度器保证 Pod 能获得这么多资源
- **`limits`****资源使用上限** - 容器不能超过这个硬性限制
## Deployment配置资源请求
1. 编写 Yaml
```bash
vi nginx-deployment.yaml
```
内容如下(最小化 Yaml)
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
resources:
requests: # 必须定义,供 HPA 计算使用率
cpu: 50m # 例如0.1 个 CPU 核心
memory: 128Mi
limits: # 限制是可选的,但建议设置
cpu: 100m
memory: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
ports:
- port: 80
selector:
app: nginx
```
2. 部署
```bash
kubectl apply -f nginx-deployment.yaml
```
3. 验证
```bash
kubectl get deployments
```
4. 等一会查看资源使用量
```bash
kubectl top pod
```

View File

@@ -0,0 +1,185 @@
> 本文作者:丁辉
# StatefulSet的使用
[官方文档](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/)
## 示例
```yaml
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # 必须匹配 .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # 默认值是 1
minReadySeconds: 10 # 默认值是 0
template:
metadata:
labels:
app: nginx # 必须匹配 .spec.selector.matchLabels
spec:
# 指定 Pod 在接收到终止信号后,系统等待容器优雅关闭的时间(以秒为单位)。默认值为 30 秒
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
EOF
```
## 参数介绍
| 特性 | ReadWriteOnce (RWO) | ReadWriteOncePod (RWOP) |
| :-------------: | :-------------------: | :--------------------------: |
| **挂载单位** | 节点级别 | Pod级别 |
| **多个Pod访问** | 允许(同节点) | 绝对禁止 |
| **安全性** | 较低同节点Pod可共享 | 高,严格隔离 |
| **K8s版本** | 所有版本 | 1.22+beta1.27+(稳定) |
| **使用场景** | 常规有状态应用 | 需要严格隔离的应用 |
| **存储类支持** | 广泛支持 | 需要CSI驱动支持 |
## 更新策略
- RollingUpdate(滚动更新) - 默认策略
```yaml
spec:
updateStrategy:
type: RollingUpdate
```
- OnDelete(删除时更新)
```yaml
spec:
updateStrategy:
type: OnDelete
```
## 金丝雀发布
`partition` 参数用于控制更新的分界点,实现金丝雀发布或分阶段更新。
```yaml
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2 # 只有序号 >=2 的 Pod 会被更新
```
**工作原理**
- `partition: 2` → 更新 pod-2, pod-3, ...
- `partition: 1` → 更新 pod-1, pod-2, ...
- `partition: 0` → 更新所有 Pod默认值
## PersistentVolumeClaim 保留
在 StatefulSet 的生命周期中,可选字段 `.spec.persistentVolumeClaimRetentionPolicy` 控制是否删除以及如何删除 PVC。 使用该字段,你必须在 API 服务器和控制器管理器启用 `StatefulSetAutoDeletePVC` [特性门控](https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)。 启用后,你可以为每个 StatefulSet 配置两个策略:
- `whenDeleted`
配置删除 StatefulSet 时应用的卷保留行为。
- `whenScaled`
配置当 StatefulSet 的副本数减少时应用的卷保留行为;例如,缩小集合时。
对于你可以配置的每个策略,你可以将值设置为 `Delete` 或 `Retain`。
- `Delete`
对于受策略影响的每个 Pod基于 StatefulSet 的 `volumeClaimTemplate` 字段创建的 PVC 都会被删除。 使用 `whenDeleted` 策略,所有来自 `volumeClaimTemplate` 的 PVC 在其 Pod 被删除后都会被删除。 使用 `whenScaled` 策略,只有与被缩减的 Pod 副本对应的 PVC 在其 Pod 被删除后才会被删除。
- `Retain`(默认)
来自 `volumeClaimTemplate` 的 PVC 在 Pod 被删除时不受影响。这是此新功能之前的行为。
请记住,这些策略仅适用于由于 StatefulSet 被删除或被缩小而被删除的 Pod。 例如,如果与 StatefulSet 关联的 Pod 由于节点故障而失败, 并且控制平面创建了替换 Pod则 StatefulSet 保留现有的 PVC。 现有卷不受影响,集群会将其附加到新 Pod 即将启动的节点上。
### 示例
1. whenDeleted - StatefulSet 被删除时
- 保留 PVC (默认)
```yaml
apiVersion: apps/v1
kind: StatefulSet
...
spec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain
```
- 删除 PVC
```yaml
apiVersion: apps/v1
kind: StatefulSet
...
spec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Delete
```
2. whenScaled - 缩减副本数时
- 保留被删除 Pod 的 PVC
```yaml
apiVersion: apps/v1
kind: StatefulSet
...
spec:
persistentVolumeClaimRetentionPolicy:
whenScaled: Retain
```
- 删除被删除 Pod 的 PVC
```yaml
apiVersion: apps/v1
kind: StatefulSet
...
spec:
persistentVolumeClaimRetentionPolicy:
whenScaled: Delete
```

View File

@@ -0,0 +1,26 @@
> 本文作者:丁辉
# 使用Kubectl-Proxy访问Pod
[官方文档](https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/#%E6%9F%A5%E7%9C%8B%E5%BA%94%E7%94%A8)
1. 开启代理
```bash
kubectl proxy
```
2. 验证
```bash
curl http://localhost:8001/version
```
3. 通过代理的 API 访问 Pod
- 更换 `$NAMESPACES` 为所需访问的命名空间
- 更换 `$POD_NAME` 为所需访问的容器名
```bash
curl http://localhost:8001/api/v1/namespaces/$NAMESPACES/pods/$POD_NAME:80/proxy/
```

View File

@@ -0,0 +1,73 @@
>本文作者:丁辉
# Kubernetes内配置域名解析
## 更改 Coredns 配置
> 不同部署方式的集群可能 Coredns 配置文件的名称也不同, 需要按照自身集群情况修改
>
> ```bash
> kubectl get cm -n kube-system | grep coredns
> ```
1. 备份原配置
```bash
kubectl get cm coredns -n kube-system -o yaml > /root/coredns.yaml
```
2. 编辑 Yaml 文件
```bash
kubectl edit cm -n kube-system coredns
```
添加如下内容
```yaml
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
#加这一段
#---------------------------
hosts {
192.168.1.10 www.demo.com
fallthrough
}
#---------------------------
prometheus :9153
#forward . 192.168.1.10 #或者在这里添加DNS
forward . "/etc/resolv.conf"
cache 30
loop
reload
loadbalance
} # STUBDOMAINS - Rancher specific change
kind: ConfigMap
···
```
3. 重启集群内所有 Coredns 立即生效
> 当然这在生产并不可取, 尽量让他自行生效, 但过程较慢
- Rke集群
```bash
kubectl delete pod -l k8s-app=kube-dns -n kube-system
```
- 其他集群待写

View File

@@ -0,0 +1,80 @@
> 本文作者:丁辉
# Kubernetes常用命令
- 查看资源定义都有哪些字段
```bash
kubectl explain deployments.spec
```
- 查看最近的事件
```bash
kubectl get events --sort-by='.lastTimestamp'
```
- 列出 Kubernetes 集群中可用的 API 资源
```bash
kubectl api-resources
```
- 设置 Kubernetes 默认命名空间
> 这样在执行命令的时候就可以不用指定命名空间啦
```bash
kubectl config set-context --current --namespace=命名空间名称
```
- 将 Kubernetes 集群的配置信息(包括集群、用户、凭据等)导出到 `~/.kube/config` 文件中
```bash
kubectl config view --raw > ~/.kube/config
```
- 获取 svc 的 clusterIP
```bash
kubectl get svc kubernetes -o jsonpath='{.spec.clusterIP}'
```
- 获取 Kubernetes 集群内部域名后缀
```bash
kubectl -n kube-system get configmap/coredns -o jsonpath='{.data.Corefile}' | grep 'kubernetes' | sed 's/{//'
```
- 显示有关 Kubernetes 集群的基本信息,包括控制平面组件的地址、服务的端点等
```bash
kubectl cluster-info
```
- 用于生成有关 Kubernetes 集群的详尽信息的完整转储
```bash
kubectl cluster-info dump
```
- 获取集群 Name
```bash
kubectl config view --minify -o "jsonpath={.clusters[0].name}"
```
- 获取集群用户
```bash
kubectl config view --minify -o "jsonpath={.users[*].name}"
```
- 获取集群组
```bash
kubectl config view --minify -o "jsonpath={.contexts[*].context.user}"
```

View File

@@ -0,0 +1,110 @@
> 本文作者:丁辉
# Kubernetes强制删除资源
## 卸载 Mount 挂载
```bash
umount $(mount | grep /var/lib/kubelet/pods | awk '{print $3}')
```
## 强制删除 Pod
- 强制删除 Terminating Pod
```bash
kubectl delete pod ${POD_NAME} --force
```
- 立刻终止并强制删除 Terminating Pod
```bash
kubectl delete pod ${POD_NAME} --grace-period=0 --force
```
- 通过修改系统参数删除 Terminating Pod(仅Centos)
> 通过设置 `fs.may_detach_mounts=1` , Linux内核可以允许卸载这些挂载点即使它们仍然被一些进程占用。
```bash
sysctl -w fs.may_detach_mounts=1
```
- 通过修改 finalizers 删除 Terminating Pod
> 当你删除一个资源(比如 PodKubernetes 会将该资源的 finalizers 字段设置为一个非空的数组,这些 finalizers 是用来执行删除操作的一系列步骤。一旦这些步骤全部完成Kubernetes 就会将资源完全删除。但是,有时候 Pod 可能会被卡在 Terminating 状态,无法正常删除,这可能是因为某些 finalizers 的执行未能成功完成,从而导致 Pod 无法被删除。
```bash
kubectl patch pod ${POD_NAME} -p '{"metadata":{"finalizers":null}}'
```
## 强制删除当前 Namespace 下所有 Pvc Pv
- 设置变量
```bash
export YOURNAMESPACE=你的名称空间
```
- 删除 Pvc
```bash
for line in $(kubectl get pvc -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl delete pvc $line -n $YOURNAMESPACE ; echo $line; done
```
- 删除 Pv
```bash
for line in $(kubectl get pv -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl delete pv $line -n $YOURNAMESPACE ; echo $line; done
```
- 若发现 Pv 还是删除不了
```bash
for line in $(kubectl get pv -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl patch pv $line -p '{"metadata":{"finalizers":null}}' -n $YOURNAMESPACE ; kubectl delete pv $line -n $YOURNAMESPACE ;echo $line; done
```
## 强制删除 Namespace
**方法一**
- 先手动强制删除试试
```bash
kubectl delete ns $YOURNAMESPACE --force --grace-period=0
```
**方法二**
- 导出 JSON 文件
```bash
kubectl get namespace $YOURNAMESPACE -o json > ns.json
```
- 编辑 ns.josn 删除 finalizers 字段的值
```yaml
"spec": {
"finalizers": []
},
```
- 开启proxy
```bash
kubectl proxy --port=8081
```
- 删除
```bash
curl -k -H "Content-Type:application/json" -X PUT --data-binary @ns.json http://127.0.0.1:8081/api/v1/namespaces/$YOURNAMESPACE/finalize
```
## 删除Evicted pod
```bash
kubectl get pod -A | grep Evicted | awk '{print $2" -n "$1}' | xargs kubectl delete pod
```

View File

@@ -0,0 +1,94 @@
> 本文作者:丁辉
# Kubernetes 拷贝文件
## 拷贝容器内文件到本地
### 方法一
**使用 kubectl cp 拷贝**
```bash
kubectl -n 命名空间 cp 容器名:/容器内文件路径 ./拷贝到本地文件名
```
> 示例:
>
> ```bash
> kubectl -n test cp nginx-6db97db958-zrb7r:etc/nginx/nginx.conf ./nginx.conf
> ```
>
> **执行命令提示**
>
> ```bash
> tar: Removing leading `/' from member names
> ```
>
> 这是在提示你在 `kubectl -n 命名空间 cp 容器名:<这里开头不用加 "/" >`
### 方法二
**寻找到本地 Docker 持久化存储 拷贝文件到本地**
- 获取容器 ID
```bash
CONTAINER_ID=$(kubectl -n 命名空间 describe pod 容器名 | grep "Container ID:" | awk -F '/' '{print $3}')
```
> 示例:
>
> ```bash
> CONTAINER_ID=$(kubectl -n test describe pod nginx-6db97db958-zrb7r | grep "Container ID:" | awk -F '/' '{print $3}')
> ```
- 获取存储路径
```bash
docker inspect -f '{{.GraphDriver.Data.UpperDir}}' $CONTAINER_ID
```
### 方法三
- 获取容器名称
```bash
kubectl -n 命名空间 describe pod 容器名 | grep "Containers:" -A 1
```
> 示例:
>
> ```
> kubectl -n test describe pod nginx-6db97db958-zrb7r | grep "Containers:" -A 1
> ```
- 寻找 Docker 容器
```bash
docker ps | grep 容器名称
```
- 拷贝容器内文件
```bash
docker cp 容器名称:/容器内路径 ./本地路径
```
## 拷贝本地文件到容器内
**使用 kubectl cp 拷贝**
```bash
kubectl -n 命名空间 cp ./本地文件名 容器名:/容器内路径
```
> 示例:
>
> ```bash
> kubectl -n test cp ./default.conf nginx-6db97db958-zrb7r:/etc/nginx/conf.d/
> ```

View File

@@ -0,0 +1,62 @@
> 本文作者:丁辉
# Kubernetes跨命名空间访问Service
## 使用完全限定域名 (FQDN)
> 在 Kubernetes 中,跨命名空间访问服务可以通过使用服务的完全限定域名 (FQDN) 或者创建服务的别名Service Alias来实现。下面是一些具体的方法和步骤。
**格式**
```bash
<service-name>.<namespace>.svc.cluster.local
```
**示例**
```bash
kubernetes.default.svc.cluster.local:443
```
**解释**
- **kubernetes**:这是服务 Service 的名称。
- **default**:这指的是服务所在的命名空间。
- **svc**这表示这是一个服务Service。在 Kubernetes 中,服务是定义一组逻辑上相关的 Pod 访问规则的抽象,它允许外部访问或集群内部的负载均衡和服务发现。
- **cluster.local**:这是集群的默认域名。在 Kubernetes 集群中,所有的内部服务都默认位于这个域。
- **443**:这是端口号。
## 创建服务别名Service Alias
1. **创建一个 `Service` 对象**:在目标命名空间中创建一个新的服务对象,该对象会将流量转发到原始服务。
```bash
vi service-alias.yaml
```
内容如下
```yaml
apiVersion: v1
kind: Service
metadata:
name: kubernetes-service-alias
namespace: default
spec:
type: ExternalName
externalName: kubernetes.default.svc.cluster.local
```
2. 部署 Yaml
```bash
kubectl apply -f service-alias.yaml
```
3. **使用别名访问服务**
现在,`default` 命名空间中的 Pod 可以通过 `kubernetes-service-alias` 这个服务名来访问 `kubernetes` 服务。
# 总结
通过以上方法,你可以在 Kubernetes 集群中实现跨命名空间访问服务。使用 FQDN 是最直接的方法,而使用服务别名则提供了更大的灵活性。如果需要更严格的网络控制,可以结合 NetworkPolicy 来管理跨命名空间的访问。根据你的具体需求选择合适的方法。

View File

@@ -0,0 +1,34 @@
> 本文作者:丁辉
# 查看Kubernetes内所有特权容器
1. 安装 JQ
- Centos
```bash
yum -y install jq
```
- Ubuntu
```bash
apt -y install jq
```
2. 查找特权容器
- 查找特权容器并输出命名空间、容器名
```bash
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers[].securityContext.privileged==true) | {namespace: .metadata.namespace, pod: .metadata.name}'
```
- 查找特权容器并输出命名空间、容器名、容器端口
```bash
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers[].securityContext.privileged==true) | {namespace: .metadata.namespace, pod: .metadata.name, ports: .spec.containers[].ports}'
```

View File

@@ -0,0 +1,42 @@
> 本文作者:丁辉
# 跨Namespace同步Secret和ConfigMap
> 示例:同步 `test` 命名空间下的 `demo-secret` 到 `default` 命名空间下
## JQ实现
1. 准备依赖 `jq`
- Centos
```bash
yum install jq -y
```
- Ubuntu
```bash
apt install jq -y
```
2. 执行命令
```bash
kubectl get secret demo-secret -n test -o json \
| jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \
| kubectl apply -n default -f -
```
## SED实现
```bash
kubectl get secret demo-secret -n test -o json \
| jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \
| kubectl apply -n default -f -
```
## Helm部署Config-Syncer实现自动同步
请查看此文档:[Helm部署Config-Syncer](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Config-Syncer.md)