Kubernetes精讲之pod管理及优化

目录

一kubernetes 中的资源

1.1 资源管理介绍

1.2 资源管理方式

1.2.1 命令式对象管理

1.2.2 资源类型

1.2.3 基本命令示例

1.2.4运行和调试命令示例

1.2.5 高级命令示例

二什么是pod

2.1 创建自主式pod(生产不推荐)

2.2 利用控制器管理pod(推荐)

2.3应用版本的更新

2.4 利用yaml文件部署应用

2.4.1 用yaml文件部署应用有以下优点

2.4.2 资源清单参数

2.4.3 如何获得资源帮助

2.4.4 编写示例

2.4.4.1 示例1:运行简单的单个容器pod

2.4.4.2 示例2:运行多个容器pod

2.4.4.3 示例3:理解pod间的网络整合

2.4.4.4 示例4:端口映射

2.4.4.5 示例5:如何设定环境变量

2.4.4.6 示例6:资源限制

2.4.4.7 示例7 容器启动管理

2.4.4.8 示例8 选择运行节点

2.4.4.9 示例9 共享宿主机网络

三 pod的生命周期

3.1 INIT 容器

3.1.1 INIT 容器的功能

3.1.2 INIT 容器示例

3.2 探针

3.2.1 探针实例

3.2.1.1 存活探针示例

3.2.1.2 就绪探针示例:


一kubernetes 中的资源

1.1 资源管理介绍

·在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

·kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务

·所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。

·kubernetes的最小管理单元是pod而不是容器,只能将容器放在 Pod中

·kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。

·Pod中服务服务的访问是由kubernetes提供的 service 资源来实现。

·Pod中程序的数据需要持久化是由kubernetes提供的各种存储系统来实现

1.2 资源管理方式

·命令式对象管理:直接使用命令去操作kubernetes资源

kubectl run nginx-pod --image=nginx:latest --port=80

·命令式对象配置:通过命令配置和配置文件去操作kubernetes资源

kubectl create/patch -f nginx-pod.yaml

·声明式对象配置:通过apply命令和配置文件去操作kubernetes资源

kubect1 apply -f nginx-pod.yam1

再次使用apply声明后资源可以更新

1.2.1 命令式对象管理

kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器

化应用的安装部署

kubectl命令的语法如下:

kubectl [command][type][name][flags]

comand:指定要对资源执行的操作,例如create、get、delete

type:指定资源类型,比如deployment、pod、service

name:指定资源的名称,名称大小写敏感

flags:指定额外的可选参数

#查看所有pod
kubectl get pod

#查看某个pod
kubectl get pod pod_name

#查看某个pod,以yam1格式展示结果
kubectl get pod pod_name -o yam]

1.2.2 资源类型

kubernetes中所有的内容都抽象为资源

kubectl api-resources

常用资源类型

kubect 常见命令操作

常用命令:

建立控制器并自动运行pod

kubectl create deployment haha --image nginx

查看pod

kubectl get pods

查看控制器

kubectl get deployments.apps

编辑控制器配置

kubectl edit deployments.apps web1

删除控制器

kubectl delete deployments.apps web1

运行pod

kubectl run haha --image nginx

查看服务

kubectl get services

删除pod

kubectl delete pods nginx

1.2.3 基本命令示例

运行前先导入练习镜像

[root@K8s-master ~]# docker load -i myapp.tar.gz
[root@K8s-master ~]# docker load -i busyboxplus.tar.gz

[root@K8s-master ~]# docker tag timinglee/myapp:v1 reg.harbor.org/library/myapp:v1
[root@K8s-master ~]# docker tag timinglee/myapp:v2 reg.harbor.org/library/myapp:v2
[root@K8s-master ~]# docker tag busyboxplus:latest reg.harbor.org/library/busyboxplus:latest

[root@K8s-master ~]# docker push reg.harbor.org/library/myapp:v1
[root@K8s-master ~]# docker push reg.harbor.org/library/myapp:v2
[root@K8s-master ~]# docker push reg.harbor.org/library/busyboxplus:latest

kubectl的详细说明地址:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-comma

nds

显示集群版本

[root@K8s-master ~]# kubectl version 
Client Version: v1.30.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.0

显示集群信息

[root@K8s-master ~]# kubectl cluster-info 
Kubernetes control plane is running at https://172.25.254.100:6443
CoreDNS is running at https://172.25.254.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

创建一个webcluster控制器,控制器中pod的数量为2

[root@K8s-master ~]# kubectl create deployment webcluseter --image nginx --replicas 2
deployment.apps/webcluseter created

[root@K8s-master ~]# kubectl get deployments.apps webcluseter 
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
webcluseter   2/2     2            2           49s

查看控制器

[root@K8s-master ~]# kubectl get deployments.apps 
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
webcluseter   2/2     2            2           106s

查看资源帮助

[root@K8s-master ~]# kubectl explain deployment
GROUP:      apps
KIND:       Deployment
VERSION:    v1

DESCRIPTION:
    Deployment enables declarative updates for Pods and ReplicaSets.
    
FIELDS:
  apiVersion	<string>
    APIVersion defines the versioned schema of this representation of an object.
    Servers should convert recognized schemas to the latest internal value, and
    may reject unrecognized values. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

  kind	<string>
    Kind is a string value representing the REST resource this object
    represents. Servers may infer this from the endpoint the client submits
    requests to. Cannot be updated. In CamelCase. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

  metadata	<ObjectMeta>
    Standard object's metadata. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

  spec	<DeploymentSpec>
    Specification of the desired behavior of the Deployment.

  status	<DeploymentStatus>
    Most recently observed status of the Deployment.

查看控制器参数帮助

