Kubernetes Pod详解和编写nginx

本文介绍了Kubernetes中的Pod结构,包括用户容器和Pause容器的作用,以及Pod的资源清单,详细阐述了Pod的定义和配置。此外,讨论了Pod控制器,如ReplicaSet,它们如何确保Pod的数量和状态,并提供了创建和管理Pod的实例。还涉及了Pod的生命周期管理和健康检查,以及Pod间的通信机制。
摘要由CSDN通过智能技术生成

1 Pod介绍

1.1 Pod结构

img

每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:

  • 用户程序所在的容器,数量可多可少

  • Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:

    • 可以以它为依据,评估整个Pod的健康状态
    • 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信
    这里是Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现,我们当前环境用的是Flannel
    

1.2 Pod定义

下面是Pod的资源清单:

apiVersion: v1     #必选,版本号,例如v1
kind: Pod         #必选,资源类型,例如 Pod
metadata:         #必选,元数据
  name: string     #必选,Pod名称
  namespace: string  #Pod所属的命名空间,默认为"default"
  labels:           #自定义标签列表
    - name: string                 
spec:  #必选,Pod中容器的详细定义
  containers:  #必选,Pod中容器列表
  - name: string   #必选,容器名称
    image: string  #必选,容器的镜像名称
    imagePullPolicy: [ Always|Never|IfNotPresent ]  #获取镜像的策略 
    command: [string]   #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]      #容器的启动命令参数列表
    workingDir: string  #容器的工作目录
    volumeMounts:       #挂载到容器内部的存储卷配置
    - name: string      #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean #是否为只读模式
    ports: #需要暴露的端口库号列表
    - name: string        #端口的名称
      containerPort: int  #容器需要监听的端口号
      hostPort: int       #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string    #端口协议,支持TCP和UDP,默认TCP
    env:   #容器运行前需设置的环境变量列表
    - name: string  #环境变量名称
      value: string #环境变量的值
    resources: #资源限制和请求的设置
      limits:  #资源限制的设置
        cpu: string     #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string  #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests: #资源请求的设置
        cpu: string    #Cpu请求,容器启动的初始可用数量
        memory: string #内存请求,容器启动的初始可用数量
    lifecycle: #生命周期钩子
        postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
        preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
    livenessProbe:  #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
      exec:         #对Pod容器内检查方式设置为exec方式
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0       #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged: false
  restartPolicy: [Always | Never | OnFailure]  #Pod的重启策略
  nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
  nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
  imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: string
  hostNetwork: false   #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
  volumes:   #在该pod上定义共享存储卷列表
  - name: string    #共享存储卷名称 (volumes类型有很多种)
    emptyDir: {}       #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: string   #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      path: string                #Pod所在宿主机的目录,将被用于同期中mount的目录
    secret:          #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
      scretname: string  
      items:     
      - key: string
        path: string
    configMap:         #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string
        path: string
