Introdução do Cloud native_kubernetes(k8s)_pod e descrição das informações de configuração

Índice

1. Introdução ao pod

1. Estrutura do pod

2. Definição de pod

2. Configuração do pod

1. Configuração básica

2. Extração de imagem

3. Comando de inicialização

4. Variáveis ​​ambientais

5. Configurações de porta

6. Cota de recursos


1. Introdução ao pod

1. Estrutura do pod _

 

Cada Pod pode conter um ou mais contêineres, que podem ser divididos em duas categorias:

  • O número de contêineres onde residem os programas do usuário pode ser grande ou pequeno
  • O contêiner Pause, que é um contêiner raiz que todo pod terá, tem duas funções:
  • Pode ser usado como base para avaliar o estado de saúde de todo o Pod
  • Você pode definir o endereço IP no contêiner raiz, e outros contêineres têm esse IP (IP do Pod) para obter comunicação de rede dentro do Pod

Esta é a comunicação interna do Pod . A comunicação entre os Pods é realizada pela tecnologia de rede virtual da camada 2. Nosso ambiente atual usa Flannel

2. Definição do pod _

A seguir está a lista de recursos do Pod:

Bash
apiVersion: v1 #Required , número da versão, como v1
kind: Pod #Required, tipo de recurso, como Pod
metadata: #Required, metadata
  name: string #Required, Pod name
  namespace: string #Name of the Pod Space, the o padrão é rótulos "default"
  : #Rótulo personalizado list-
    name: string                
spec: #Required, a definição detalhada do
  contêiner nos contêineres do Pod: #Required, a lista de contêineres no Pod-
  name: string #Required, o contêiner nome da
    imagem: string #Obrigatório, o nome da imagem do contêiner
    imagePullPolicy: [ Always|Never|IfNotPresent ] #Obtenha a política do comando de imagem : [string] #A lista de comandos de inicialização do contêiner, se não for especificada, use o comando de inicialização     args
    usados ​​ao empacotar     : string #Diretório de trabalho do contêiner     volumeMounts: #Montado na configuração do volume de armazenamento dentro do contêiner



    - nome: string #Consulte o nome do volume de armazenamento compartilhado definido pelo pod, você precisa usar o nome do volume definido na parte volumes[] mountPath
      : string #O caminho absoluto do volume de armazenamento a ser montado no contêiner deve ter menos de 512 caracteres
      somente leitura: booleano #Se estiver em modo somente leitura
    portas: #Lista de números de biblioteca de portas que precisam ser expostos-
    nome: string #Nome da porta
      containerPort: int #O número da porta que o contêiner precisa monitorar
      hostPort: int #O número da porta que o host onde o container está localizado precisa monitorar, o padrão é o mesmo
      protocolo do Container : string #Protocolo de porta, suporte TCP e UDP, padrão TCP
    env: #Lista de variáveis ​​de ambiente que precisam a ser definido antes da execução do contêiner - nome
    : string #Valor do nome da variável de ambiente
      : string #Valor da variável de ambiente recursos: #Limite de recursos e       limites
    de configuração de solicitação : #Configuração de limite         de recursos cpu: string #Limite de CPU, a unidade é o número de núcleos , será usado para docker run --cpu-shares parâmetro         memória: string #Memory limit, a unidade pode ser Mib/Gib, será usado para docker run --memory       solicitações de parâmetro: #Resource request settings




        cpu: string #Solicitação de CPU, a quantidade inicial disponível de
        memória de inicialização do contêiner: string #Solicitação de memória, a quantidade inicial disponível de
    ciclo de vida de inicialização do contêiner: #Hook do ciclo de vida
        postStart: #Execute este gancho imediatamente após o início do contêiner, se a execução falhar , ele será reiniciado de acordo com a Política para reiniciar
        o preStop: #Execute este gancho antes que o contêiner termine, não importa qual seja o resultado, o contêiner encerrará
    livenessProbe: #Configurações para a verificação de integridade de cada contêiner no Pod, quando a detecção não responder várias vezes, o contêiner será reiniciado automaticamente
      exec: #Para o Pod Defina o método de inspeção no contêiner para exec método
        comando: [string] #O método Exec precisa formular o comando ou script
      httpGet: #Definir a inspeção de integridade método de um contêiner no Pod para HttpGet, você precisa formular o caminho e o
        caminho da porta: string
        porta: número
        host: string
        esquema: string
        HttpHeaders:
        - nome: string
          valor: string
      tcpSocket: #Defina o método de verificação de integridade de cada contêiner em o pod para tcpSocket
         porta: número
       inicialDelaySeconds: 0 #O tempo para a primeira detecção após o contêiner ser iniciado, em segundos
       timeoutSeconds: 0 #O tempo limite para aguardar a resposta da detecção da verificação de integridade do contêiner, em segundos, o padrão é 1 segundo
       periodSeconds: 0 #Monitoramento periódico e inspeção do contêiner Configuração   , em segundos, por padrão,        do tempo        uma vez          a cada   10
       segundos NodeSelector no nó nó especificado para o nome   : obeject #Setting NodeSelector significa agendar o Pod para o nó que contém este rótulo   imagePullSecrets: #O segredo nome usado ao extrair a imagem, especificado em key:secretkey format-   name: string   hostNetwork: false # Se deve usar o modo de rede host, o padrão é false, se definido como true, significa usar os   volumes da rede host: #Define a lista de volumes de armazenamento compartilhado neste pod










  - name: string #Nome do volume de armazenamento compartilhado (existem muitos tipos de volumes)
    emptyDir: {} #Um volume de armazenamento do tipo emtyDir, um diretório temporário com o mesmo ciclo de vida do pod. É um valor vazio
    hostPath: string #O volume de armazenamento do tipo hostPath indica o diretório do host onde o Pod está montado.
      path: string #O diretório do host onde o Pod está localizado será usado para o diretório de montagem durante o mesmo período.
    segredo: #O tipo é volume de armazenamento secreto, monte o cluster e os objetos secretos definidos no contêiner
      scretname: string 
      items:    
      - key: string
        path: string
    configMap: #Volume de armazenamento do tipo configMap, monte o objeto configMap predefinido em o
      nome do contêiner: string
      items:
      - key: string
        path: string

