• k8s day04


    昨日内容回顾:
        - configMap ---> cm
            应用场景: 主要用于配置文件的持久化。
        - secret
            应用场景: 存储敏感数据,并非加密数据。
        - pod探针(probe):
            - livenessProbe:
                健康检查探针,若检查失败,则会重启容器(重新创建容器)。
                值得注意的是,若手动去使用docker去kill容器,是否会重启取决于重启策略,注意,尽管重新拉起容器会计数重启次数。
                
            - readinessProbe
                可用性检查探针,若检查失败,则将容器标记为未就绪状态,与此同时,对于svc的ep资源列表不会自动发现;
        - env获取cm或者secret资源的值

    Q1: 请问Pod导入secret资源有几种方式?
        - env 
        - volume
        
    Q2: 请问cm资源有几种定义方式?
        - 单行模式,
            KEY: VALUE
        - 多行模式,类文件模式
            KEY : |
                ...
                ...
                ...

    Q3: 外网访问K8S集群的Pod有多少种方式?
        - hostNetwork
        - hostPort ---> 1.5.2有效!  1.15.12则无效!【了解即可】
        - Svc
        - Ing
        - ApiServer
        
    Q4: 影响Pod调度的方式有哪些?
        - nodeName
        - resources
        - 污点
        - 污点容忍
        - 亲和性
        - 反亲和性
        - 自定义调度器
        - 工作负载调度器 ---> ds,deploy
        ...


    kubectl version :
        查看K8S的版本号。
            GitVersion:"v1.5.2", 
            BuildDate:"2017-07-03T15:31:10Z"
             
            GitVersion:"v1.15.12",
            BuildDate:"2020-05-06T05:09:48Z"
            
            
    [root@k8s151.oldboyedu.com po]# cat 22-pods-ports.yaml 
    kind: Pod
    apiVersion: v1
    metadata:
      name: oldboyedu-linux82-ports-001
    spec:
      nodeName: k8s152.oldboyedu.com
      containers:
      - name: linux82-web
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
        # 定义容器的端口映射相关信息
        ports:
          # 容器内服务监听的端口
        - containerPort: 80
          # 指定绑定的宿主机IP地址
          hostIP: 0.0.0.0
          # 指定宿主机的端口
          hostPort: 18888
          # 给映射的端口起名字,要求唯一
          name: myweb
          # 指定协议,有效值为: UDP, TCP, or SCTP.
          protocol: TCP
    [root@k8s151.oldboyedu.com po]# 


    容器的三种类型:
        网络基础镜像容器:
            pause:v3.1
                ---> 提供网络基础的。
        
        初始化容器:
            initContainers
                ---> 为业务容器提供基础环境准备的。
                
        业务容器:
            containers
                ---> 跑实际业务。

                
    初始化容器参考案例:
    [root@k8s151.oldboyedu.com po]# cat 23-pods-initContainers.yaml 
    --- 

    apiVersion: v1
    data:
      .dockerconfigjson: eyJhdXRocyI6eyIxMC4wLjAuMjUwIjp7InVzZXJuYW1lIjoiamFzb255aW4yMDIwIiwicGFzc3dvcmQiOiJPbGRib3llZHVAMjAyMiIsImVtYWlsIjoiamFzb255aW5Ab2xkYm95ZWR1LmNvbSIsImF1dGgiOiJhbUZ6YjI1NWFXNHlNREl3T2s5c1pHSnZlV1ZrZFVBeU1ESXkifX19
    kind: Secret
    metadata:
      name: oldboyedu-harbor
    type: kubernetes.io/dockerconfigjson


    ---

    kind: Pod
    apiVersion: v1
    metadata:
      name: oldboyedu-linux82-initcontianer-002
    spec:
      nodeName: k8s152.oldboyedu.com
      imagePullSecrets:
      - name: oldboyedu-harbor
      # 初始化容器,为业务容器提供基础环境准备的。
      initContainers:
      - name: init-web
        image: 10.0.0.250/oldboyedu-linux/stress:v0.1
        command:
        - sleep
        - "30"
      # 我们可以将containers理解为业务容器。初始化容器要先于业务容器运行。
      containers:
      - name: linux82-web
        image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
        # 定义容器的端口映射相关信息
        ports:
          # 容器内服务监听的端口
        - containerPort: 80
          # 指定绑定的宿主机IP地址
          hostIP: 0.0.0.0
          # 指定宿主机的端口,k8s1.5.2会监听端口,K8S1.15.12不会监听端口但能访问哟!
          hostPort: 28888
          # 给映射的端口起名字,要求唯一
          name: myweb
          # 指定协议,有效值为: UDP, TCP, or SCTP.
          protocol: TCP
    [root@k8s151.oldboyedu.com po]# 


    静态Pod:
    vim  /var/lib/kubelet/config.yaml 
    ...
    staticPodPath: /etc/kubernetes/manifests

    温馨提示:
        (1)静态Pod是由kubelet启动时通过"staticPodPath"配置参数指定路径
        (2)静态Pod创建的Pod名称会自动加上kubelet节点的主机名,比如"-k8s151.oldboyedu.com",会忽略"nodeName"字段哟;
        (3)静态Pod的创建并不依赖API-Server,而是直接基于kubelet所在节点来启动Pod;
        (4)静态Pod的删除只需要将其从staticPodPath指定的路径移除即可;
        (5)静态Pod路径仅对Pod资源类型有效,其他类型资源将不被创建哟
        (6)咱们的kubeadm部署方式就是基于静态Pod部署的哟;

    rc简介:
    replicationcontrollers控制器简称"rc",可以保证指定数量的Pod始终存活,rc通过标签选择器来关联Pod。
        
        
    [root@k8s151.oldboyedu.com rc]# cat 01-rc-nginx.yaml 
    kind: ReplicationController
    apiVersion: v1
    metadata:
      name: oldboyedu-linux82-rc-web
    spec:
      # 指定Pod的副本数量,若不指定,则默认值为1.
      replicas: 3
      # 定义标签选择器,即用于关联Pod的标签。
      selector:
         school: oldboyedu
      # 定义Pod的模板
      template:
         metadata:
            name: linux82-web
            labels:
               school: oldboyedu
               class: linux82
         spec:
            # nodeName: k8s152.oldboyedu.com
            containers:
            - name: linux82-web
              image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
    [root@k8s151.oldboyedu.com rc]# 


    创建RS资源用于测试svc:
    [root@k8s151.oldboyedu.com rs]# cat 01-rs-nginx.yaml 
    kind: ReplicaSet
    apiVersion: extensions/v1beta1
    metadata:
      name: oldboyedu-linux82-rs-web
    spec:
      # 指定Pod的副本数量,若不指定,则默认值为1.
      replicas: 3
      # 定义标签选择器,即用于关联Pod的标签。
      selector:
         # 相比于rc资源,rs资源支持的功能更加强大,不仅仅支持标签选择器,还支持表达式(matchExpressions)
         matchLabels:
            school: oldboyedu
      # 定义Pod的模板
      template:
         metadata:
            name: linux82-web
            labels:
               school: oldboyedu
               class: linux82
         spec:
            # nodeName: k8s152.oldboyedu.com
            containers:
            - name: linux82-web
              image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
              livenessProbe:
                tcpSocket:
                   port: 80
                failureThreshold: 3
                initialDelaySeconds: 15
                periodSeconds: 1
                successThreshold: 1
                timeoutSeconds: 1
              readinessProbe:
                httpGet:
                   port: 80
                   path: /oldboyedu.html
                failureThreshold: 3
                initialDelaySeconds: 15
                periodSeconds: 1
                successThreshold: 1
                timeoutSeconds: 1
    [root@k8s151.oldboyedu.com rs]# 


    创建svc资源:
    [root@k8s151.oldboyedu.com rs]# cat ../svc/01-svc-nginx.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: linux82-svc-web
    spec:
      # 映射Pod端口信息
      ports:
        # 指定SVC的端口
      - port: 9999
        # 指定Pod提供服务的端口
        targetPort: 80
      # 指定标签,用于匹配关联的POD
      selector:
         class: linux82
    [root@k8s151.oldboyedu.com rs]# 

    查看所有的svc:
    kubectl get svc


    查看指定svc的详细信息:
    kubectl describe svc linux82-svc-web


    rc资源有两大缺陷:
        (1)不支持声明式更新镜像;
        (2)升级的时候有时候需要运维人员介入解决svc无法自动关联Pod的现象;
            为了避免这种现象发生,将rc资源的selector和svc的selector定义成不一样的关联即可。见视频。

    基于rc升级和回滚:
    1.创建原始版本
    kubectl apply -f 01-rc-svc.yaml -f 02-rc-nginx-old.yaml 

    2.测试访问服务
    curl -I 10.0.0.53:30088


    3.升级
    kubectl rolling-update oldboyedu-linux82-rc-web-old -f 03-rc-nginx-update-new.yaml --update-period=1s
            oldboyedu-linux82-rc-web-old:
                表示现有的rc名称。
            -f 03-rc-nginx-update-new.yaml 
                基于哪个文件升级或回滚。
            --update-period=1s
                升级的间隔时间。

    4.升级后运行需要解决用户无法访问Pod的情况
        方案一: 
            使用旧的svc,即给新的pod打标签。
    kubectl label  pods --all class=linux82
    # kubectl label  pods --all class-  # 删除标签

        方案二:
            使用新的svc。
    kubectl delete -f 01-rc-svc.yaml 
    kubectl apply -f 04-rc-svc-new.yaml 


    5.回滚
    kubectl rolling-update oldboyedu-linux82-rc-web-new -f 02-rc-nginx-old.yaml  --update-period=1s
    kubectl delete -f 04-rc-svc-new.yaml
    kubectl apply -f  01-rc-svc.yaml 

    资源清单:
    [root@k8s151.oldboyedu.com test]# cat 01-rc-svc.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: linux82-svc-web-nodeport-002
    spec:
      type: NodePort
      ports:
      - port: 9999
        targetPort: 80
        nodePort: 30088
      selector:
         class: linux82
    [root@k8s151.oldboyedu.com test]# 
    [root@k8s151.oldboyedu.com test]# cat 02-rc-nginx-old.yaml 
    kind: ReplicationController
    apiVersion: v1
    metadata:
      name: oldboyedu-linux82-rc-web-old
    spec:
      # 指定Pod的副本数量,若不指定,则默认值为1.
      replicas: 3
      # 定义标签选择器,即用于关联Pod的标签。
      selector:
         school: oldboyedu
      # 定义Pod的模板
      template:
         metadata:
            name: linux82-web
            labels:
               school: oldboyedu
               class: linux82
         spec:
            # nodeName: k8s152.oldboyedu.com
            containers:
            - name: linux82-web
              image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.14
    [root@k8s151.oldboyedu.com test]# 
    [root@k8s151.oldboyedu.com test]# cat 03-rc-nginx-update-new.yaml 
    kind: ReplicationController
    apiVersion: v1
    metadata:
      name: oldboyedu-linux82-rc-web-new
    spec:
      replicas: 3
      selector:
         school: oldboyedu-new
      template:
         metadata:
            name: linux82-web
            labels:
               school: oldboyedu-new
               address: beijing-linux82
         spec:
            containers:
            - name: linux82-web
              image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.16
    [root@k8s151.oldboyedu.com test]# 
    [root@k8s151.oldboyedu.com test]# cat 04-rc-svc-new.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: linux82-svc-web-nodeport-002-new
    spec:
      type: NodePort
      ports:
      - port: 9999
        targetPort: 80
        nodePort: 30088
      selector:
         school: oldboyedu-new
         address: beijing-linux82
    [root@k8s151.oldboyedu.com test]# 

    deoloyment资源控制器: ---> 声明式更新
    [root@k8s151.oldboyedu.com deploy]# cat 01-deploy-nginx.yaml 
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: oldboyedu-linux82-deploy-nginx
    spec:
      replicas: 3
      selector:
         matchLabels:
            school: oldboyedu
      template:
         metadata:
            name: linux82-web
            labels:
               school: oldboyedu
               class: linux82
         spec:
            containers:
            - name: linux82-web
              # image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
              image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.18
              livenessProbe:
                tcpSocket:
                   port: 80
                failureThreshold: 3
                initialDelaySeconds: 15
                periodSeconds: 1
                successThreshold: 1
                timeoutSeconds: 1
              # readinessProbe:
              #   httpGet:
              #      port: 80
              #      path: /oldboyedu.html
              #   failureThreshold: 3
              #   initialDelaySeconds: 15
              #   periodSeconds: 1
              #   successThreshold: 1
              #   timeoutSeconds: 1

    ---

    apiVersion: v1
    kind: Service
    metadata:
      name: linux82-svc-web-nodeport-002
    spec:
      type: NodePort
      clusterIP: 10.254.100.100
      ports:
      - port: 9999
        targetPort: 80
        nodePort: 30088
      selector:
         class: linux82
    [root@k8s151.oldboyedu.com deploy]# 

    响应式更新:
    kubectl set image deploy oldboyedu-linux82-deploy-nginx linux82-web=k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.16
    kubectl set image  资源类型        资源类型名称              容器名称=镜像名称


    基于edit编辑:
    kubectl edit deployments. oldboyedu-linux82-deploy-nginx 


          副本数量        
    old :  5
    new :  5

        附加条件:
            old ---> new :
                - 5 + 2 ---> 7 升级过程中最大的pod
                - 5 - 1 ---> 4 最少保证4个可用。

    升级需要几次?请说明原因:
        第一次升级:
            old : 3        5    4    5    2    ---> 4
            new : 2        2    2    2    3    ---> 3 
            
        第二次升级:
            old:     3    0    4    2    1    3    6    --->     1
            new:    4    7    2    5    6    4    4    --->    3 +  2 ---> 5
            
        ...


    replicas: 8


    maxSurge: 5
    maxUnavailable: 3

    ---->

        第一次升级
            old :   5
            new :   8    
            
            

    replicas: 7
    maxSurge: 2  
        ---> max ---> 9
    maxUnavailable: 3 
        ---> min ---> 4


        第一次升级:
            old:    4
            new:    5

        第二次升级:
            old:              0
            new:    5 + 2 --> 7

            
    基于deployment升级:
    [root@k8s151.oldboyedu.com deploy]# cat 02-deploy-nginx-update-strategy.yaml 
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: oldboyedu-linux82-deploy-nginx-strategy
    spec:
      replicas: 5
      selector:
         matchLabels:
            school: oldboyedu
      # 定义升级策略
      strategy:
        # 升级的类型,"Recreate" or "RollingUpdate"
        # Recreate:
        #   先停止所有的Pod运行,然后在批量创建更新。
        #   生产环节中不推荐使用这种策略,因为升级过程中用户将无法访问服务!
        # RollingUpdate:
        #   滚动更新,即先实现部分更新,逐步替换原有的pod,是默认策略。
        type: RollingUpdate
        # 自定义滚动更新的策略
        rollingUpdate:
          # 在原有Pod的副本基础上,多启动Pod的数量。
          maxSurge: 2
          # 在升级过程中最大不可访问的Pod数量.
          maxUnavailable: 1
      template:
         metadata:
            name: linux82-web
            labels:
               school: oldboyedu
               class: linux82
         spec:
            containers:
            - name: linux82-web
              # image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
              #  image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.18
              image: nginx:1.14
              livenessProbe:
                tcpSocket:
                   port: 80
                failureThreshold: 3
                initialDelaySeconds: 15
                periodSeconds: 1
                successThreshold: 1
                timeoutSeconds: 1
              # readinessProbe:
              #   httpGet:
              #      port: 80
              #      path: /oldboyedu.html
              #   failureThreshold: 3
              #   initialDelaySeconds: 15
              #   periodSeconds: 1
              #   successThreshold: 1
              #   timeoutSeconds: 1

    ---

    apiVersion: v1
    kind: Service
    metadata:
      name: linux82-svc-web-nodeport-002
    spec:
      type: NodePort
      clusterIP: 10.254.100.100
      ports:
      - port: 9999
        targetPort: 80
        nodePort: 30088
      selector:
         class: linux82
        
        
    扩展作业:
        (1)使用阿里云部署K8S集群,并将11个游戏将部署到云平台提供访问,要求使用svc的类型为LoadBalancer。
        (2)使用kubeadm1.15或Kubeadm 1.19版本将其etcd数据库独立部署出来,不要使用内置的;
        (3)调研K3S二进制部署,K3S是轻量级的K8S发行版;
        (4)部署ranger管理K8S集群;


    常见错误:
        PodFitsHostPorts:
            问题原因:
                和Pod调度节点的端口有所冲突。
            解决方案:
                可能无法提供给"ss -ntl"来观察,需要借助"iptables -t nat -vnL"来观察哟。
                
        Init:ErrImagePull
            问题原因:
                初始化容器拉取镜像失败。
            解决方案:
                一般情况下,请检查网络,权限等维度即可。
                

  • 相关阅读:
    GitLab仓库管理系统安装详细步骤
    MES管理系统如何解决电子企业排产难度大的问题
    亚马逊云科技数据分析为这伴科技赋能,实现“零”中断目标
    做SEO排名优化多久会有效果?实例分析!
    你不会还搞不清楚Spring Data JPA的关联关系注解如何使用吧?
    WIFI 万[néng]钥匙 v5.0.10/v4.9.80 SVIP版!
    curl语法整理
    19.0、C语言——指针笔试面试题
    iNFTnews | NFT或将彻底改变音乐产业
    android 11源码编译系统介绍
  • 原文地址:https://blog.csdn.net/lpx1249115962/article/details/133872621