文章目录

  • Pod介绍
  • 一、Pod简介
  • 1.简单举例理解Pod
  • 2.Pod的设计理念
  • 3.Pod的功能作用
  • 4.Pod的三种重启策略
  • 5.Pod 的资源清单详解
  • 二、案例
  • 1.简单编写nginx资源清单
  • 2.创建nginx-Pod
  • 3.删除nginx-Pod
  • 4.管理Pod资源
  • 三、练习题默写


Pod介绍

一、Pod简介

  • Pod,一个微服务

1.简单举例理解Pod

比如你运行一个操作系统发行版的软件仓库,一个 Nginx 容器用来发布软件,另 一个容器专门用来从源仓库做同步;这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务,这就是 K8S 中的 Pod!

2.Pod的设计理念

Pod支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间的通信、以及文件共享这种简单高效的方式组合完成服务,整个k8s都是围绕着Pod展开的,所以说Pod 对多容器的支持是 K8s 最基础的设计理念!

3.Pod的功能作用

  • pod相当于逻辑主机,每个pod都有自己的ip地址
  • pod内的容器共享相同的ip和端口空间
  • 默认情况下,每个容器的文件系统与其他容器完全隔离
  • 可以理解为:容器组,同时pod相当于逻辑主机,进入pod后仿佛进入一个linux主机,命令都可用(linux系统下),该“主机”内又有很多容器,进入后又仿佛是又进了一个linux主机。

cocoaspod 镜像源设置 容器 镜像 pod_Pod

  • Pod的生命周期图

Pod的状态

状态值

描述

Pending

挂起,创建中,即还未创建完成

Running

运行中

Succeeded

被成功终止,且不会再重启

Compland

被成功终止,且不会再重启

Failed

启动失败

Unknown

未知状态,某个节点宕机了

4.Pod的三种重启策略

Pod 重启策略( RestartPolicy )应用于 Pod 内的所有容器,井且仅在 Pod 所处的 Node 上由 kubelet 进行判断和重启操作。当某个容器异常退出或者健康检查失败时, kubelet 将根据 RestartPolicy 设置来进行相应的操作,Pod 的重启策略包括如下三种:

策略

描述

Always

默认值,当容器失效时,kubelet 会自动重启该容器

OnFailure

非正常退出时,kubelet 会自动重启该容器

Nerver

无论容器运行状态如何,kubelet 都不会重启该容器

  • kubelet 重启失效容器的时间间隔以同步频率(sync-frequency)乘以 2n 来计算;例如 1、2、4、8 倍等,最长延时 5min ,并且在成功重启后的 10 min 后重置该时间。
  • Pod 的重启策略与控制方式息息相关,当前可用于管理 Pod 的控制器包括 ReplicationController、Job、 DaemonSet 及直接通过 kubelet 管理(静态 Pod),每种控制器对 Pod 的重启策略要求如下:
  • RC、DaemonSet必须设置为 Always,需要保证该容器持续运行。
  • Job 和 CronJob:OnFailure 或 Never,确保容器执行完成后不再重启。
  • kubelet:在 Pod 失效时自动重启它,不论将 RestartPolicy 设置为什么值,也不会对 Pod 进行健康检查。

5.Pod 的资源清单详解

apiVersion: v1 # 必选,API的版本号
kind: Pod    # 必选,类型Pod
metadata:    # 必选,元数据
  name: nginx    # 必选,符合RFC 1035规范的Pod名称
  namespace: web-testing # 可选,不指定默认为default,Pod所在的命名空间
  labels:    # 可选,标签选择器,一般用于Selector
    - app: nginx
  annotations:    # 可选,注释列表
    - app: nginx
