k8s day02-Pod资源限制,镜像下载策略,Pod重启策略,环境变量,常用的存储卷实战案例

昨日内容回顾:
    - Pod资源的管理常用命令
        - kubectl create
        - kubectl apply
        - kubectl delete
        - kubectl get
        - kubectl describe
        - kubectl exec
        - kubectl explain
        - kubectl logs
        - kubectl cp
        - kubectl label
        - kubectl api-resource
        
    - Pod的资源清单
apiVersion: v1
kind: Pod
metadata:
    name:
    labels:
spec:
    hostNetwork:
    nodeName:
    containers:
    - name:
      image:
      command:
      args:
      stdin:


Q1:为什么stdin不能阻塞容器呢?
    stdin: true只是为容器分配一个标准输入,这对于COMMAND为shell类型的命令是好使的。
    
Q2: 如果一个Pod启动失败,请说一下你的排查思路?
    describe ---> Container ---> Status ...
             ---> Event ----> ...
    command:
    exec:
    
Q3: 一个Pod容器处于RUNING状态,而且hostnetwork是true,但是无法访问业务,请说明排查思路?
    logs ...
    exec ...
    
[[email protected] po]# cat 06-pods-resources-limits.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-linux82-resources
spec:
  containers:
  - name: linux82-resources
    # image: jasonyin2020/oldboyedu-linux-tools:v0.1
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    stdin: true
    # 配置容器的资源限制
    resources:
      # 指定资源的上限,换句话说,就是限制使用资源的最大上限。
      # 最大资源上限不能超过worker节点的物理资源。
      limits:
         # 限制内存
         # 测试命令:
         #    stress  -m 8 --vm-bytes 20971520 --vm-keep 
         # memory: 200Mi
         memory: 4Gi
      # 指定期望资源,若所有节点无法满足期望资源,则无法完成调度.
      # requests必须小于或等于limits资源限制
      requests:
         # memory: 100Mi
         memory: 2Gi
[[email protected] po]# 


[[email protected] po]# cat 08-pods-env.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-linux82-env
spec:
  nodeName: k8s153.oldboyedu.com
  containers:
  - name: linux82-env
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    stdin: true
    resources:
      limits:
         memory: 4Gi
      requests:
         memory: 2Gi
    imagePullPolicy: Always
    # 向容器传递环境变量
    env:
      # 变量名称
    - name: SCHOOL
      # 变量的值
      value: OLDBOYEDU
    - name: CLASS
      value: linux82
  - name: game
    image: jasonyin2020/oldboyedu-games:v0.3
    env:
    - name: oldboyedu-linux
      value: linux82
    - name: oldboyedu-linux82-2022-pod-name
      # 值引用Pod的字段,通常情况下用于在Pod内获取pod信息!
      valueFrom:
        # 字段引用
        fieldRef:
           # 字段的路径
           fieldPath: metadata.name
    - name: oldboyedu-linux82-2022-pod-ip
      valueFrom:
        fieldRef:
           fieldPath: status.podIP
    - name: oldboyedu-linux82-2022-nodename
      valueFrom:
        fieldRef:
           fieldPath: spec.nodeName
[[email protected] po]# 

Pod重启策略:
[[email protected] po]# cat 09-pods-restartPolicy.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-restartpolicy-onfailure-001
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  # Pod的spec中包含一个restartPolicy字段,其可能取值包括 Always、OnFailure和Never。默认值是Always。
  #   Always:
  #       容器退出时,始终重启容器(即创建新容器),默认策略。
  #   Never:
  #       容器退出时,不重启容器(即不创建新容器)。
  #   OnFailure:
  #       当容器异常退出时(kill -9时容器的退出码非0,貌似是137),重启容器(即创建新容器)。
  #       当容器正常退出(任务运行正常结束)不重启容器。
  restartPolicy: OnFailure
  containers:
  - name: myweb
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "10"

---  

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-restartpolicy-never-001
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  restartPolicy: Never
  containers:
  - name: myweb
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "10"

--- 

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-restartpolicy-always-001
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  restartPolicy: Always
  containers:
  - name: myweb
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "10"
[[email protected] po]# 


namespaces简介:
名称空间是用来隔离K8S集群的资源。我们通常使用名称空间对企业业务进行逻辑上划分。

K8S集群一切皆资源,有的资源是不支持名称空间的,我们将其称为全局资源,而支持名称空间的资源我们称之为局部资源。

我们可以通过"kubectl api-resources"命令来判断一个资源是否支持名称空间。

温馨提示:
    (1)在同一个名称空间下,同一个资源类型是不能出现重名的;
    (2)在不同的名称空间下,相同的资源类型是能出现同名的;

名称空间的基本管理:
    增:
        响应式API:
kubectl create ns oldboyedu
        
    删:(删除名称空间后,该名称空间下的所有资源都会被随之删除!生成环境中慎用!!!)
kubectl delete ns oldboyedu
    删除oldboyedu名称空间。
    
kubectl -n oldboyedu delete pods test
    删除oldboyedu名称空间下名为test的Pod资源。


    改:
略。
        
    查
