This commit is contained in:
382
使用文档/Deployment的使用.md
Normal file
382
使用文档/Deployment的使用.md
Normal 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. 先部署稳定版本(v1,9个副本)
|
||||
2. 部署金丝雀版本(v2,1个副本)
|
||||
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%,即完成更新
|
||||
|
||||
414
使用文档/Pod水平自动缩放.md
Normal file
414
使用文档/Pod水平自动缩放.md
Normal 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
|
||||
```
|
||||
88
使用文档/Pod配置资源请求.md
Normal file
88
使用文档/Pod配置资源请求.md
Normal 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
|
||||
```
|
||||
|
||||
|
||||
185
使用文档/StatefulSet的使用.md
Normal file
185
使用文档/StatefulSet的使用.md
Normal 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+(beta),1.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
|
||||
```
|
||||
|
||||
|
||||
26
使用文档/使用Kubectl-Proxy访问Pod.md
Normal file
26
使用文档/使用Kubectl-Proxy访问Pod.md
Normal 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/
|
||||
```
|
||||
73
使用文档/其他/Kubernetes内配置域名解析.md
Normal file
73
使用文档/其他/Kubernetes内配置域名解析.md
Normal 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
|
||||
```
|
||||
|
||||
- 其他集群待写
|
||||
|
||||
80
使用文档/其他/Kubernetes常用命令.md
Normal file
80
使用文档/其他/Kubernetes常用命令.md
Normal 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}"
|
||||
```
|
||||
|
||||
|
||||
|
||||
110
使用文档/其他/Kubernetes强制删除资源.md
Normal file
110
使用文档/其他/Kubernetes强制删除资源.md
Normal 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
|
||||
|
||||
> 当你删除一个资源(比如 Pod)时,Kubernetes 会将该资源的 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
|
||||
```
|
||||
|
||||
94
使用文档/其他/Kubernetes拷贝文件.md
Normal file
94
使用文档/其他/Kubernetes拷贝文件.md
Normal 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/
|
||||
> ```
|
||||
|
||||
|
||||
|
||||
62
使用文档/其他/Kubernetes跨命名空间访问Service.md
Normal file
62
使用文档/其他/Kubernetes跨命名空间访问Service.md
Normal 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 来管理跨命名空间的访问。根据你的具体需求选择合适的方法。
|
||||
34
使用文档/其他/查看Kubernetes内所有特权容器.md
Normal file
34
使用文档/其他/查看Kubernetes内所有特权容器.md
Normal 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}'
|
||||
```
|
||||
|
||||
|
||||
|
||||
42
使用文档/其他/跨Namespace同步Secret和ConfigMap.md
Normal file
42
使用文档/其他/跨Namespace同步Secret和ConfigMap.md
Normal 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)
|
||||
|
||||
Reference in New Issue
Block a user