当前位置: 首页 > news >正文

kubernetes高级实战二

一、实战部署

[root@master node]# cat pod-required-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app2: myapp2
    tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: IfNotPresent
[root@master node]# cat pod-required-affinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
    tier: db
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 3600"]
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app2
            operator: In
            values:
            - myapp2
        topologyKey: kubernetes.io/hostname

[root@master node]# kubectl get pods -owide
NAME         READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
pod-first    1/1     Running   0          12m     10.244.166.140   node1   <none>           <none>
pod-second   1/1     Running   0          3m13s   10.244.166.141   node1   <none>           <none>

二、代码解释

以下是对你提供的命令和配置文件的详细解释:

---

### 1. **部署第一个 Pod(`pod-first`)**
#### 配置文件 (`pod-required-affinity-demo-1.yaml`):
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app2: myapp2
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
```

#### 解释:
- **`metadata.labels`**:为 Pod 设置标签。
  - `app2: myapp2`:定义标签 `app2=myapp2`。
  - `tier: frontend`:定义标签 `tier=frontend`。
- **`spec.containers`**:定义容器。
  - `name: myapp`:容器名称为 `myapp`。
  - `image: ikubernetes/myapp:v1`:使用镜像 `ikubernetes/myapp:v1`。
  - `imagePullPolicy: IfNotPresent`:如果本地已有镜像,则不会从远程仓库拉取。

#### 操作:
```bash
kubectl apply -f pod-required-affinity-demo-1.yaml
```

#### 查看 Pod:
```bash
kubectl get pods -o wide
```
- 输出:
  ```
  NAME         READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
  pod-first    1/1     Running   0          12m     10.244.166.140   node1   <none>           <none>
  ```
  - Pod 状态为 `Running`,表示已成功调度到 `node1` 节点并运行。

---

### 2. **部署第二个 Pod(`pod-second`)**
#### 配置文件 (`pod-required-affinity-demo-2.yaml`):
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
    tier: db
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 3600"]
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app2
            operator: In
            values:
            - myapp2
        topologyKey: kubernetes.io/hostname
```

#### 解释:
- **`metadata.labels`**:为 Pod 设置标签。
  - `app: backend`:定义标签 `app=backend`。
  - `tier: db`:定义标签 `tier=db`。
- **`spec.containers`**:定义容器。
  - `name: busybox`:容器名称为 `busybox`。
  - `image: busybox:1.28`:使用镜像 `busybox:1.28`。
  - `command: ["sh","-c","sleep 3600"]`:容器启动后执行 `sleep 3600` 命令(保持容器运行 1 小时)。
- **`affinity.podAffinity`**:定义 Pod 亲和性规则。
  - **`requiredDuringSchedulingIgnoredDuringExecution`**:调度时必须满足的条件。
  - **`labelSelector`**:匹配其他 Pod 的标签。
    - `key: app2`:匹配标签键为 `app2` 的 Pod。
    - `operator: In`:标签值必须在 `values` 列表中(即 `myapp2`)。
  - **`topologyKey: kubernetes.io/hostname`**:指定拓扑域为节点主机名(`hostname`),即要求 Pod 必须调度到与匹配 Pod 相同的节点。

#### 操作:
```bash
kubectl apply -f pod-required-affinity-demo-2.yaml
```

#### 查看 Pod:
```bash
kubectl get pods -o wide
```
- 输出:
  ```
  NAME         READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
  pod-first    1/1     Running   0          12m     10.244.166.140   node1   <none>           <none>
  pod-second   1/1     Running   0          3m13s   10.244.166.141   node1   <none>           <none>
  ```
  - `pod-second` 状态为 `Running`,表示已成功调度到 `node1` 节点并运行。
  - 由于 `pod-second` 定义了 Pod 亲和性规则,它被调度到与 `pod-first` 相同的节点(`node1`)。

---

### 3. **Pod 亲和性规则的作用**
- **`podAffinity`**:用于定义 Pod 之间的亲和性规则。
  - **`requiredDuringSchedulingIgnoredDuringExecution`**:调度时必须满足的条件。
  - **`labelSelector`**:匹配其他 Pod 的标签。
  - **`topologyKey`**:指定拓扑域(如节点、区域等),用于限制 Pod 的调度范围。

- 在本例中:
  - `pod-second` 必须调度到与 `pod-first` 相同的节点(因为 `topologyKey: kubernetes.io/hostname`)。
  - `pod-second` 通过 `labelSelector` 匹配 `pod-first` 的标签 `app2=myapp2`。

---

### 4. **总结**
- **`pod-first`**:一个简单的 Pod,带有标签 `app2=myapp2` 和 `tier=frontend`。
- **`pod-second`**:通过 Pod 亲和性规则,强制调度到与 `pod-first` 相同的节点。
- **Pod 亲和性**:用于控制 Pod 之间的调度关系,适用于需要将某些 Pod 部署在同一节点或区域的场景。

如果还有其他问题,欢迎继续提问!

http://www.dtcms.com/a/79685.html

相关文章:

  • 算法复习——排列|组合|指数枚举
  • 架构设计的灵魂交响曲:系统设计各维度的深度解析与实战指南
  • 外卖订单如何教会我变量与数据类型?
  • 突破数据绝境:解锁永久删除文件重生
  • LLM 量化 cache管理
  • Super Logic Region (SLR) 在Xilinx FPGA架构
  • 对接股票金融数据源API
  • SPN专线+5G业务隔离+工作网+流量共享
  • 【算法day16】电话号码的字母组合
  • STC89C52单片机学习——第28节: [12-2] AT24C02数据存储秒表(定时器扫描按键数码管)
  • 回调函数中 qsort 函数的使用
  • dvwa的三个模式下sqlmap命令一把梭哈
  • 涨薪技术|Kubernetes(k8s)之yaml语法大全
  • 显示模块(LCD1602,OLED,四位数码管)
  • 腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践
  • 企业数字化转型规划设计1(107页PPT)(文末有下载方式)
  • FPGA时钟约束
  • 实时内核稳定性问题 - 压测异常重启问题
  • 取消Win10锁屏界面上显示的天气、市场和广告的操作
  • 【 C/C++ 包管理工具】vcpkg安装+使用
  • gradle-8.13
  • 【Java】TCP网络编程:从可靠传输到Socket实战
  • abaqus后处理导出多个节点数据的顺序
  • EtherCAT转Modbus网关如何在倍福plc组态快速配置
  • 【MCU】芯片复位与软件复位 在生产工装上的应用
  • 软考系统架构设计师之计算机组成与体系结构笔记
  • 蓝桥杯备考----小贪心+分类讨论问题---Popsicle
  • OAK相机入门(一):深度测距原理
  • lvgl学习(一)
  • xss-labs靶场训练