kubectl get ns
    查看现有的名称空间。

kubectl get pods -n oldboyedu
    查看oldboyedu名称空间下的pods资源。
    
kubectl get pods -A
    查看所有名称空间下的pods。


参考案例:
[[email protected] po]# cat 10-pods-namespace.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: oldboyedu
  labels:
     address: oldboyedu
     hobby: linux
---

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-namespace
  # 指定名称空间,若不指定,则默认使用default名称空间
  namespace: oldboyedu
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  restartPolicy: OnFailure
  containers:
  - name: myweb
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "10"
[[email protected] po]# 


什么是emptyDir:
    是一个临时存储卷,与Pod的生命周期绑定到一起,如果Pod被删除了,这意味着数据也被随之删除。
    
emptyDir作用:
    (1)可以实现持久化;
    (2)同一个Pod的多个容器可以实现数据共享,多个不同的Pod之间不能进行数据通信;
    (3)随着Pod的生命周期而存在,当我们删除Pod时,其数据也会被随之删除;
    
    
emptyDir的应用场景:
    (1)临时缓存空间,比如基于磁盘的归并排序;
    (2)为较耗时计算任务提供检查点,以便任务能方便的从崩溃前状态恢复执行;
    (3)存储Web访问日志及错误日志等信息;
    
    
emptyDir优缺点:
    优点:
        (1)可以实现同一个Pod内多个容器之间数据共享;
        (2)当Pod内的某个容器被强制删除时,数据并不会丢失,因为Pod没有删除;
    缺点:
        (1)当Pod被删除时,数据也会被随之删除;
        (2)不同的Pod之间无法实现数据共享;
    
    
参考链接:
    https://kubernetes.io/docs/concepts/storage/volumes#emptydir
    
    
温馨提示:
    1)启动pods后,使用emptyDir其数据存储在"/var/lib/kubelet/pods"路径下对应的POD_ID目录哟!
        /var/lib/kubelet/pods/${POD_ID}/volumes/kubernetes.io~empty-dir/
    2)可以尝试验证上一步找到的目录,并探讨为什么Pod删除其数据会被随之删除的真正原因,见视频。

参考案例:
[[email protected] po]# cat 12-pods-wordpress-emptyDir.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: oldboyedu
  labels:
    school: oldboyedu
    class: linux82
---

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-linux82-wordpress-emptydir-003
  namespace: oldboyedu
  labels:
    app: wordpress
spec:
  hostNetwork: true
  # 定义存储卷
  volumes:
    # 存储卷的名称
  - name: mysql-db
    # 存储卷的类型
    emptyDir: {}
  - name: wordpres-data
    emptyDir: {}
  containers:
  - name: mysql
    image: k8s151.oldboyedu.com:5000/oldboyedu-db/mysql:5.7
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123"
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: linux82
    - name: MYSQL_PASSWORD
      value: oldboyedu
    # 指定使用的存储卷信息
    volumeMounts:
      # 指定存储卷的名称,这个名称必须在volumes字段中有定义哟!
    - name: mysql-db
      # 指定容器的挂载点
      mountPath: /var/lib/mysql/
  - name: wordpress
    image: k8s151.oldboyedu.com:5000/oldboyedu-wordpress/wordpress
    env:
    - name: WORDPRESS_DB_HOST
      value: 127.0.0.1
    - name: WORDPRESS_DB_USER
      value: linux82
    - name: WORDPRESS_DB_PASSWORD
      value: oldboyedu
    volumeMounts:
    - name: wordpres-data
      mountPath: /var/www/html
      # 如果两个容器指定了相同的存储卷,则可以实现数据的共享!
    - name: mysql-db
      mountPath: /oldboyedu-linux82-db
[[email protected] po]# 


对应的是hostPath存储卷案例:
    hotsPath数据卷:
        挂载Node文件系统(Pod所在节点)上文件或者目录到Pod中的容器。如果Pod删除了,宿主机的数据并不会被删除。


    应用场景:
        Pod中容器需要访问宿主机文件。


    hotsPath优缺点:
        优点:
            (1)可以实现同一个Pod不同容器之间的数据共享;
            (2)可以实现同一个Node节点不同Pod之间的数据共享;

        缺点:
            无法满足跨节点Pod之间的数据共享。

    推荐阅读:
        https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
        
        
参考案例:        
[[email protected] po]# cat 13-pods-hostPath.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-hostpath-001
  namespace: oldboyedu
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  restartPolicy: OnFailure
  volumes:
  - name: data01
    emptyDir: {}
  - name: data02
    hostPath:
      path: /linux82-oldboyedu-2022
  containers:
  - name: c1
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "3600"
    volumeMounts:
    - name: data02
      mountPath: /111111
  - name: c2
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "7200"
    volumeMounts:
    - name: data02
      mountPath: /222222222
[[email protected] po]# 
[[email protected] po]# 
[[email protected] po]# cat 14-pods-hostPath.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-hostpath-002
  namespace: oldboyedu
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  restartPolicy: OnFailure
  volumes:
  - name: data01
    hostPath:
      path: /linux82-oldboyedu-2022
  containers:
  - name: c1
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "3600"
    volumeMounts:
    - name: data01
      mountPath: /111111