spec:    # 必选,用于定义容器的详细信息
  containers:    # 必选,容器列表
  - name: nginx    # 必选,符合RFC 1035规范的容器名称
    image: nginx:v1 # 必选,容器所用的镜像的地址
    imagePullPolicy: Always    # 可选,镜像拉取策略
    workingDir: /usr/share/nginx/html    # 可选,容器的工作目录
    volumeMounts:    # 可选,存储卷配置
    - name: webroot # 存储卷名称
      mountPath: /usr/share/nginx/html # 挂载目录
      readOnly: true    # 只读
    ports:    # 可选,容器需要暴露的端口号列表
    - name: http    # 端口名称
      containerPort: 80    # 端口号
      protocol: TCP    # 端口协议,默认TCP
    env:    # 可选,环境变量配置
    - name: TZ    # 变量名
      value: Asia/Shanghai
    - name: LANG
      value: en_US.utf8
    resources:    # 可选,资源限制和资源请求限制
      limits:    # 最大限制设置
        cpu: 1000m
        memory: 1024MiB
      requests:    # 启动所需的资源
        cpu: 100m
        memory: 512MiB
    readinessProbe: # 可选,容器状态检查
      httpGet:    # 检测方式
        path: /    # 检查路径
        port: 80    # 监控端口
      timeoutSeconds: 2    # 超时时间 
      initialDelaySeconds: 60    # 初始化时间
    livenessProbe:    # 可选,监控状态检查
      exec:    # 检测方式
        command: 
        - cat
        - /health
      httpGet:    # 检测方式
        path: /_health
        port: 8080
        httpHeaders:
        - name: end-user
          value: jason
      tcpSocket:    # 检测方式
        port: 80
      initialDelaySeconds: 60    # 初始化时间
      timeoutSeconds: 2    # 超时时间
      periodSeconds: 5    # 检测间隔
      successThreshold: 2 # 检查成功为2次表示就绪
      failureThreshold: 1 # 检测失败1次表示未就绪
    securityContext:    # 可选,限制容器不可信的行为
      provoleged: false
  restartPolicy: Always    # 可选,默认为Always
  nodeSelector:    # 可选,指定Node节点
    region: subnet7
  imagePullSecrets:    # 可选,拉取镜像使用的secret
  - name: default-dockercfg-86258
  hostNetwork: false    # 可选,是否为主机模式,如是,会占用主机端口
  volumes:    # 共享存储卷列表
  - name: webroot # 名称,与上述对应
    emptyDir: {}    # 共享卷类型,空
    hostPath:        # 共享卷类型,本机目录
      path: /etc/hosts
    secret:    # 共享卷类型,secret模式,一般用于密码
      secretName: default-token-tf2jp # 名称
      defaultMode: 420 # 权限
      configMap:    # 一般用于配置文件
      name: nginx-conf
      defaultMode: 420

Pod常用基本命令

kubectl create -f xxx.yaml			# 无则创建,有则不建
kubectl apply -f xxx.yaml			# 无则创建,有则更新
kubectl get pod Pod_Name			# 指定查询运行中的Pod(kubectl get pod为查询所有)
kubectl describe pod Pod_Name		# 查询所有运行中的Pod
kubectl delete pod Pod_Name			# 删除(--all为删除所有)

二、案例

1.简单编写nginx资源清单

cat > nginx.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx
      image: nginx
    - name: tomcat
      image: tomcat:v1
EOF

# 可用 - name 连续部署多个containers(容器)
# image名后可跟版本号(如v1),不加默认为最新版本

2.创建nginx-Pod

[root@k8s-master1 yaml] kubectl create -f nginx.yaml 
pod/nginx-pod created

# 查看
[root@k8s-master1 yaml] kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-pod            2/2     Running   0          4s

# 查看更多信息
[root@k8s-master1 yaml] kubectl get pod -o wide
NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-pod            2/2     Running   0          35m   10.244.2.24   k8s-node2   <none>           <none>

3.删除nginx-Pod

[root@k8s-master1 yaml] kubectl delete pod nginx-pod
pod "nginx-pod" deleted

[root@k8s-master1 yaml] kubectl get pod

4.管理Pod资源

# 查看重启策略(可更改)
[root@k8s-master1 yaml] kubectl edit pod nginx-pod
	···
  priority: 0
  restartPolicy: Always		# 可更改重启策略
  schedulerName: default-scheduler
	···

# 查看重启策略(不可更改)
[root@k8s-master1 ~] kubectl get pod -o json | grep restartPolicy
                                "f:restartPolicy": {},
                "restartPolicy": "Always",
                                "f:restartPolicy": {},
                "restartPolicy": "Always",
                                "f:restartPolicy": {},
                "restartPolicy": "Always",

三、练习题默写

1、kubernetes的组件有哪些
2、kubernetes组件之间是通过什么认证的
3、使用kubernetes的时候遇到过哪些问题
	- etcd数据不一致
	- 集群网络不通
	- 存储
4、docker的四种网络模式
5、dockerfile指令
6、监控一个docker容器
7、在kubernetes上部署一个应用的流程