K8s-day3-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主机。

在这里插入图片描述

  • 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上部署一个应用的流程
posted @ 2022-06-09 18:18  秋风お亦冷  阅读(90)  评论(0编辑  收藏  举报