​[​kubernetes]

kubernetes

Pod 生命周期

init容器

[root@master ~]# vim web1.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  initContainers:                 # 定义初始化任务

  - name: task1                   # 如果初始化任务失败,主容器不会启动

    image: myos:latest            # 初始化可以使用不同的镜像

    command: [sh]                 # 任务,一般用脚本实现

    args:                         # 任务

    - -c                          # 任务

    - |                           # 任务

      ID=${RANDOM}                # 任务

      echo "${ID}"                # 任务

      sleep 3                     # 任务

      exit $((ID%2))              # 状态 0 成功,其他失败,如果失败会重新执行初始化

  containers:

  - name: web

image: myos:httpd

[root@master ~]# kubectl replace --force -f web1.yaml

pod "web1" deleted

pod/web1 replaced

# 如果初始化任务失败就重复执行,直到成功为止

[root@master ~]# kubectl get pods -w

初始化失败

[root@master ~]# vim web1.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  restartPolicy: Never            # 任务失败不重启

  initContainers:

  - name: task1

    image: myos:latest

    command: [sh]

    args:

    - -c

    - |

      ID=${RANDOM}

      echo "${ID}"

      sleep 3

      exit $((ID%2))

  containers:

  - name: web

    image: myos:httpd

[root@master ~]# kubectl replace --force -f web1.yaml

pod "web1" deleted

pod/web1 replaced

# 初始化任务失败,main 容器不会运行

[root@master ~]# kubectl get pods -w

NAME   READY   STATUS       RESTARTS        AGE

web1   0/1     Init:0/1          0          1s

web1   0/1     Init:Error        0          5s

  • 多任务初始化

[root@master ~]# vim web1.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  restartPolicy: Always

  initContainers:

  - name: task1                # 任务一

    image: myos:latest

    command: [sh]

    args:

    - -c

    - |

      ID=${RANDOM}

      echo "${ID}"

      sleep 3

      exit $((ID%2))

  - name: task2                # 任务二,多个任务顺序执行

    image: myos:8.5

    command: [sh]

    args:

    - -c

    - |

      ID=${RANDOM}

      echo "${ID}"

      sleep 3

      exit $((ID%2))

  containers:

  - name: web

    image: myos:httpd

[root@master ~]# kubectl replace --force -f web1.yaml

pod "web1" deleted

pod/web1 replaced

# 多任务顺序执行,必须全部成功后

[root@master ~]# kubectl get pods -w

NAME   READY   STATUS            RESTARTS     AGE

web1   0/1     Init:0/2          0            1s

web1   0/1     Init:Error        0            5s

web1   0/1     Init:0/2          1 (1s ago)   6s

web1   0/1     Init:1/2          1 (5s ago)   10s

web1   0/1     Init:1/2          1            11s

web1   0/1     Init:Error        1            14s

web1   0/1     Init:1/2          2 (1s ago)   15s

web1   0/1     PodInitializing   0            18s

web1   1/1     Running           0            19s

启动探针

# 用于保护慢启动的服务

[root@master ~]# vim web2.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: web2

spec:

  containers:

  - name: web

    image: myos:httpd

    startupProbe:                 # 启动探针

      initialDelaySeconds: 30     # 首次检查延时

      failureThreshold: 3         # 可失败的次数

      periodSeconds: 10           # 检查间隔

      tcpSocket:                  # 使用 tcp 协议检测

        port: 80                  # 端口号

[root@master ~]# kubectl apply -f web2.yaml

pod/web2 created

[root@master ~]# kubectl get pods -w

NAME   READY   STATUS      RESTARTS      AGE

web2   0/1     Running     0             1s

web2   1/1     Running     0             41s

存活探针

# 判断某个核心资源是否可用,在 Pod 的全部生命周期中(重建容器)

[root@master ~]# vim web2.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: web2

spec:

  containers:

  - name: web

    image: myos:httpd

    startupProbe:

      initialDelaySeconds: 30

      failureThreshold: 3

      periodSeconds: 10

      tcpSocket:

        port: 80

    livenessProbe:                # 定义存活探针

      timeoutSeconds: 3           # 服务影响超时

      httpGet:                    # 使用 HTTP 协议检测

        path: /info.php           # 请求的 URL 路径

        port: 80                  # 服务端口号

[root@master ~]# kubectl apply -f web2.yaml

pod/web2 created

[root@master ~]# kubectl get pods -w

NAME   READY   STATUS    RESTARTS      AGE

web2   0/1     Running   0             5s

web2   1/1     Running   0             41s

web2   0/1     Running   1 (1s ago)    112s

web2   0/1     Running   1 (30s ago)   2m21s

web2   1/1     Running   1 (30s ago)   2m21s

# 在其他终端执行测试

[root@master ~]# kubectl exec -it web2 -- rm -f info.php

就绪探针

# 附加条件检测,在 Pod 的全部生命周期中(禁止调用,不重启)

[root@master ~]# vim web2.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: web2

