当前位置: 首页 > 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 部署在同一节点或区域的场景。

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

相关文章:

  • 算法复习——排列|组合|指数枚举
  • 架构设计的灵魂交响曲:系统设计各维度的深度解析与实战指南
  • 外卖订单如何教会我变量与数据类型?
  • 突破数据绝境:解锁永久删除文件重生
  • 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安装+使用
  • 新加坡公布新内阁名单,黄循财继续担任总理及财政部长
  • 见微知沪|高校当让优秀青年脱颖而出,让科研锚定国家需求
  • 欧盟和英国对俄新一轮制裁将中国公司也列入名单,外交部回应
  • A股三大股指高位震荡收涨:黄金股大涨,两市成交11735亿元
  • 围绕加快科创中心建设,上海市委中心组学习会听取专题辅导报告
  • 国家发改委:城市更新项目必须建立多元化多层级资金投入机制