[root@K8s-master ~]# kubectl explain deployment.spec
GROUP:      apps
KIND:       Deployment
VERSION:    v1

FIELD: spec <DeploymentSpec>


DESCRIPTION:
    Specification of the desired behavior of the Deployment.
    DeploymentSpec is the specification of the desired behavior of the
    Deployment.
    
FIELDS:
  minReadySeconds	<integer>
    Minimum number of seconds for which a newly created pod should be ready
    without any of its container crashing, for it to be considered available.
    Defaults to 0 (pod will be considered available as soon as it is ready)

  paused	<boolean>
    Indicates that the deployment is paused.

  progressDeadlineSeconds	<integer>
    The maximum time in seconds for a deployment to make progress before it is
    considered to be failed. The deployment controller will continue to process
    failed deployments and a condition with a ProgressDeadlineExceeded reason
    will be surfaced in the deployment status. Note that progress will not be
    estimated during the time a deployment is paused. Defaults to 600s.

  replicas	<integer>
    Number of desired pods. This is a pointer to distinguish between explicit
    zero and not specified. Defaults to 1.

  revisionHistoryLimit	<integer>
    The number of old ReplicaSets to retain to allow rollback. This is a pointer
    to distinguish between explicit zero and not specified. Defaults to 10.

  selector	<LabelSelector> -required-
    Label selector for pods. Existing ReplicaSets whose pods are selected by
    this will be the ones affected by this deployment. It must match the pod
    template's labels.

  strategy	<DeploymentStrategy>
    The deployment strategy to use to replace existing pods with new ones.

  template	<PodTemplateSpec> -required-
    Template describes the pods that will be created. The only allowed
    template.spec.restartPolicy value is "Always".

编辑控制器配置

[root@K8s-master ~]# kubectl edit deployments.apps webcluseter
........
spec:
  progressDeadlineSeconds: 600
  replicas: 3  #2改为了3
........

#查看
[root@K8s-master ~]# kubectl get deployments.apps 
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
webcluseter   3/3     3            3           7m22s

利用补丁更改控制器配置

[root@K8s-master ~]# kubectl patch deployments.apps webcluseter -p '{"spec":{"replicas":4}}'
deployment.apps/webcluseter patched

#查看
[root@K8s-master ~]# kubectl get deployments.apps 
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
webcluseter   4/4     4            4           9m8s

删除资源

[root@K8s-master ~]# kubectl delete deployments.apps webcluseter 
deployment.apps "webcluseter" deleted
[root@K8s-master ~]# kubectl get deployments.apps 
No resources found in default namespace.

1.2.4运行和调试命令示例

运行pod

[root@K8s-master ~]# kubectl run testpod --image nginx
Error from server (AlreadyExists): pods "testpod" already exists