#小提示:
#   在这里,可通过一个命令来查看每种资源的可配置项
#   kubectl explain 资源类型         查看某种资源可以配置的一级属性
#   kubectl explain 资源类型.属性     查看属性的子属性
[root@k8s-master01 ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1
FIELDS:
   apiVersion   <string>
   kind <string>
   metadata     <Object>
   spec <Object>
   status       <Object>

[root@k8s-master01 ~]# kubectl explain pod.metadata
KIND:     Pod
VERSION:  v1
RESOURCE: metadata <Object>
FIELDS:
   annotations  <map[string]string>
   clusterName  <string>
   creationTimestamp    <string>
   deletionGracePeriodSeconds   <integer>
   deletionTimestamp    <string>
   finalizers   <[]string>
   generateName <string>
   generation   <integer>
   labels       <map[string]string>
   managedFields        <[]Object>
   name <string>
   namespace    <string>
   ownerReferences      <[]Object>
   resourceVersion      <string>
   selfLink     <string>
   uid  <string>

在kubernetes中基本所有资源的一级属性都是一样的,主要包含5部分:

  • apiVersion 版本,由kubernetes内部定义,版本号必须可以用 kubectl api-versions 查询到
  • kind 类型,由kubernetes内部定义,版本号必须可以用 kubectl api-resources 查询到

2.1 Pod控制器介绍

Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:

  • 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
  • 控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建

什么是Pod控制器

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些:

  • ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
  • ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
  • Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
  • DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行
  • StatefulSet:管理有状态应用

2.2 ReplicaSet(RS)

ReplicaSet的主要作用是保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。

img

2.3Pod配置

 <[]Object> 是个列表

容器拉取策略:
Always, Never, IfNotPresent
一直拉取,绝不拉,没有的时候拉,有的时候不拉取镜像

[root@k8s-master01 ~]# kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1
RESOURCE: containers <[]Object>   # 数组,代表可以有多个容器
FIELDS:
   name  <string>     # 容器名称
   image <string>     # 容器需要的镜像地址
   imagePullPolicy  <string> # 镜像拉取策略 
   command  <[]string> # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
   args     <[]string> # 容器的启动命令需要的参数列表
   env      <[]Object> # 容器环境变量的配置
   ports    <[]Object>     # 容器需要暴露的端口号列表
   resources <Object>      # 资源限制和资源请求的设置(能用多少资源)
   [root@k8s-master ~]# kubectl create ns dev
namespace/dev created

[root@k8s-master manifest]# vim pod-base.yaml 
[root@k8s-master manifest]# cat pod-base.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: dev
  labels:
    user: mushuang
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  - name: busybox
    image: busybox:1.30
[root@k8s-master manifest]# 

定义了一个比较简单Pod的配置,里面有两个容器:

nginx:用1.17.1版本的nginx镜像创建,(nginx是一个轻量级web容器)
busybox:用1.30版本的busybox镜像创建,(busybox是一个小巧的linux命令集合)

# 创建Pod
[root@k8s-master manifest]# kubectl apply -f pod-base.yaml 
pod/pod-base created


# 查看Pod状况
# READY 1/2 : 表示当前Pod中有2个容器,其中1个准备就绪,1个未就绪
# RESTARTS  : 重启次数,因为有1个容器故障了,Pod一直在重启试图恢复它
[root@k8s-master manifest]# kubectl get -f pod-base.yaml 
NAME       READY   STATUS             RESTARTS     AGE
pod-base   1/2     CrashLoopBackOff   1 (4s ago)   33s
[root@k8s-master manifest]# 

# 可以通过describe查看内部的详情
# 此时已经运行起来了一个基本的Pod,虽然它暂时有问题  
[root@k8s-master manifest]# cat pod-base.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: dev
  labels:
    user: mushuang
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sleep","6000"]
[root@k8s-master manifest]# 

[root@k8s-master manifest]# kubectl get pods -n dev
NAME       READY   STATUS    RESTARTS   AGE
pod-base   2/2     Running   0          72s
[root@k8s-master manifest]# kubectl get -f pod-base.yaml 
NAME       READY   STATUS    RESTARTS   AGE
pod-base   2/2     Running   0          83s
[root@k8s-master manifest]# 

编写nginx

[root@k8s-master manifest]# vim nginx-pod.yml 
[root@k8s-master manifest]# kubectl apply -f nginx-pod.yml 
deployment.apps/nginx-pod created
[root@k8s-master manifest]# cat nginx-pod.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels: 
    app: mushuang
    app: test
  name: nginx-pod
  namespace: dev
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: nginxlab
  template: 
    metadata:
      labels:
        app: nginxlab
      name: containerlab
      namespace: dev
    spec:
      containers: 
      - name: nginx 
        image: nginx:latest
        imagePullPolicy: IfNotPresent
[root@k8s-master manifest]# 

[root@k8s-master manifest]# kubectl get -f nginx-pod.yml 
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-pod   3/3     3            3           34s
[root@k8s-master manifest]# kubectl get pods -n dev 
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-5c7b58d6bb-bltl9   1/1     Running   0          44s
nginx-pod-5c7b58d6bb-p5hwr   1/1     Running   0          44s
nginx-pod-5c7b58d6bb-rlzn4   1/1     Running   0          44s
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   2d21h
[root@k8s-master ~]# kubectl get pods -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-5c7b58d6bb-bltl9   1/1     Running   0          2m43s
nginx-pod-5c7b58d6bb-p5hwr   1/1     Running   0          2m43s
nginx-pod-5c7b58d6bb-rlzn4   1/1     Running   0          2m43s
[root@k8s-master ~]# 

    
[root@k8s-master manifest]# cat nginx-svc.yml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginxlab
  name: containerlab
  namespace: dev
spec:
  ports:
  - name: svcport
    port: 80
    targetPort: 80
    protocol: TCP 
  selector: 
    app: nginxlab
  type: NodePort
[root@k8s-master manifest]# 

    
[root@k8s-master manifest]# kubectl apply -f nginx-svc.yml 
service/containerlab created
[root@k8s-master ~]# kubectl get pods -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-5c7b58d6bb-bltl9   1/1     Running   0          13m
nginx-pod-5c7b58d6bb-p5hwr   1/1     Running   0          13m
nginx-pod-5c7b58d6bb-rlzn4   1/1     Running   0          13m
[root@k8s-master ~]# kubectl get pods -n dev -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-pod-5c7b58d6bb-bltl9   1/1     Running   0          14m   10.244.2.39   k8s-node2   <none>           <none>
nginx-pod-5c7b58d6bb-p5hwr   1/1     Running   0          14m   10.244.1.28   k8s-node1   <none>           <none>
nginx-pod-5c7b58d6bb-rlzn4   1/1     Running   0          14m   10.244.2.40   k8s-node2   <none>           <none>
[root@k8s-master ~]# 

[root@k8s-master ~]# kubectl get svc -n dev
NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
containerlab   NodePort   10.99.32.163   <none>        80:30514/TCP   2m47s

[root@k8s-master manifest]# kubectl get -f nginx-svc.yml 
NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
containerlab   NodePort   10.99.32.163   <none>        80:30514/TCP   43s
[root@k8s-master manifest]# curl 10.99.32.163
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@k8s-master manifest]# kubectl get -f nginx-pod.yml 
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-pod   3/3     3            3           29m
[root@k8s-master manifest]# kubectl get -f nginx-svc.yml 
NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
containerlab   NodePort   10.99.32.163   <none>        80:30514/TCP   17m
[root@k8s-master manifest]# kubectl get -f nginx-pod.yml --show-labels
NAME        READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-pod   3/3     3            3           29m   app=test
[root@k8s-master manifest]# kubectl get -f nginx-svc.yml --show-labels
NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   LABELS
containerlab   NodePort   10.99.32.163   <none>        80:30514/TCP   17m   app=nginxlab

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值