spec:

  containers:

  - name: web

    image: myos:httpd

    startupProbe:

      initialDelaySeconds: 30

      failureThreshold: 3

      periodSeconds: 10

      tcpSocket:

        port: 80

    livenessProbe:

      timeoutSeconds: 3

      httpGet:

        path: /info.php

        port: 80

    readinessProbe:               # 定义就绪探针

      failureThreshold: 3         # 失败确认次数

      periodSeconds: 5            # 检测间隔

      exec:                       # 执行命令进行检测

        command:                  # 检测命令

        - sh

        - -c

        - |

          read ver </var/www/html/version.txt

          if (( ${ver:-0} > 2 ));then

             res=0

          fi

          exit ${res:-1}          # 版本大于 2 成功,否则失败

[root@master ~]# kubectl replace --force -f web2.yaml

pod/web2 created

[root@master ~]# kubectl get pods -w

NAME   READY   STATUS    RESTARTS   AGE

web2   0/1     Running   0          5s

web2   0/1     Running   0          40s

web2   1/1     Running   0          60s

web2   0/1     Running   0          90s

# 在其他终端执行测试

[root@master ~]# kubectl exec -it web2 -- bash

[root@web2 ~]# echo "3" >/var/www/html/version.txt

[root@web2 ~]# echo "1" >/var/www/html/version.txt

事件处理函数

# 在主容器启动之后或结束之前执行的附加操作

[root@master ~]# vim web3.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: web3

spec:

  containers:

  - name: web

    image: myos:httpd

    lifecycle:                    # 定义启动后事件处理函数

      postStart:

        exec:

          command:

          - sh

          - -c

          - |

            echo "自动注册服务" |tee -a /tmp/web.log

            sleep 10

      preStop:                    # 定义关闭前事件处理函数

        exec:

          command:

          - sh

          - -c

          - |

            echo "清除已注册的服务" |tee -a /tmp/web.log

            sleep 10

[root@master ~]# kubectl apply -f web3.yaml

pod/web3 created

[root@master ~]# kubectl exec -it web3 -- bash

[root@web3 html]# cat /tmp/web.log

自动注册服务

[root@web3 html]# cat /tmp/web.log

自动注册服务

清除已注册的服务

# 在其他终端执行

[root@master ~]# kubectl delete pods web3

pod "web3" deleted

Pod 资源管理

  • 拷贝 public/memtest.py 到 master
    rsync -av public/memtest.py 192.168.88.50:/root/

# 创建 Pod

[root@master ~]# vim app.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: app

spec:

  containers:

  - name: web

    image: myos:httpd

[root@master ~]# kubectl apply -f app.yaml

pod/app created

# 使用 memtest.py 占用内存资源

[root@master ~]# kubectl cp memtest.py app:/usr/bin/

[root@master ~]# kubectl exec -it app -- bash

[root@app html]# memtest.py 1000

use memory success

press any key to exit :

# 使用 info.php 占用计算资源

[root@master ~]# curl http://10.244.1.10/info.php?id=9999999

# 在另一个终端监控

[root@master ~]# watch -n 1 'kubectl top pods'

NAME   CPU(cores)   MEMORY(bytes)      

app    993m         19Mi

app    3m           1554Mi

资源配额

[root@master ~]# vim app.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: app

spec:

  containers:

  - name: web

    image: myos:httpd

    resources:                  # 配置资源策略

      requests:                 # 配额策略

        cpu: 1500m              # 计算资源配额

        memory: 800Mi           # 内存资源配额

[root@master ~]# kubectl replace --force -f app.yaml

pod "app" deleted

pod/app replaced

[root@master ~]# kubectl describe pods app

......

    Ready:          True

    Restart Count:  0

    Requests:

      cpu:          1500m

      memory:       800Mi

  • 验证配额策略

[root@master ~]# sed "s,app,app1," app.yaml |kubectl apply -f -

pod/app1 created

[root@master ~]# sed "s,app,app2," app.yaml |kubectl apply -f -

pod/app2 created

[root@master ~]# sed "s,app,app3," app.yaml |kubectl apply -f -

pod/app3 created

[root@master ~]# kubectl get pods

NAME   READY   STATUS    RESTARTS   AGE

app    1/1     Running   0          18s

app1   1/1     Running   0          16s

app2   1/1     Running   0          15s

app3   0/1     Pending   0          12s

# 清理实验配置

[root@master ~]# kubectl delete pod --all

资源限额

[root@master ~]# vim app.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: app

spec:

  containers:

  - name: web

    image: myos:httpd

    resources:                  # 配置资源策略

      limits:                   # 限额策略

        cpu: 600m               # 计算资源限额

        memory: 800Mi           # 内存资源限额

        

[root@master ~]# kubectl replace --force -f app.yaml

pod "app" deleted

pod/app replaced

[root@master ~]# kubectl describe pods app

......

    Ready:          True

    Restart Count:  0

    Limits:

      cpu:          600m

      memory:       800Mi

    Requests:

      cpu:          600m

      memory:       800Mi

  • 验证资源限额

[root@master ~]# kubectl cp memtest.py app:/usr/bin/

[root@master ~]# kubectl exec -it app -- bash

[root@app html]# memtest.py 700

use memory success

press any key to exit :

[root@app html]# memtest.py 1000

