• K8S 之就绪探针(Readiness Probe)

    一个 Pod 创建之后,Service 马上就能选择它,并且请求也有可能转发到这个 Pod。然而,Pod 的启动很可能是需要时间的,在启动、加载、预热的过程中,如果有请求转发进来,这个请求很可能会失败。

    K8S 处理这个问题的办法是引入了就绪探针(Readiness Probe),readiness 这个词的词根不是“read”,而是“ready”,就是说这个 Pod ready 了没有。如果没 ready,请求就不转发给它;ready 之后,就可以转发给它。

    综合运用 Liveness Probe 和 Readiness Probe,可以让服务的自愈、启动、重启、升级更得心应手。

    就绪探针怎么判断 Pod 是否就绪?和存活探针(Liveness Probe)一样,常用的有 httpGet 和 exec 两种方式。

    httpGet

    顾名思义,K8S 通过发送 HTTP GET 请求,判断 Pod 是否就绪。若该请求收到 HTTP 2xx~3xx 状态码均判断为成功。下面是例子:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:latest
            name: container-0
            readinessProbe:
              httpGet:
                path: /health
                port: 8080
                scheme: HTTP           # 还可以是HTTPS
              initialDelaySeconds: 60  # 容器启动后要等待多少秒后探针才开始,默认是0秒,最小值是0
              timeoutSeconds: 10       # 探测超时的阈值。默认值是1秒。最小值是1
              periodSeconds: 30        # 每次执行探测的时间间隔(单位是秒)。默认是10秒。最小值 1
              successThreshold: 1      # 视为成功的最小连续成功次数。默认值是1。存活和启动探测的该值必须是1。最小值是1
              failureThreshold: 3      # 视为失败的最小连续失败次数。默认值是3。最小值是1

    exec

    还可以通过 linux 命令的方式来判断,若 error code = 0,则表明命令正常。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: registry.k8s.io/busybox
        args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 5
          periodSeconds: 5

    上面这个例子中,每 5s 会cat /tmp/healthy一次,30s 后该文件被删除,cat /tmp/healthy就会失败。

    相关参考

    1. K8S官方文档 除了 httpGet 和 exec,还有基于 TCP 端口和 gRPC 的探测方式
    2. https://support.huaweicloud.com/devg-cci/cci_05_0026.html
  • Docker 部署 Nginx+MariaDB(MySQL)+PHP 记录,与对应 docker-compose 实现

    Docker 火了这么多年,我也要学习体验一下。就在阿里云的服务器上部署一个 Nginx+MariaDB+PHP 环境吧。

    安装

    不同系统的安装方法见官方文档,包括了 Linux 的几个发行版和 Windows、MacOS 的详细步骤。我在 Linux 系统上安装。装完记得运行systemctl enable docker把 docker 调成自动启动。

    Docker Hub

    Docker 的各种 images 会发布在 Docker Hub,要善用这个网站来搜索想要的资源。

    网络

    在创建 docker 容器(container)之前,先考虑一下网络的架构。我打算创建 3 个容器:nginx、mariadb、php,其中,需要暴露的端口只有 nginx 容器的 80 (443) 端口。根据这篇文档中的:

    User-defined bridge networks are best when you need multiple containers to communicate on the same Docker host.

    我应该选择 bridge 网络,bridge 的具体的使用见此文档。在宿主机上运行

    docker network create --driver bridge my_bridge

    创建一个名称为 my_bridge 的bridge。

    Nginx

    先把 Nginx image 拉下来:docker pull nginx,默认会拉 latest 这个 tag (tags 可以在 Docker Hub 先搜索 nginx 然后点进去找到)。

    接下来创建容器:

    docker run --name my_nginx --network my_bridge -p 80:80 -v /var/www/php_env:/usr/share/nginx/html -e TZ="Asia/Shanghai" -d --restart always nginx

    参数解释:(详情见文档

    --name my_nginx           容器命名为my_nginx
    --network my_bridge       连接到my_bridge网络
    -p 80:80                  把容器的80端口(后)暴露为宿主机的80端口(前)
    -v /var/www/php_env:/usr/share/nginx/html   把宿主机的目录(前)mount到容器的指定路径
    -e TZ="Asia/Shanghai"     设置环境变量
    -d                        在后台运行
    --restart always          自动启动、重启
    nginx                     image名称

    如无意外,浏览器可以访问http://服务器IP的网页了。

    阅读更多…