zoukankan      html  css  js  c++  java
  • 基于Centos7 部署kubernetes v1.21.3 实践-部署应用(入门)

    k8s的环境部署,参考博文:

    本文主要分享,基于k8s v1.21.3集群的应用部署,环境,1主2从,即1个master节点做集群管理,2个node节点工作。

    1.部署nginx Deployment集群

    在master节点,创建文件 nginx-deployment.yaml,内容如下:

    apiVersion: apps/v1	#与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
    kind: Deployment	#该配置的类型,我们使用的是 Deployment
    metadata:	        #译名为元数据,即 Deployment 的一些基本属性和信息
      name: nginx-deployment	#Deployment 的名称
      labels:	    #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
        app: nginx	#为该Deployment设置key为app,value为nginx的标签
    spec:	        #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
      replicas: 1	#使用该Deployment创建一个应用程序实例
      selector:	    #标签选择器,与上面的标签共同作用,目前不需要理解
        matchLabels: #选择包含标签app:nginx的资源
          app: nginx
      template:	    #这是选择或创建的Pod的模板
        metadata:	#Pod的元数据
          labels:	#Pod的标签,上面的selector即选择包含标签app:nginx的Pod
            app: nginx
        spec:	    #期望Pod实现的功能(即在pod中部署)
          containers:	#生成container,与docker中的container是同一种
          - name: nginx	#container的名称
            image: nginx:1.7.9	#使用镜像nginx:1.7.9创建container,该container默认80端口可访问
    

    主节点应用yaml文件:

    kubectl apply -f nginx-deployment.yaml
    

    查看部署结果:

    # 查看 Deployment
    kubectl get deployments
    
    # 查看 Pod
    kubectl get pods
    

    由于集群yaml文件replicas为1,k8s会在集群中选择一个node运行nginx实例,如下:

    [root@node1 ~]# kubectl get deployments
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   1/1     1            1           3m29s
    [root@node1 ~]# kubectl get pods
    NAME                                READY   STATUS    RESTARTS   AGE
    nginx-deployment-746fbb99df-cjbp5   1/1     Running   0          4m27s
    

    同时,在节点node1上,已经拉取nginx镜像到本地,docker ps看到nginx的运行实例。

    这样我们就轻松在k8s上部署了一个实例的nginx应用程序。

    2.pods & nodes

    刚刚我们在k8s集群中已经部署了Deployment的一个pods容器组放置应用nginx的实例,接下来先大致了解下pods和nodes,目的是有些基本的认识。

    Pods

    Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源。这些资源包括:

    • 共享存储,称为卷(Volumes),即图上紫色圆柱
    • 网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享该IP地址
    • container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等

    Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node)上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不同)。

    Nodes
    下图显示一个 Node(节点)上含有4个 Pod(容器组)

    Pod(容器组)总是在 Node(节点) 上运行。Node(节点)是 kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node(节点)都由 master 管理。一个 Node(节点)可以有多个Pod(容器组),kubernetes master 会根据每个 Node(节点)上可用资源的情况,自动调度 Pod(容器组)到最佳的 Node(节点)上。

    每个 Kubernetes Node(节点)至少运行:

    • Kubelet,负责 master 节点和 worker 节点之间通信的进程;管理 Pod(容器组)和 Pod(容器组)内运行的 Container(容器)。
    • 容器运行环境(如Docker)负责下载镜像、创建和运行容器等。

    kubectl
    在部署第一个应用程序 中,我们使用了 kubectl 命令行界面部署了 nginx 并且查看了 Deployment 和 Pod。kubectl 还有如下四个常用命令,在我们排查问题时可以提供帮助:

    • kubectl get-显示资源列表
    # kubectl get 资源类型
    
    #获取类型为Deployment的资源列表
    kubectl get deployments
    
    #获取类型为Pod的资源列表
    kubectl get pods
    
    #获取类型为Node的资源列表
    kubectl get nodes
    
    -------------
    名称空间
    在命令后增加 -A 或 --all-namespaces 可查看所有 名称空间中 的对象,使用参数 -n 可查看指定名称空间的对象,例如
    
    # 查看所有名称空间的 Deployment
    kubectl get deployments -A
    kubectl get deployments --all-namespaces
    # 查看 kube-system 名称空间的 Deployment
    kubectl get deployments -n kube-system
    
    • kubectl describe - 显示有关资源的详细信息 -> 类似docker inspect
    # kubectl describe 资源类型 资源名称
    
    #查看名称为nginx-XXXXXX的Pod的信息
    kubectl describe pod nginx-XXXXXX	
    
    #查看名称为nginx的Deployment的信息
    kubectl describe deployment nginx	
    
    • kubectl logs - 查看pod中的容器的打印日志(和命令docker logs 类似) -> 类似docker logs
    # kubectl logs Pod名称
    
    #查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
    #本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
    kubectl logs -f nginx-pod-XXXXXXX
    
    • kubectl exec - 在pod中的容器环境内执行命令(和命令docker exec 类似) -> 类似docker exec
    # kubectl exec Pod名称 操作命令
    
    # 在名称为nginx-pod-xxxxxx的Pod中运行bash
    kubectl exec -it nginx-pod-xxxxxx /bin/bash
    

    3.通过Kubernetes Service服务外部访问pods内部的container

    事实上,Pod(容器组)有自己的 生命周期 (opens new window)。当 worker node(节点)故障时,节点上运行的 Pod(容器组)也会消失。然后,Deployment (opens new window)可以通过创建新的 Pod(容器组)来动态地将群集调整回原来的状态,以使应用程序保持运行。

    举个例子,假设有一个图像处理后端程序,具有 3 个运行时副本。这 3 个副本是可以替换的(无状态应用),即使 Pod(容器组)消失并被重新创建,或者副本数由 3 增加到 5,前端系统也无需关注后端副本的变化。由于 Kubernetes 集群中每个 Pod(容器组)都有一个唯一的 IP 地址(即使是同一个 Node 上的不同 Pod),我们需要一种机制,为前端系统屏蔽后端系统的 Pod(容器组)在销毁、创建过程中所带来的 IP 地址的变化。

    Kubernetes 中的 Service(服务) 提供了这样的一个抽象层,它选择具备某些特征的 Pod(容器组)并为它们定义一个访问方式。Service(服务)使 Pod(容器组)之间的相互依赖解耦(原本从一个 Pod 中访问另外一个 Pod,需要知道对方的 IP 地址)。一个 Service(服务)选定哪些 Pod(容器组) 通常由 LabelSelector(标签选择器) 来决定。

    在创建Service的时候,通过设置配置文件中的 spec.type 字段的值,可以以不同方式向外部暴露应用程序:

    ClusterIP(默认)

    在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可以访问到

    NodePort

    使用 NAT 在集群中每个的同一端口上公布服务。这种方式下,可以通过访问集群中任意节点+端口号的方式访问服务 :。此时 ClusterIP 的访问方式仍然可用。

    LoadBalancer

    在云环境中(需要云供应商可以支持)创建一个集群外部的负载均衡器,并为使用该负载均衡器的 IP 地址作为服务的访问地址。此时 ClusterIP 和 NodePort 的访问方式仍然可用。

    TIP
    
    Service是一个抽象层,它通过 LabelSelector 选择了一组 Pod(容器组),把这些 Pod 的指定端口公布到到集群外部,并支持负载均衡和服务发现。
    
    - 公布 Pod 的端口以使其可访问
    - 在多个 Pod 间实现负载均衡
    - 使用 Label 和 LabelSelector
    

    Service 将外部请求路由到一组 Pod 中,它提供了一个抽象层,使得 Kubernetes 可以在不影响服务调用者的情况下,动态调度容器组(在容器组失效后重新创建容器组,增加或者减少同一个 Deployment 对应容器组的数量等)。

    Service使用 Labels、LabelSelector(标签和选择器) (opens new window)匹配一组 Pod。Labels(标签)是附加到 Kubernetes 对象的键/值对,其用途有多种:

    • 将 Kubernetes 对象(Node、Deployment、Pod、Service等)指派用于开发环境、测试环境或生产环境
    • 嵌入版本标签,使用标签区别不同应用软件版本
    • 使用标签对 Kubernetes 对象进行分类

    给nginx Deployment 创建一个 Service

    创建nginx的Deployment中定义了Labels,如下:

    metadata:	#译名为元数据,即Deployment的一些基本属性和信息
      name: nginx-deployment	#Deployment的名称
      labels:	#标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组
        app: nginx	#为该Deployment设置key为app,value为nginx的标签
    

    创建文件 nginx-service.yaml

    vim nginx-service.yaml
    -----------------
    文件内容如下:
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service	#Service 的名称
      labels:     	#Service 自己的标签
        app: nginx	#为该 Service 设置 key 为 app,value 为 nginx 的标签
    spec:	    #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
      selector:	    #标签选择器
        app: nginx	#选择包含标签 app:nginx 的 Pod
      ports:
      - name: nginx-port	#端口的名字
        protocol: TCP	    #协议类型 TCP/UDP
        port: 80	        #集群内的其他容器组可通过 80 端口访问 Service
        nodePort: 32600   #通过任意节点的 32600 端口访问 Service
        targetPort: 80	#将请求转发到匹配 Pod 的 80 端口
      type: NodePort	#Serive的类型,ClusterIP/NodePort/LoaderBalancer
    

    执行命令

    kubectl apply -f nginx-service.yaml
    

    检查执行结果

    kubectl get services -o wide
    

    可查看到名称为 nginx-service 的服务。

    访问服务

    curl <任意节点的 IP>:32600
    e.g. curl 192.168.181.135:32600
    

    4.伸缩应用程序-使用 kubectl 伸缩应用程序

    Scaling(伸缩)应用程序
    在之前的文章中,我们创建了一个 Deployment (opens new window),然后通过 服务 (opens new window)提供访问 Pod 的方式。我们发布的 Deployment 只创建了一个 Pod 来运行我们的应用程序。当流量增加时,我们需要对应用程序进行伸缩操作以满足系统性能需求。

    伸缩 的实现可以通过更改 nginx-deployment.yaml 文件中部署的 replicas(副本数)来完成

    spec:
      replicas: 2    #使用该Deployment创建两个应用程序实例
    

    TIP
    通过更改部署中的 replicas(副本数)来完成扩展

    将 nginx Deployment 扩容到 4 个副本
    修改 nginx-deployment.yaml 文件
    将 replicas 修改为 4

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80
    

    执行命令

    kubectl apply -f nginx-deployment.yaml
    

    查看结果

    watch kubectl get pods -o wide
    

    一旦运行了多个应用程序实例,就可以在不停机的情况下执行滚动更新了

    5.滚动更新-rolling update

  • 相关阅读:
    js相关禁止
    单例模式 俗称单例3步曲+1曲
    轮廓线重建:二维平行轮廓线重建理论和方法
    一种面向三维地质剖面的形体表面重构算法
    在不使用gluSphere()的情况下在OpenGL中绘制Sphere
    Balabolka
    jQuery学习笔记之可见性过滤选择器
    Flask学习之四 数据库
    Flask学习之三 web表单
    Flask学习之二 模板
  • 原文地址:https://www.cnblogs.com/davis12/p/15137551.html
Copyright © 2011-2022 走看看