Killed

[root@master ~]# curl http://10.244.1.10/info.php?id=9999999

# 在其他终端查看

[root@master ~]# watch -n 1 'kubectl top pods'

NAME   CPU(cores)   MEMORY(bytes)  

app    600m         19Mi  

# 清理实验 Pod

[root@master ~]# kubectl delete pods --all

pod "app" deleted

Pod 服务质量

BestEffort

[root@master ~]# vim app1.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: app1

spec:

  containers:

  - name: web

    image: myos:httpd

[root@master ~]# kubectl apply -f app1.yaml

pod/app1 created

[root@master ~]# kubectl describe pods app1 |grep QoS

QoS Class:                   BestEffort

Burstable

[root@master ~]# vim app2.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: app2

spec:

  containers:

  - name: web

    image: myos:httpd

    resources:

      requests:

        cpu: 400m

        memory: 200Mi

[root@master ~]# kubectl apply -f app2.yaml

pod/app2 created

[root@master ~]# kubectl describe pods app2 |grep QoS

QoS Class:                   Burstable

Guaranteed

[root@master ~]# vim app3.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: app3

spec:

  containers:

  - name: web

    image: myos:httpd

    resources:

      requests:

        cpu: 200m

        memory: 200Mi

      limits:

        cpu: 200m

        memory: 200Mi

[root@master ~]# kubectl apply -f app3.yaml

pod/app3 created

[root@master ~]# kubectl describe pods app3 |grep QoS

QoS Class:                   Guaranteed

Quota 资源管理

全局资源配额

[root@master ~]# vim quota.yaml

---

kind: ResourceQuota

apiVersion: v1

metadata:

  name: myquota1

  namespace: work

spec:

  hard:

    pods: 3

  scopes:

  - BestEffort

[root@master ~]# kubectl create namespace work

namespace/work created

[root@master ~]# kubectl apply -f quota.yaml

resourcequota/myquota1 created

# 查看配额信息

[root@master ~]# kubectl describe namespaces work

......

Resource Quotas

  Name:     myquota1

  Scopes:   BestEffort

  * Matches all pods that do not have resource requirements set. These pods have a best effort quality of service.

  Resource  Used  Hard

  --------  ---   ---

  pods      0     3

  • 验证配额策略

[root@master ~] sed 's,app1,app11,' app1.yaml |kubectl -n work apply -f -

[root@master ~] sed 's,app1,app12,' app1.yaml |kubectl -n work apply -f -

[root@master ~]sed 's,app1,app13,' app1.yaml |kubectl -n work apply -f -

[root@master ~]sed 's,app1,app14,' app1.yaml |kubectl -n work apply -f -

Error from server (Forbidden): error when creating "STDIN": pods "app14" is forbidden: exceeded quota: myquota1, requested: pods=1, used: pods=3, limited: pods=3

[root@master ~]sed 's,app3,app31,' app3.yaml |kubectl -n work apply -f -

[root@master ~]sed 's,app3,app32,' app3.yaml |kubectl -n work apply -f -

服务质量配额

[root@master ~]# vim quota.yaml

---

kind: ResourceQuota

apiVersion: v1

metadata:

  name: myquota1

  namespace: work

spec:

  hard:

    pods: 3

  scopes:

  - BestEffort

---

kind: ResourceQuota

apiVersion: v1

metadata:

  name: myquota2

  namespace: work

spec:

  hard:

    pods: 10

    cpu: 2300m

    memory: 3Gi

  scopes:

  - NotBestEffort

# 更新配额策略

[root@master ~]# kubectl apply -f quota.yaml

resourcequota/myquota1 configured

resourcequota/myquota2 created

# 查看配额信息

[root@master ~]# kubectl describe namespace work

......

Resource Quotas

  Name:     myquota1

  Scopes:   BestEffort

  * Matches all pods that do not have resource requirements set. These pods have a best effort quality of service.

  Resource  Used  Hard

  --------  ---   ---

  pods      3     3

  Name:     myquota2

  Scopes:   NotBestEffort

  * Matches all pods that have at least one resource requirement set. These pods have a burstable or guaranteed quality of service.

  Resource  Used  Hard

  --------  ---   ---

  cpu       400   2300m

  memory    400   3Gi

  pods      2     10

  • 验证配额策略

[root@master ~]sed 's,app2,app21,' app2.yaml |kubectl -n work apply -f -

[root@master ~]sed 's,app2,app22,' app2.yaml |kubectl -n work apply -f -

[root@master ~] sed 's,app2,app23,' app2.yaml |kubectl -n work apply -f -

[root@master ~]sed 's,app2,app24,' app2.yaml |kubectl -n work apply -f -

[root@master ~]sed 's,app2,app25,' app2.yaml |kubectl -n work apply -f -

Error from server (Forbidden): error when creating "STDIN": pods "app25" is forbidden: exceeded quota: myquota2, requested: cpu=400m, used: cpu=2, limited: cpu=2300m

  • 清理实验配置

[root@master ~]# kubectl -n work delete pods --all

[root@master ~]# kubectl delete namespace work

namespace "work" deleted

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值