Ver tipo de recurso por explicação

TypeScript
#小提示:
#    在这里,可通过一个命令来查看每种资源的可配置项
#   kubectl explain 资源类型         查看某种资源可以配置的一级属性
#    kubectl explain 资源类型.属性     查看属性的子属性
[root@master ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1
FIELDS:
   apiVersion   <string>
   kind <string>
   metadata     <Object>
   spec <Object>
   status       <Object>
 
[root@master ~]# 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
  • kind
  • metadata
  • spec
  • status

在上面的属性中,spec是接下来研究的重点,继续看下它的常见子属性:

  • containers <[]Object> 容器列表,用于定义容器的详细信息
  • nodeName
  • nodeSelector <map[]> 根据NodeSelector中定义的信息选择将该Pod调度到包含这些label的Node 上
  • hostNetwork
  • volumes <[]Object> 存储卷,用于定义Pod上面挂在的存储信息
  • restartPolicy

二、Pod配置

以下主要来研究pod.spec.containers属性,这也是pod配置中最为关键的一项配置。

Bash
[root@master ~]# 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>      # 资源限制和资源请求的设置

1、基本配置

创建pod-base.yaml文件,内容如下:

SQL
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: dev
  labels:
    user: heima
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  - name: busybox
    image: busybox:1.30

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

nginx:用1.17.1版本的nginx镜像创建,(nginx是一个轻量级web容器)

busybox:用1.30版本的busybox镜像创建,(busybox是一个小巧的linux命令集合)

Shell
# 创建Pod
[root@master pod]# kubectl apply -f pod-base.yaml
pod/pod-base created
 
# 查看Pod状况
# READY 1/2 : 表示当前Pod中有2个容器,其中1个准备就绪,1个未就绪
# RESTARTS  : 重启次数,因为有1个容器故障了,Pod一直在重启试图恢复它
[root@master pod]# kubectl get pod -n dev
NAME       READY   STATUS    RESTARTS   AGE
pod-base   1/2     Running   4          95s
 
# 可以通过describe查看内部的详情
# 此时已经运行起来了一个基本的Pod,虽然它暂时有问题
[root@master pod]# kubectl describe pod pod-base -n dev

2、镜像拉取

 imagePullPolicy,用于设置镜像拉取策略,kubernetes支持配置三种拉取策略:

Bash
apiVersion: v1
kind: Pod
metadata:
  name: pod-imagepullpolicy
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    imagePullPolicy: Always #
用于设置镜像拉取策略
  - name: busybox
    image: busybox:1.30

Always:总是从远程仓库拉取镜像(一直远程下载)

IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像(本地有就本地 本地没远程下载)

Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错 (一直使用本地)

默认值说明:

如果镜像tag为具体版本号, 默认策略是:IfNotPresent

如果镜像tag为:latest(最终版本) ,默认策略是always

3、启动命令

​ 在前面的案例中,一直有一个问题没有解决,就是的busybox容器一直没有成功运行,那么到底是什么原因导致这个容器的故障呢?

​ 原来busybox并不是一个程序,而是类似于一个工具类的集合,kubernetes集群启动管理后,它会自动关闭。解决方法就是让其一直在运行,这就用到了command配置。

Shell
apiVersion: v1
kind: Pod
metadata:
  name: pod-command
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"]

 

command,用于在pod中的容器初始化完毕之后运行一个命令。

稍微解释下上面命令的意思:

​ "/bin/sh","-c", 使用sh执行命令

​ touch /tmp/hello.txt; 创建一个/tmp/hello.txt 文件

​ while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done; 每隔3秒向文件中写入当前时间

特别说明:

    通过上面发现command已经可以完成启动命令和传递参数的功能,为什么这里还要提供一个args选项,用于传递参数呢?这其实跟docker有点关系,kubernetes中的command、args两项其实是实现覆盖Dockerfile中ENTRYPOINT的功能。

 1 如果command和args均没有写,那么用Dockerfile的配置。

 2 如果command写了,但args没有写,那么Dockerfile默认的配置会被忽略,执行输入的command

 3 如果command没写,但args写了,那么Dockerfile中配置的ENTRYPOINT的命令会被执行,使用当前args的参数

 4 如果command和args都写了,那么Dockerfile的配置被忽略,执行command并追加上args参数

4、环境变量

Bash
apiVersion: v1
kind: Pod
metadata:
  name: pod-env
  namespace: dev
spec:
  containers:
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","while true;do /bin/echo $(date +%T);sleep 60; done;"]
    env: #
设置环境变量列表
    - name: "username"
      value: "admin"
    - name: "password"
      value: "123456"

env,环境变量,用于在pod中的容器设置环境变量。

Bash
# 创建Pod
[root@master ~]# kubectl create -f pod-env.yaml
pod/pod-env created
 
# 进入容器,输出环境变量
[root@master ~]# kubectl exec pod-env -n dev -c busybox -it /bin/sh
/ # echo $username
admin
/ # echo $password
123456

这种方式不是很推荐,推荐将这些配置单独存储在配置文件中,这种方式将在后面介绍。

5、端口设置

本小节来介绍容器的端口设置,也就是containers的ports选项。

首先看下ports支持的子选项:

Bash
[root@master ~]# kubectl explain pod.spec.containers.ports
KIND:     Pod
VERSION:  v1
RESOURCE: ports <[]Object>
FIELDS:
   name         <string>  #
端口名称,如果指定,必须保证name在pod中是唯一的       
   containerPort<integer> # 容器要监听的端口(0<x<65536)
   hostPort     <integer> # 容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副本(一般省略)
   hostIP       <string>  # 要将外部端口绑定到的主机IP(一般省略)
   protocol     <string>  # 端口协议。必须是UDP、TCP或SCTP。默认为“TCP”。

6、资源配额

容器中的程序要运行,肯定是要占用一定资源的,比如cpu和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,kubernetes提供了对内存和cpu的资源进行配额的机制,这种机制主要通过resources选项实现,他有两个子选项:

limits:用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启

requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动

可以通过上面两个选项设置资源的上下限。

Bash
apiVersion: v1
kind: Pod
metadata:
  name: pod-resources
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    resources: #
资源配额
      limits:  # 限制资源(上限)
        cpu: "2" # CPU限制,单位是core数
        memory: "10Gi" # 内存限制
      requests: # 请求资源(下限)
        cpu: "1"  # CPU限制,单位是core数
        memory: "10Mi"  # 内存限制

在这对cpu和memory的单位做一个说明:

cpu:core数,可以为整数或小数

memory: 内存大小,可以使用Gi、Mi、G、M等形式

三、Pod生命周期

四、Pod调度

Acho que você gosta

Origin blog.csdn.net/wanghaiping1993/article/details/130187427
Recomendado
Clasificación