---

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-hostpath-003
  namespace: oldboyedu
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  restartPolicy: OnFailure
  volumes:
  - name: data02
    hostPath:
      path: /linux82-oldboyedu-2022
  containers:
  - name: c1
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "3600"
    volumeMounts:
    - name: data02
      mountPath: /22222222
[[email protected] po]# 


NFS数据卷:
    提供对NFS挂载支持,可以自动将NFS共享路径挂载到Pod中。


NFS:
    英文全称为"Network File System"(网络文件系统),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
    NFS是一个主流的文件共享服务器,但存在单点故障,我们需要对数据进行备份哟,如果有必要可以使用分布式文件系统哈。


推荐阅读:
    https://kubernetes.io/docs/concepts/storage/volumes/#nfs

    
部署nfs:
    (1)所有节点安装nfs相关软件包
yum -y install nfs-utils

    (2)k8s151节点设置共享目录
mkdir -pv /oldboyedu/data/kubernetes
cat > /etc/exports <<'EOF'
/oldboyedu/data/kubernetes *(rw,no_root_squash)
EOF

    (3)配置nfs服务开机自启动
systemctl enable --now nfs

    (4)服务端检查NFS挂载信息,如上图所示。
exportfs

    (5)客户端节点手动挂载测试
mount -t nfs k8s151.oldboyedu.com:/oldboyedu/data/kubernetes /mnt/
umount /mnt 


[[email protected] po]# cat 15-pods-nfs.yaml 
kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-nfs-001
  namespace: oldboyedu
  labels:
     apps: myweb
spec:
  nodeName: k8s152.oldboyedu.com
  restartPolicy: OnFailure
  volumes:
  - name: linux82-nfs
    nfs:
      server: k8s151.oldboyedu.com
      path: /oldboyedu/data/kubernetes
  containers:
  - name: c1
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "3600"
    volumeMounts:
    - name: linux82-nfs
      mountPath: /111

---

kind: Pod
apiVersion: v1
metadata:
  name: oldboyedu-nfs-002
  namespace: oldboyedu
  labels:
     apps: myweb
spec:
  nodeName: k8s153.oldboyedu.com
  restartPolicy: OnFailure
  volumes:
  - name: nfs
    nfs:
      server: k8s151.oldboyedu.com
      path: /oldboyedu/data/kubernetes
  containers:
  - name: c1
    image: k8s151.oldboyedu.com:5000/oldboyedu-linux/stress:v0.1
    imagePullPolicy: Always
    command:
    - "sleep"
    - "3600"
    volumeMounts:
    - name: nfs
      mountPath: /222
[[email protected] po]# 


今日内容回顾:
    - 资源限制: 
        resources:
            limit:
                指定资源的使用上限。
            requests:
                指定容器期望的资源。
    - 镜像下载策略:
        - Never:
            如果有镜像,则尝试启动。
            如果本地没有镜像,不会尝试从远程仓库拉取镜像。
        - Always:
            如果本地没有镜像,则直接拉取
            如果本地有镜像,则拿本地的镜像摘要信息和远程仓库的摘要信息进行对比,若比较结果一致,则直接使用本地缓存。反之,则拉取远程仓库的镜像,并删除本地缓存。
        - IfNotPresent
            如果本地没有镜像,则直接拉取
            如果本地有镜像,则直接使用。

    - Pod重启策略:
        - Never:
            当Pod内的容器退出时,始终不重新创建容器。
        - Always:
            当Pod内的容器退出时,始终重新创建容器。
        - OnFailure:
            当Pod内的容器非正常退出时,始终重新创建容器。若正常退出,则不重启。
            
    - 环境变量:
        env:
        - name:
            变量名称。
        - value:
            变量的值。
        - valueFrom:
            值的引用...(cm,secret会继续补充...)
            
    - 数据持久化,常用的存储卷:
        - emptyDir:
            临时存储卷,可以实现同一个Pod内不同容器的数据共享和持久化。
            当Pod删除时,数据也会被随之删除。
        - hostPath:
            主机存储卷,可以实现同一个worker节点不同Pod实现数据共享和持久化。
            当Pod删除时,数据不会丢失。
        - nfs:
            实现不同的worker节点的Pod实现数据共享和持久化。
            当删除Pod时,数据不会丢失。
            nfs存在单点故障,因此生产环境中需要做备份和同步。也可以使用ceph来替代(后期讲解)。
    
    - 名称空间: namespace 
        用于隔离K8S集群资源,资源是否支持名称空间使用"kubectl api-resource"


常见报错:
    ErrImageNeverPull:
        报错原因:
            本地没有镜像,而且不会去远程仓库拉取。
        解决方案:
            要么手动下载镜像,要么修改镜像策略。
    
    OutOfmemory:
        报错原因:
            调度的节点没有足够的内存空间啦。
        解决方案:
            请参考是否使用request字段占用内存大小?
 

你可能感兴趣的:(kubernetes,云原生,容器)