K8S 之 Pod的进阶

一、Pod容器拆分

1、现有yaml文件,一个POD两个容器(需将应用与数据库分离)

apiVersion: v1                      #该Pod的版本信息,可通过命令查看
kind: Pod                             #创建一个pod的资源
metadata:
  name: myblog                    #该pod资源的名称
  namespace: kang              #该pod资源的命名空间
  labels:
    component: myblog        #该pod资源的label标签归属
spec:                                   #为该pod资源定义精确的信息
  containers:                        #定义为容器
  - name: app                #第一个容器的名称
    image: 10.3.153.200:5000/myblog:v1              #容器的镜像拉取
    env:                                            #该容器内的环境变量传输
    - name: MYSQL_HOST
      value: "127.0.0.1"                     #因一个pod下的容器,可直接访问本地数据库
    - name: MYSQL_PASSWD
      value: "123456"
    ports:                                           #容器定义发布端口,类同于expose
    - containerPort: 8003
  - name: mysql                    #第二个容器的名称
    image: 10.3.153.200:5000/mysql:5.7-utf8
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"
    - name: MYSQL_DATABASE
      value: "myblog"

2、数据库yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  namespace: kang
  labels:
    component: mysql           #用于固定某个host主机nodes节点运行
spec:
  hostNetwork: true # 声明pod的网络模式为host模式,效果同docker run --net=host
  nodeSelector:   # 使用节点选择器将Pod调度到指定label的节点
    component: mysql
  containers:
  - name: mysql
    image: 10.3.153.200:5000/mysql:5.7-utf8
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"
    - name: MYSQL_DATABASE
      value: "myblog"

3、应用yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: app
  namespace: kang
  labels:
    component: myblog
spec:
  containers:
  - name: myblog
    image: 10.3.153.200:5000/myblog:v1
    imagePullPolicy: IfNotPresent
    env:
    - name: MYSQL_HOST   #  指定root用户的用户名
      value: "10.3.153.201"     #为nodeSelector选择节点的主机IP
    - name: MYSQL_PASSWD
      value: "123456"
    ports:
    - containerPort: 8002

3、pod创建后的测试结果

K8S  之 Pod的进阶
K8S  之 Pod的进阶

二、Pod服务健康检查

两种检测机制、三种检查方法(需依赖相应的检测机制)

1、LivenessProbe探针 存活性探测机制

用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启,如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。

...
containers:
- name: myblog
  image: 10.3.153.200:5000/myblog:v1
  livenessProbe:
    httpGet:
      path: /blog/index/
      port: 8002
      scheme: HTTP
    initialDelaySeconds: 10  # 容器启动后第一次执行探测是需要等待多少秒
    periodSeconds: 10   # 执行探测的频率
    timeoutSeconds: 2       # 探测超时时间
...

2、ReadinessProbe探针 可用性探测机制

用于判断容器是否正常提供服务,即容器的Ready是否为True,是否可以接收请求,如果ReadinessProbe探测失败,则容器的Ready将为False, Endpoint Controller 控制器将此Pod的Endpoint从对应的service的Endpoint列表中移除,不再将任何请求调度此Pod上,直到下次探测成功。(剔除此pod不参与接收请求不会将流量转发给此Pod)。

...
containers:
- name: myblog
  image: 192.168.136.10:5000/myblog:v1
  readinessProbe: 
    httpGet: 
      path: /blog/index/
      port: 8002
      scheme: HTTP
    initialDelaySeconds: 10 
    timeoutSeconds: 2
    periodSeconds: 10
...

3、健康检查的三种方法(需嵌套ReadinessProbe与LivenessProbes检测机制)

exec:通过执行命令来检查服务是否正常,返回值为0则表示容器健康
httpGet方式:通过发送http请求检查服务是否正常,返回200-399状态码则表明容器健康
tcpSocket:通过容器的IP和Port执行TCP检查,如果能够建立TCP连接,则表明容器健康
#加上两个健康检测机制livenessProbe&readinessProbe
apiVersion: v1
kind: Pod
metadata:
  name: app
  namespace: kang
  labels:
    component: myblog
spec:
  containers:
  - name: myblog
    image: 10.3.153.200:5000/myblog:v1
    imagePullPolicy: IfNotPresent
    env:
    - name: MYSQL_HOST   #  指定root用户的用户名
      value: "10.3.153.201"
    - name: MYSQL_PASSWD
      value: "123456"
    ports:
    - containerPort: 8002
    livenessProbe:
      httpGet:
        path: /blog/index/
        port: 8002
        scheme: HTTP
      initialDelaySeconds: 10  # 容器启动后第一次执行探测是需要等待多少秒
      periodSeconds: 15     # 执行探测的频率
      timeoutSeconds: 2     # 探测超时时间
    readinessProbe:
      httpGet:
        path: /blog/index/
        port: 8002
        scheme: HTTP
      initialDelaySeconds: 10
      timeoutSeconds: 2
      periodSeconds: 15

4、状态分析

1、重建app容器,并查看状态信息
K8S  之 Pod的进阶

2、验证ReadinessProbe探针功能(删除mysql数据库容器)
K8S  之 Pod的进阶

3、重启mysql容器,状态恢复
K8S  之 Pod的进阶

三、Pod重启策略

Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。 Pod的重启策略包括Always、OnFailure和Never,默认值为Always。

Always:当容器进程退出后,由kubelet自动重启该容器;
OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器;
Never:不论容器运行状态如何,kubelet都不会重启该容器。

四、Pod资源限制

1、资源限制的作用

为了保证充分利用集群资源,且确保重要容器在运行周期内能够分配到足够的资源稳定运行,因此平台需要具备。
Pod的资源限制的能力。 对于一个pod来说,资源最基础的2个的指标就是:CPU和内存。
Kubernetes提供了个采用requests和limits 两种类型参数对资源进行预分配和使用限制。

2、yaml文件参考


  containers:
  - name: myblog
    image: 192.168.136.10:5000/myblog
    env:
    - name: MYSQL_HOST   #  指定root用户的用户名
      value: "127.0.0.1"
    - name: MYSQL_PASSWD
      value: "123456"
    ports:
    - containerPort: 8002
    resources:
      requests:
        memory: 100Mi
        cpu: 50m
      limits:
        memory: 500Mi
        cpu: 100m

3、requests与limits的作用

K8S  之 Pod的进阶

猜你喜欢

转载自blog.51cto.com/12965094/2639139