zoukankan      html  css  js  c++  java
  • k8s 微服务pod

    pod初始

    K8s有很多技术概念,同时对应很多API对象,最重要的也是最基础的是微服务Pod。Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支持是K8s最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个Nginx容器用来发布软件,另一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。这就是K8S中的POD。

    Pod是K8s集群中所有业务类型的基础,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和StatefulSet。

    Pod的初体验

    apiVersion: v1
    kind: Pod
    metadata:
      name: first-pod
      labels:
        app: bash
    spec:
      containers:
        - name: bash-container
          image: busybox
          command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10']
    

    执行结果

    # 创建k8s资源服务
    [root@master1 ~/k8s_test]# kubectl apply -f pod.yaml 
    pod/first-pod created
    
    # 查看文件启动的服务
    [root@master1 ~/k8s_test]# kubectl get -f pod.yaml 
    NAME        READY   STATUS              RESTARTS   AGE
    first-pod   0/1     ContainerCreating   0          33s
    
    

    Pod带来的好处

    1. Pod做为一个可以独立运行的服务单元,简化了应用部署的难度,以更高的抽象层次为应用部署管提供了极大的方便。

    2. Pod做为最小的应用实例可以独立运行,因此可以方便的进行部署、水平扩展和收缩、方便进行调度管理与资源的分配。

    3. Pod中的容器共享相同的数据和网络地址空间,Pod之间也进行了统一的资源管理与分配。

    Pod是如何管理多个容器的

    Pod中可以同时运行多个进程(作为容器运行)协同工作。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境和依赖,所以它们总是被同时调度。在一个Pod中同时运行多个容器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。

    Pod中的数据持久性

    Pod在设计⽀持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死掉会被驱逐。通常,我们是需要借助类似于Docker存储卷这样的资源来做Pod的数据持久化的

    Pod的生命周期和重启策略

    Pod 在整个生命周期过程中被系统定义为各种状态,熟悉 Pod 各种状态对于我 理解如何设置 Pod的调度策略、重启策略是很有必要的。

    Pod的状态

    状态值 描述
    挂起(Pending) API Server创建了pod资源对象已存入etcd中,但它尚未被调度完成,或者仍处于从仓库下载镜像的过程中。
    运行中(Running) Pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成
    成功(Succeeded) Pod中的所有容器都已经成功终止并且不会被重启
    失败(Failed) Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止。即容器以非0状态退出或者被系统禁止。
    未知(Unknown) Api Server无法正常获取到Pod对象的状态信息,通常是由于无法与所在工作节点的kubelet通信所致。

    Pod的重启策略

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

    1. Always:当容器失效时,由kubelet自动重启该容器。

    2. OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器

    3. Never:不论容器运行状态如何,kubelet都不会重启该容器。

    kubelet 重启失效容器的时间间隔以 sync-frequency 乘以 2n 来计算;例如1、2、4、8倍等,最长延时 5min ,并且在成功重启后的 10 min 后重置该时间。

    Pod的重启策略与控制方式息息相关,当前可用于管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接通过kubelet管理(静态Pod)。每种控制器对Pod的重启策略要求如下:

    1. RC和DaemonSet:必须设置为Always,需要保证该容器持续运行。
    2. Job和CronJob:OnFailure或Never,确保容器执行完成后不再重启。
    3. kubelet:在Pod失效时自动重启它,不论将RestartPolicy设置什么值,也不会对Pod进行健康检查。

    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					# cpu资源
            memory: 1024MiB					# 内存资源
          requests:    					# 表示容器希望被分配到的、
                                                            # 可完全保证的资源量
    
            cpu: 100m					# cpu资源
            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
    
      
      
      
      
      
    # 补充说明
    cpu:200m
    表示占用0.2个cpu资源
    按照1000m的1个cpu资源进行计算。
    这里设置的是初始值,若初始值过小可能分到资源不充足的机器,不能向上占用资源了
    
    内存,
    java 参考jvm虚拟机资源设置
    golang 不用设置内存,靠应用自己去占用
    
    生产环境CPU设置:
    最小设置500m
    一般设置1000m
    较高设置2000
    极高设置3000~4000m
    
    explain查看属性的定义和用法
    查看service资源下metadata的定义及用法
    kubectl explain service.metadata
    
  • 相关阅读:
    aria2
    Tomcat Manager Config
    selenium 入门(Java)
    java线上cpu、内存问题排查方法
    Java多线程知识点
    《Java7并发编程实战手册》读书笔记
    《Java并发编程的艺术》读书笔记
    centos7安装mysql
    Linux用户配置文件
    metasploit魔鬼训练营靶机环境搭建(第二章)
  • 原文地址:https://www.cnblogs.com/xiaolang666/p/15099200.html
Copyright © 2011-2022 走看看