#查看
[root@K8s-master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
testpod   1/1     Running   0          66m

端口暴露

#查看服务
[root@K8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8h


[root@K8s-master ~]# kubectl expose pod testpod --port 80 --target-port 80 
service/testpod exposed

#再次查看

[root@K8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   9h
testpod      ClusterIP   10.110.40.158   <none>        80/TCP    84s

查看资源详细信息

[root@K8s-master ~]# kubectl describe pods testpod 
Name:             testpod
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s-node1/172.25.254.10
Start Time:       Tue, 03 Sep 2024 09:44:44 +0800
Labels:           run=testpod
Annotations:      <none>
Status:           Running
IP:               10.244.1.4
IPs:
  IP:  10.244.1.4
Containers:
  testpod:
    Container ID:   docker://c1b57e1ddad69634a79eac41cad6c8419eeec1741d47a60a277394540976698d
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:127262f8c4c716652d0e7863bba3b8c45bc9214a57d13786c854272102f7c945
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 03 Sep 2024 09:45:03 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kx6kr (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True 
  Initialized                 True 
  Ready                       True 
  ContainersReady             True 
  PodScheduled                True 
Volumes:
  kube-api-access-kx6kr:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:                      <none>

查看资源日志

[root@K8s-master ~]# kubectl logs pods/testpod 
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/09/03 01:45:03 [notice] 1#1: using the "epoll" event method
2024/09/03 01:45:03 [notice] 1#1: nginx/1.27.1
2024/09/03 01:45:03 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 
2024/09/03 01:45:03 [notice] 1#1: OS: Linux 5.14.0-427.13.1.el9_4.x86_64
2024/09/03 01:45:03 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2024/09/03 01:45:03 [notice] 1#1: start worker processes
2024/09/03 01:45:03 [notice] 1#1: start worker process 29
2024/09/03 01:45:03 [notice] 1#1: start worker process 30
2024/09/03 01:45:03 [notice] 1#1: start worker process 31
2024/09/03 01:45:03 [notice] 1#1: start worker process 32

运行交互pod

[root@K8s-master ~]# kubectl run -it testpod1 --image busybox
If you don't see a command prompt, try pressing enter.
/ # 
/ #  #curl+pq退出不停止

运行非交互pod

[root@K8s-master ~]# kubectl run nginx --image nginx
pod/nginx created

进入已经运行的容器,且容器有交互环境

[root@K8s-master ~]# kubectl attach pods/testpod1 -it
If you don't see a command prompt, try pressing enter.
/ # 
/ # 
/ # 

在已经运行的pod中运行指定命令

[root@K8s-master ~]# kubectl exec -it pods/nginx /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx:/# 

日志文件到pod中

[root@K8s-master ~]# kubectl exec -it pods/nginx /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx:/# ls
anaconda-ks.cfg  boot  docker-entrypoint.d   etc   lib	  media  opt   root  sbin  sys	usr
bin		 dev   docker-entrypoint.sh  home  lib64  mnt	 proc  run   srv   tmp	var
root@nginx:/# 

复制pod中的文件到本机

[root@K8s-master ~]# kubectl cp nginx:/anaconda-ks.cfg anaconda-ks.cfg

删除pods

[root@K8s-master ~]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
nginx      1/1     Running   0          6m5s
testpod    1/1     Running   0          82m
testpod1   1/1     Running   0          7m28s
[root@K8s-master ~]# kubectl delete pods nginx
pod "nginx" deleted
[root@K8s-master ~]# kubectl delete pods testpod
pod "testpod" deleted
[root@K8s-master ~]# kubectl delete pods testpod1
pod "testpod1" deleted
[root@K8s-master ~]# kubectl get pods
No resources found in default namespace.

1.2.5 高级命令示例

利用命令生成yaml模板文件

[root@K8s-master ~]# kubectl create deployment web1 --image nginx --dry-run=client -o yaml > web1.yml
[root@K8s-master ~]# ls web1.yml 
web1.yml

利用yaml文件生成资源

[root@K8s-master ~]# vim web1.yml
#修改一下
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web1
  name: web1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web1
  template:
    metadata:
      labels:
        app: web1
    spec:
      containers:
      - image: nginx
        name: nginx

#创建控制器
[root@K8s-master ~]# kubectl apply -f web1.yml 
deployment.apps/web1 created

#查看控制器
[root@K8s-master ~]# kubectl get deployments.apps 
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web1   2/2     2            2           11s

#删除
[root@K8s-master ~]# kubectl delete -f web1.yml 
deployment.apps "web1" deleted

管理资源标签

#建立一个pod
[root@K8s-master ~]# kubectl run nginx --image nginx
pod/nginx created
#查看pod
[root@K8s-master ~]# kubectl get pods 
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          19s

#查看标签
[root@K8s-master ~]# kubectl get pods --show-labels 
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          30s   run=nginx

#更改标签
[root@K8s-master ~]# kubectl label pods nginx app=web --overwrite 
pod/nginx labeled
[root@K8s-master ~]# kubectl get pods --show-labels 
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          2m40s   app=web,run=nginx

#删除标签
[root@K8s-master ~]# kubectl label pods nginx app-
pod/nginx unlabeled
[root@K8s-master ~]# kubectl get pods --show-labels 
NAME    READY   STATUS    RESTARTS   AGE    LABELS
nginx   1/1     Running   0          112m   run=nginx

标签时控制器识别pod示例的标识

[root@K8s-master ~]# kubectl create deployment haha --image myapp:v1 --replicas 2
deployment.apps/haha created
[root@K8s-master ~]# kubectl get pods --show-labels 
NAME                    READY   STATUS    RESTARTS   AGE    LABELS
haha-5ddc8d69f9-ssbbw   1/1     Running   0          4s     app=haha,pod-template-hash=5ddc8d69f9
haha-5ddc8d69f9-vhhvb   1/1     Running   0          4s     app=haha,pod-template-hash=5ddc8d69f9
nginx                   1/1     Running   0          117m   run=nginx

#删除pod上的标签
[root@K8s-master ~]# kubectl get pods --show-labels 
NAME                    READY   STATUS    RESTARTS   AGE     LABELS
haha-5ddc8d69f9-ssbbw   1/1     Running   0          2m23s   app=haha,pod-template-hash=5ddc8d69f9
haha-5ddc8d69f9-vhhvb   1/1     Running   0          2m23s   app=haha,pod-template-hash=5ddc8d69f9
nginx                   1/1     Running   0          120m    run=nginx
[root@K8s-master ~]# kubectl label pods haha-5ddc8d69f9-ssbbw app-
pod/haha-5ddc8d69f9-ssbbw unlabeled

#控制器会重新启动新的pod
[root@K8s-master ~]# kubectl get pods --show-labels 
NAME                    READY   STATUS    RESTARTS   AGE    LABELS
haha-5ddc8d69f9-ssbbw   1/1     Running   0          3m1s   pod-template-hash=5ddc8d69f9
haha-5ddc8d69f9-sw89n   1/1     Running   0          34s    app=haha,pod-template-hash=5ddc8d69f9
haha-5ddc8d69f9-vhhvb   1/1     Running   0          3m1s   app=haha,pod-template-hash=5ddc8d69f9
nginx                   1/1     Running   0          120m   run=nginx

二什么是pod

·Pod是可以创建和管理Kubernetes计算的最小可部署单元

·一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。

·一个pod类似一个豌豆英,包含一个或多个容器(通常是docker)

·多个容器间共享IPC、Network和UTC namespace。

2.1 创建自主式pod(生产不推荐)

优点:

灵活性高:

·可以精确控制 Pod 的各种配置参数,包括容器的镜像、资源限制、环境变量、命令和参数等,满足特定的应用需求。

学习和调试方便:

·对于学习 Kubernetes 的原理和机制非常有帮助,通过手动创建 Pod 可以深入了解 Pod 的结构和

配置方式。在调试问题时,可以更直接地观察和调整 Pod 的设置。

适用于特殊场景:

·在一些特殊情况下,如进行一次性任务、快速验证概念或在资源受限的环境中进行特定配置时,手动创建 Pod 可能是一种有效的方式。

缺点:

管理复杂:

·如果需要管理大量的 Pod,手动创建和维护会变得非常繁琐和耗时。难以实现自动化的扩缩容、故障恢复等操作。

缺乏高级功能:

·无法自动享受 Kubernetes 提供的高级功能,如自动部署、滚动更新、服务发现等。这可能导致应用的部署和管理效率低下。

可维护性差:

·手动创建的 Pod 在更新应用版本或修改配置时需要手动干预,容易出现错误,并且难以保证一致性。相比之下,通过声明式配置或使用 Kubernetes 的部署工具可以更方便地进行应用的维护和更新。

#查看所有pods
[root@K8s-master ~]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
haha-5ddc8d69f9-ssbbw   1/1     Running   0          4m14s
haha-5ddc8d69f9-sw89n   1/1     Running   0          107s
haha-5ddc8d69f9-vhhvb   1/1     Running   0          4m14s
nginx                   1/1     Running   0          121m

#建立一个名为haha1的pod
[root@K8s-master ~]# kubectl run haha1 --image nginx
pod/haha1 created

[root@K8s-master ~]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
haha-5ddc8d69f9-ssbbw   1/1     Running   0          4m56s
haha-5ddc8d69f9-sw89n   1/1     Running   0          2m29s
haha-5ddc8d69f9-vhhvb   1/1     Running   0          4m56s
haha1                   1/1     Running   0          7s
nginx                   1/1     Running   0          122m

#显示pod的较为详细的信息
[root@K8s-master ~]# kubectl get pods -o wide 
NAME                    READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
haha-5ddc8d69f9-ssbbw   1/1     Running   0          5m11s   10.244.1.10   k8s-node1   <none>           <none>
haha-5ddc8d69f9-sw89n   1/1     Running   0          2m44s   10.244.1.11   k8s-node1   <none>           <none>
haha-5ddc8d69f9-vhhvb   1/1     Running   0          5m11s   10.244.2.9    k8s-node2   <none>           <none>
haha1                   1/1     Running   0          22s     10.244.2.10   k8s-node2   <none>           <none>
nginx                   1/1     Running   0          122m    10.244.1.9    k8s-node1   <none>           <none>

2.2 利用控制器管理pod(推荐)

高可用性和可靠性:

·自动故障恢复: 如果一个 Pod 失败或被删除,控制器会自动创建新的 Pod 来维持期望的副本数量。确保应用始终处于可用状态,减少因单个 Pod 故障导致的服务中断。

·健康检查和自愈: 可以配置控制器对 Pod 进行健康检查(如存活探针和就绪探针)。如果 Pod不健康,控制器会采取适当的行动,如重启 Pod 或删除并重新创建它,以保证应用的正常运行。

可扩展性:

·轻松扩缩容: 可以通过简单的命令或配置更改来增加或减少 Pod 的数量,以满足不同的工作负载需求。例如,在高流量期间可以快速扩展以处理更多请求,在低流量期间可以缩容以节省资源。

·水平自动扩缩容(HPA): 可以基于自定义指标(如CPU利用率、内存使用情况或应用特定的指标)自动调整 Pod 的数量,实现动态的资源分配和成本优化。(HPA需要和监控一起运行,无法独立运行)

版本管理和更新:

·滚动更新: 对于 Deployment 等控制器,可以执行滚动更新来逐步替换旧版本的 Pod 为新版本确保应用在更新过程中始终保持可用。可以控制更新的速率和策略,以减少对用户的影响。

·回滚: 如果更新出现问题,可以轻松回滚到上一个稳定版本,保证应用的稳定性和可靠性。

声明式配置:

·简洁的配置方式: 使用 YAML 或JSON 格式的声明式配置文件来定义应用的部署需求。这种方式使得配置易于理解、维护和版本控制,同时也方便团队协作。

·期望状态管理: 只需要定义应用的期望状态(如副本数量、容器镜像等),控制器会自动调整实际状态与期望状态保持一致。无需手动管理每个 Pod 的创建和删除,提高了管理效率。

服务发现和负载均衡:

·自动注册和发现: Kubernetes中的服务(Service)可以自动发现由控制器管理的Pod,并将流量路由到它们。这使得应用的服务发现和负载均衡变得简单和可靠,无需手动配置负载均衡器

·流量分发: 可以根据不同的策略(如轮询、随机等)将请求分发到不同的 Pod,提高应用的性能和可用性。

多环境一致性:

·一致的部署方式: 在不同的环境(如开发、测试、生产)中,可以使用相同的控制器和配置来部署应用,确保应用在不同环境中的行为一致。这有助于减少部署差异和错误,提高开发和运维效率

示例:

建立控制器并自动运行pod

[root@K8s-master ~]# kubectl create deployment haha --image nginx
deployment.apps/haha created
[root@K8s-master ~]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
haha-765db578-wx4hl   1/1     Running   0          9s

为haha扩容

[root@K8s-master ~]# kubectl scale deployment haha --replicas 6
deployment.apps/haha scaled
[root@K8s-master ~]# kubectl get pods
NAME                  READY   STATUS              RESTARTS   AGE
haha-765db578-268x5   0/1     ContainerCreating   0          2s
haha-765db578-9cd79   0/1     ContainerCreating   0          2s
haha-765db578-nbscx   0/1     ContainerCreating   0          2s
haha-765db578-rdplf   0/1     ContainerCreating   0          2s
haha-765db578-tcrsx   0/1     ContainerCreating   0          2s
haha-765db578-wx4hl   1/1     Running             0          95s

为haha缩容

[root@K8s-master ~]# kubectl scale deployment haha --replicas 2
deployment.apps/haha scaled
[root@K8s-master ~]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
haha-765db578-tcrsx   1/1     Running   0          29s
haha-765db578-wx4hl   1/1     Running   0          2m2s

2.3应用版本的更新

利用控制器建立pod

[root@K8s-master ~]# kubectl create deployment haha1 --image myapp:v1 --replicas 2
deployment.apps/haha1 created

暴露端口

[root@K8s-master ~]# kubectl expose deployment haha1 --port 80 --target-port 80
service/haha1 exposed
[root@K8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
haha1        ClusterIP   10.97.77.108   <none>        80/TCP    5s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   20h

访问网络

[root@K8s-master ~]# curl 10.97.77.108
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@K8s-master ~]# curl 10.97.77.108/hostname.html
haha1-6fd695c4b6-j26j4
[root@K8s-master ~]# curl 10.97.77.108/hostname.html
haha1-6fd695c4b6-j26j4
[root@K8s-master ~]# curl 10.97.77.108/hostname.html
haha1-6fd695c4b6-jz4lj

如果无法访问:

删除网络插件重新添加

[root@K8s-master ~]# kubectl delete -f kube-flannel.yml 
[root@K8s-master ~]# kubectl apply -f kube-flannel.yml

查看历史版本

[root@K8s-master ~]# kubectl rollout history deployment haha1
deployment.apps/haha1 
REVISION  CHANGE-CAUSE
1         <none>

更新控制器版本

[root@K8s-master ~]# kubectl set image deployments/haha1 myapp=myapp:v2
deployment.apps/haha1 image updated
#查看历史版本
[root@K8s-master ~]# kubectl rollout history deployment haha1
deployment.apps/haha1 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

访问测试

[root@K8s-master ~]# curl 10.97.77.108
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

版本回滚

[root@K8s-master ~]# kubectl rollout undo deployment haha1 --to-revision 1
deployment.apps/haha1 rolled back
[root@K8s-master ~]# curl 10.97.77.108
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

2.4 利用yaml文件部署应用

2.4.1 用yaml文件部署应用有以下优点

声明式配置:

·清晰表达期望状态:以声明式的方式描述应用的部署需求,包括副本数量、容器配置、网络设置等。这使得配置易于理解和维护,并且可以方便地查看应用的预期状态。

·可重复性和版本控制:配置文件可以被版本控制,确保在不同环境中的部署一致性。可以轻松回滚到以前的版本或在不同环境中重复使用相同的配置。

·团队协作:便于团队成员之间共享和协作,大家可以对配置文件进行审查和修改,提高部署的可靠性和稳定性。

灵活性和可扩展性:

·丰富的配置选项:可以通过 YAML 文件详细地配置各种 Kubernetes 资源,如 Deployment、Service、ConfigMap、Secret等。可以根据应用的特定需求进行高度定制化。

·组合和扩展:可以将多个资源的配置组合在一个或多个YAML 文件中,实现复杂的应用部署架构。同时,可以轻松地添加新的资源或修改现有资源以满足不断变化的需求。

与工具集成:

·与 CI/CD 流程集成:可以将 YAML配置文件与持续集成和持续部署(CI/CD)工具集成,实现自动化的应用部署。例如,可以在代码提交后自动触发部署流程,使用配置文件来部署应用到不同的环境。

·命令行工具支持:Kubernetes 的命令行工具 kubect1对YAML 配置文件有很好的支持,可以方便地应用、更新和删除配置。同时,还可以使用其他工具来验证和分析YAML 配置文件,确保其正确性和安全性。

2.4.2 资源清单参数

参数名称

类型

参数说明

version

String

这里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查询

kind

String

这里指的是yaml文件定义的资源类型和角色,比如:Pod

metadata

Object

元数据对象,固定值就写metadata

metadata.name

String

元数据对象的名字,这里由我们编写,比如命名Pod的名字

metadata.namespace

String

元数据对象的命名空间,由我们自身定义

Spec

Object

详细定义对象,固定值就写Spec

spec.containers[]

list

这里是Spec对象的容器列表定义,是个列表

spec.containers[].name

String

这里定义容器的名字

spec.containers[].image

string

这里定义要用到的镜像名称

spec.containers[].imagePullPolicy

String

定义镜像拉取策略,有三个值可选: (1) Always: 每次都尝试重新拉取镜像 (2) IfNotPresent:如果本地有镜像就使用本地镜像 (3) )Never:表示仅使用本地镜像

spec.containers[].command[]

list

指定容器运行时启动的命令,若未指定则运行容器打包时指定的命令

spec.containers[].args[]

list

指定容器运行参数,可以指定多个

spec.containers[].workingDir

String

指定容器工作目录

spec.containers[].volumeMounts[]

list

指定容器内部的存储卷配置

spec.containers[].volumeMounts[].name

String

指定可以被容器挂载的存储卷的名称

spec.containers[].volumeMounts[].mountPath

String

指定可以被容器挂载的存储卷的路径

spec.containers[].volumeMounts[].readOnly

String

设置存储卷路径的读写模式,ture或false,默认为读写模式

spec.containers[].ports[]

list

指定容器需要用到的端口列表

spec.containers[].ports[].name

String

指定端口名称

spec.containers[].ports[].containerPort

String

指定容器需要监听的端口号

spec.containers[] ports[].hostPort

String

指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)

spec.containers[].ports[].protocol

String

指定端口协议,支持TCP和UDP,默认值为 TCP

spec.containers[].env[]

list

指定容器运行前需设置的环境变量列表

spec.containers[].env[].name

String

指定环境变量名称

spec.containers[].env[].value

String

指定环境变量值

spec.containers[].resources

Object

指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)

spec.containers[].resources.limits

Object

指定设置容器运行时资源的运行上限

spec.containers[].resources.limits.cpu

String

指定CPU的限制,单位为核心数,1=1000m

spec.containers[].resources.limits.memory

String

指定MEM内存的限制,单位为MIB、GiB

spec.containers[].resources.requests

Object

指定容器启动和调度时的限制设置

spec.containers[].resources.requests.cpu

String

CPU请求,单位为core数,容器启动时初始化可用数量

spec.containers[].resources.requests.memory

String

内存请求,单位为MIB、GIB,容器启动的初始化可用数量

spec.restartPolicy

string

定义Pod的重启策略,默认值为Always. (1)Always: Pod-旦终止运行,无论容器是如何 终止的,kubelet服务都将重启它 (2)OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubelet将不会重启它 (3) Never: Pod终止后,kubelet将退出码报告给Master,不会重启该

spec.nodeSelector

Object

定义Node的Label过滤标签,以key:value格式指定

spec.imagePullSecrets

Object

定义pull镜像时使用secret名称,以name:secretkey格式指定

spec.hostNetwork

Boolean

定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机 上启动第二个副本

2.4.3 如何获得资源帮助

kubectl explain pod.spec.containers

2.4.4 编写示例

2.4.4.1 示例1:运行简单的单个容器pod

用命令获取yaml模板

[root@K8s-master ~]# kubectl run haha --image myapp:v1 --dry-run=client -o yaml > haha.yml
[root@K8s-master ~]# vim haha.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha   #pod标签
  name: haha     #pod名称
spec:
  containers:
    - image: myapp:v1   #pod镜像
      name: haha        #容器名称

2.4.4.2 示例2:运行多个容器pod

注意:如果多个容器运行在一个pod中,资源共享的同时在使用相同资源时也会干扰,比如端口

#一个端口干扰示例:
[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: haha

    - image: busybox:latest
      name: busybox
      command: ["/bin/sh","-c","sleep 1000000"]

    - image: myapp:v1
      name: haha2

[root@K8s-master ~]# kubectl apply -f haha.yml 
pod/haha created
[root@K8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
haha                     3/3     Running   0          3s
haha1-6fd695c4b6-58m9m   1/1     Running   0          148m
haha1-6fd695c4b6-6nd2x   1/1     Running   0          148m
test-db99b9599-wjmlx     1/1     Running   0          3h
[root@K8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS        AGE
haha                     3/3     Running   1 (6h18m ago)   6s
haha1-6fd695c4b6-58m9m   1/1     Running   0               148m
haha1-6fd695c4b6-6nd2x   1/1     Running   0               148m
test-db99b9599-wjmlx     1/1     Running   0               3h
[root@K8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS        AGE
haha                     3/3     Running   1 (6h18m ago)   6s
haha1-6fd695c4b6-58m9m   1/1     Running   0               148m
haha1-6fd695c4b6-6nd2x   1/1     Running   0               148m
test-db99b9599-wjmlx     1/1     Running   0               3h
[root@K8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS        AGE
haha                     2/3     Error     1 (6h18m ago)   7s
haha1-6fd695c4b6-58m9m   1/1     Running   0               148m
haha1-6fd695c4b6-6nd2x   1/1     Running   0               148m
test-db99b9599-wjmlx     1/1     Running   0               3h
[root@K8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS        AGE
haha                     2/3     Error     1 (6h18m ago)   11s
haha1-6fd695c4b6-58m9m   1/1     Running   0               148m
haha1-6fd695c4b6-6nd2x   1/1     Running   0               148m
test-db99b9599-wjmlx     1/1     Running   0               3h
[root@K8s-master ~]# 


#查看日志
[root@K8s-master ~]# kubectl logs haha haha2
2024/09/03 11:01:13 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use)
2024/09/03 11:01:13 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use)
2024/09/03 11:01:13 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use)
2024/09/03 11:01:13 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use)
2024/09/03 11:01:13 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use)
2024/09/03 11:01:13 [emerg] 1#1: still could not bind()
nginx: [emerg] still could not bind()
[root@K8s-master ~]# 

在一个pod中开启多个容器时一定要确保容器彼此不能互相干扰

[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: haha

    - image: busybox:latest
      name: busybox
      command: ["/bin/sh","-c","sleep 1000000"]
[root@K8s-master ~]# kubectl apply -f haha.yml 
pod/haha created
[root@K8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
haha                     2/2     Running   0          4s
haha1-6fd695c4b6-58m9m   1/1     Running   0          146m
haha1-6fd695c4b6-6nd2x   1/1     Running   0          146m
test-db99b9599-wjmlx     1/1     Running   0          178m

2.4.4.3 示例3:理解pod间的网络整合

同在一个pod中的容器公用一个网络

[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: timinglee
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: myapp1

    - image: busyboxplus:latest
      name: busyboxplus
      command: ["/bin/sh","-c","sleep 1000000"]

[root@K8s-master ~]# kubectl apply -f haha.yml
[root@K8s-master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
haha   2/2     Running   0          4s

[root@K8s-master ~]# kubectl exec haha -c busyboxplus -- curl -s localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

2.4.4.4 示例4:端口映射
[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: haha
      ports:
        - name: http
          containerPort: 80
          hostPort: 80
          protocol: TCP
[root@K8s-master ~]# kubectl apply -f haha.yml 
pod/haha created
[root@K8s-master ~]# kubectl get pods  -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
haha   1/1     Running   0          9s    10.244.1.27   k8s-node1   <none>           <none>
[root@K8s-master ~]# curl k8s-node1
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

2.4.4.5 示例5:如何设定环境变量

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  containers:
    - image: busybox:latest
      name: busybox
      command: ["/bin/sh","-c","echo $NAME;sleep 3000000"]
      env:
      - name: NAME
        value: haha
[root@K8s-master ~]# kubectl apply -f haha.yml
pod/haha created


[root@K8s-master ~]# kubectl logs pods/haha busybox
haha

2.4.4.6 示例6:资源限制

资源限制会影响pod的Qos Class资源优先级,资源优先级分为Guaranteed>Burstable>BestEffort

QoS(QualityofService)即服务质量

[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: myapp
      resources:
        limits:         #pod使用资源的最高限制
          cpu: 500m       
          memory: 100M
        requests:         #pod期望使用资源量,不能大于limits
          cpu: 500m
          memory: 100M
[root@K8s-master ~]# kubectl apply -f haha.yml
pod/haha created
[root@K8s-master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
haha   1/1     Running   0          5s
[root@K8s-master ~]# kubectl describe pods haha

.......
    Limits:
      cpu:     500m
      memory:  100M
    Requests:
      cpu:        500m
      memory:     100M
.......

2.4.4.7 示例7 容器启动管理
[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  restartPolicy: Always
  containers:
    - image: myapp:v1
      name: myapp

[root@K8s-master ~]# kubectl apply -f haha.yml
pod/haha created

[root@K8s-master ~]# kubectl get pods  -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
haha   1/1     Running   0          6s    10.244.1.30   k8s-node1   <none>           <none>

#测试
[root@K8s-node1 ~]# docker ps
CONTAINER ID   IMAGE                          COMMAND                   CREATED              STATUS              PORTS     NAMES
2bf41d21f285   d4a5e0eaa84f                   "nginx -g 'daemon of…"   20 seconds ago       Up 19 seconds                 k8s_myapp_haha_default_64feed9c-57cb-4379-954b-b2405301ef01_1
7a2ca21fb382   reg.harbor.org/k8s/pause:3.9   "/pause"                  About a minute ago   Up About a minute             k8s_POD_haha_default_64feed9c-57cb-4379-954b-b2405301ef01_0
d8f6a71ce2ca   b9f4beb93d68                   "/opt/bin/flanneld -…"   17 minutes ago       Up 17 minutes                 k8s_kube-flannel_kube-flannel-ds-vgv5w_kube-flannel_c9b8e0a4-af8b-434b-a0eb-1e7bb74f3cba_0
e39b4141f954   reg.harbor.org/k8s/pause:3.9   "/pause"                  17 minutes ago       Up 17 minutes                 k8s_POD_kube-flannel-ds-vgv5w_kube-flannel_c9b8e0a4-af8b-434b-a0eb-1e7bb74f3cba_0
de984a0e7c24   a0bf559e280c                   "/usr/local/bin/kube…"   18 hours ago         Up 18 hours                   k8s_kube-proxy_kube-proxy-8gdrh_kube-system_4f5e58cf-37e7-42f8-9080-0c879fbb9191_0
0b96829e6e51   reg.harbor.org/k8s/pause:3.9   "/pause"                  18 hours ago         Up 18 hours                   k8s_POD_kube-proxy-8gdrh_kube-system_4f5e58cf-37e7-42f8-9080-0c879fbb9191_0
[root@K8s-node1 ~]# docker rm -f 2bf41d21f285
2bf41d21f285
[root@K8s-node1 ~]# docker ps
CONTAINER ID   IMAGE                          COMMAND                   CREATED                  STATUS                  PORTS     NAMES
b09a6bb61281   d4a5e0eaa84f                   "nginx -g 'daemon of…"   Less than a second ago   Up Less than a second             k8s_myapp_haha_default_64feed9c-57cb-4379-954b-b2405301ef01_2
7a2ca21fb382   reg.harbor.org/k8s/pause:3.9   "/pause"                  About a minute ago       Up About a minute                 k8s_POD_haha_default_64feed9c-57cb-4379-954b-b2405301ef01_0
d8f6a71ce2ca   b9f4beb93d68                   "/opt/bin/flanneld -…"   17 minutes ago           Up 17 minutes                     k8s_kube-flannel_kube-flannel-ds-vgv5w_kube-flannel_c9b8e0a4-af8b-434b-a0eb-1e7bb74f3cba_0
e39b4141f954   reg.harbor.org/k8s/pause:3.9   "/pause"                  17 minutes ago           Up 17 minutes                     k8s_POD_kube-flannel-ds-vgv5w_kube-flannel_c9b8e0a4-af8b-434b-a0eb-1e7bb74f3cba_0
de984a0e7c24   a0bf559e280c                   "/usr/local/bin/kube…"   18 hours ago             Up 18 hours                       k8s_kube-proxy_kube-proxy-8gdrh_kube-system_4f5e58cf-37e7-42f8-9080-0c879fbb9191_0
0b96829e6e51   reg.harbor.org/k8s/pause:3.9   "/pause"                  18 hours ago             Up 18 hours                       k8s_POD_kube-proxy-8gdrh_kube-system_4f5e58cf-37e7-42f8-9080-0c879fbb9191_0

2.4.4.8 示例8 选择运行节点
[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node2
  restartPolicy: Always
  containers:
    - image: myapp:v1
      name: myapp

[root@K8s-master ~]# kubectl apply -f haha.yml
pod/haha created
[root@K8s-master ~]# kubectl get pods  -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
haha   1/1     Running   0          3s    10.244.2.20   k8s-node2   <none>           <none>
[root@K8s-master ~]# 

2.4.4.9 示例9 共享宿主机网络
[root@K8s-master ~]# vim haha.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  hostNetwork: true
  restartPolicy: Always
  containers:
    - image: busybox:latest
      name: busybox
      command: ["/bin/sh","-c","sleep 100000"]
      [root@K8s-master ~]# vim haha.yml 
[root@K8s-master ~]# kubectl apply -f haha.yml
pod/haha created
[root@K8s-master ~]# kubectl get pods  -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
haha   1/1     Running   0          5s    172.25.254.10   k8s-node1   <none>           <none>

三 pod的生命周期

3.1 INIT 容器

官方文档:Pod | Kubernetes

·Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。(init容器是一个运行完之后才运行下一个init容器)

·Init 容器与普通的容器非常像,除了如下两点:

它们总是运行到完成

init 容器不支持 Readiness(就绪探针),因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。

·如果Pod的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。但是,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。

3.1.1 INIT 容器的功能

·Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。

·Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。

·应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。

·Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。

·由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

3.1.2 INIT 容器示例

[root@K8s-master ~]# mkdir pod
[root@K8s-master ~]# cd pod
[root@K8s-master pod]# kubectl run haha --image myapp:v1 --dry-run=client -o yaml > haha.yaml
[root@K8s-master pod]# vim haha.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: haha

  initContainers:
    - image: busybox
      name: initnode
      command: ["sh","-c","until test -e /testfile;do echo wating for myservice; sleep 2;done"]

[root@K8s-master pod]# kubectl apply  -f haha.yaml
pod/haha created

#查看pod
[root@K8s-master pod]# kubectl get pods
NAME   READY   STATUS     RESTARTS   AGE
haha   0/1     Init:0/1   0          49s

#查看日志
[root@K8s-master pod]# kubectl logs pods/haha initnode 
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice

#创建testfile文件
[root@K8s-master pod]# kubectl exec pods/haha -c initnode -- /bin/sh -c "touch /testfile"
#再次查看
[root@K8s-master pod]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
haha   1/1     Running   0          2m43s

没有文件时

有文件时

3.2 探针

探针是由 kubelet 对容器执行的定期诊断:

·ExecAction:在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。

·TCPSocketAction:对指定端口上的容器的IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。

·HTTPGetAction:对指定的端口和路径上的容器的IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一!

·成功:容器通过了诊断。

·失败:容器未通过诊断。

·未知:诊断失败,因此不会采取任何行动。

Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:

·livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。

·readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。

·startupProbe:指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

ReadinessProbe与LivenessProbe的区别

·ReadinessProbe 当检测失败后,将 Pod 的IP:Port 从对应的 EndPoint 列表中删除,

·LivenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施

StartupProbe与ReadinessProbe、LivenessProbe的区别

·如果三个探针同时存在,先执行 StartupProbe 探针,其他两个探针将会被暂时禁用,直到 pod 满足 StartupProbe 探针配置的条件,其他2个探针启动,如果不满足按照规则重启容器。

·另外两种探针在容器启动后,会按照配置,直到容器消亡才停止探测,而StartupProbe 探针只是在容器启动后按照配置满足一次后,不在进行后续的探测。

3.2.1 探针实例

3.2.1.1 存活探针示例
[root@K8s-master pod]# vim haha.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: myapp
      livenessProbe:
        tcpSocket:
          port: 8080
        initialDelaySeconds: 3
        periodSeconds: 1
        timeoutSeconds: 1


[root@K8s-master pod]# kubectl apply -f haha.yaml 
pod/haha created

#测试
[root@K8s-master pod]# kubectl get pods
NAME   READY   STATUS             RESTARTS        AGE
haha   0/1     CrashLoopBackOff   2 (7h56m ago)   32s

[root@K8s-master pod]# kubectl describe pods haha
....
 Warning  Unhealthy  7h57m (x9 over 7h57m)  kubelet            Liveness probe failed: dial tcp 10.244.2.23:8080: connect: connection refused
....

#将8080改为80
[root@K8s-master pod]# kubectl delete -f haha.yaml 
pod "haha" deleted
[root@K8s-master pod]# vim haha.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: myapp
      livenessProbe:
        tcpSocket:
          port: 80
        initialDelaySeconds: 3
        periodSeconds: 1
        timeoutSeconds: 1

[root@K8s-master pod]# kubectl apply -f haha.yaml 
pod/haha created
[root@K8s-master pod]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
haha   1/1     Running   0          4s

3.2.1.2 就绪探针示例:
[root@K8s-master pod]# vim haha.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: haha
  name: haha
spec:
  containers:
    - image: myapp:v1
      name: myapp
      readinessProbe:   #探针的类型
        httpGet:         #检测的方式是七层
          path: /test.html    #检测的位置
          port: 80            #检测的端口
        initialDelaySeconds: 1  #容器在开启后1s再进行readinessProbe
        periodSeconds: 3        #每个3s检测一次
        timeoutSeconds: 1        #等1秒检测不到视为检测失败


[root@K8s-master pod]# kubectl apply -f haha.yaml 
pod/haha unchanged

#测试:
[root@K8s-master pod]# kubectl get pods 
NAME   READY   STATUS    RESTARTS   AGE
haha   0/1     Running   0          103s

#暴露端口
[root@K8s-master pod]# kubectl expose pod haha --port 80 --target-port 80
service/haha exposed
[root@K8s-master pod]# kubectl get pods 
NAME   READY   STATUS    RESTARTS   AGE
haha   0/1     Running   0          2m57s

[root@K8s-master pod]# kubectl describe services haha
Name:              haha
Namespace:         default
Labels:            name=haha
Annotations:       <none>
Selector:          name=haha
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.98.71.121
IPs:               10.98.71.121
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:                      #没有暴漏端口,就绪探针探测不满足暴漏条件
Session Affinity:  None
Events:            <none>

#添加文件
[root@K8s-master pod]# kubectl exec pods/haha -c myapp -- /bin/sh -c "echo test > /usr/share/nginx/html/test.html"

#再次查看
[root@K8s-master pod]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
haha   1/1     Running   0          5m52s

[root@K8s-master pod]# kubectl describe services haha
Name:              haha
Namespace:         default
Labels:            name=haha
Annotations:       <none>
Selector:          name=haha
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.98.71.121
IPs:               10.98.71.121
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.35:80    #满组条件端口暴漏
Session Affinity:  None
Events:            <none>

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值