昨日内容回顾:
     - 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
         问题原因:
             初始化容器拉取镜像失败。
         解决方案:
             一般情况下,请检查网络,权限等维度即可。