zoukankan      html  css  js  c++  java
  • Kubernetes公开应用程序

    pod丢失之后,怎样让程序正常工作。

    service的概念和作用

    标签

    Pods 是有生命周期的。当一个工作节点死后,运行在该节点上的pods也会丢失。然后,通过创建新的pods来保持应用程序运行,ReplicaSet将会驱使集群回到正常状态。以保持应用程序的运行。

    举个例子,假设有一个后端图像处理程序并且它有3个副本。这些副本是可以相互替代的;前端系统不应该关心后端副本,甚至不应该关心Pod丢失和重新创建。也就是说,Kubernetes集群中的每个POD都有一个唯一的IP地址,甚至是位于同一节点上的Pods,因此需要有一种方法来自动协调Pods之间的更改,以便您的应用程序能够继续工作。(不使用pod的IP地址进行暴露)

    Kubernetes中的服务(Service)是一个抽象的概念,它定义了包含多个Pod逻辑上的组,以及访问它所遵从的策略。服务在独立的Pod之间建立了松散的耦合关系。服务使用YAML或者JSON定义。通常服务通过Label和Selector来指定哪些Pod在集合中。
    尽管每个Pod都有自己的独立IP,但是这些IP并不暴露给外部,只有通过服务才能将它们暴露出去。服务让你的应用可以和外部通讯。有好几种方式实现,方法是设置ServiceSpec的type属性:

    • ClusterIP(默认) 通过一个内部IP地址暴露服务,只能在集群内访问
    • NodePort 使用NAT,通过与Node相同的出口暴露服务。通过<NodeIP>:<NodePort>在集群外访问Service。是ClusterIP的超集。
    • LoadBalancer 创建一个外部负载均衡器,给服务分配一个固定的外部地址。是NodePort的超集
    • ExternalName 使用externalName参数给服务起一个任意的名称,自动返回一个该名称的CNAME。需要版本V1.7及以上的kube-dns。
    有关不同服务类型的更多信息,请参见“使用源IP教程”。还请参见将应用程序与服务连接
    另外,请注意,有些服务没有在spec中定义selector。没有定义selector的服务也不会创建相应的Endpoint对象。这允许用户手动将服务映射到特定端点(Endpoints)。可能没有选择器的另一个原因是您严格使用的类型是:externalname。

    Services and Labels

     

    a服务通过一组Pods路由通信。服务是允许pods在Kubernetes中死亡和复制而不影响应用程序的抽象概念。相互耦合的Pods(例如应用程序中的前端和后端组件)之间的发现和路由由服务处理。

    服务使用标签和选择器匹配一组Pods,Label和Selector都是对Kubernetes内对象进行操作的分组关键字。标签是附加在对象上的键/值对,可以多种方式使用:

    • 指定用于开发、测试和生产的对象
    • 将版本号当作标签名称
    • 使用label为对象进行分类

    标签可以在创建时或以后附加到对象。他们可以随时修改。现在让我们使用服务公开我们的应用程序,并应用一些标签。

    在这个场景中,您将了解如何使用kubectl暴露命令在集群之外公开Kubernetes应用程序。您还将学习如何使用kubectl Label命令查看标签并将标签应用于对象

    创建一个新的服务并将其公开给外部流量,我们将使用带有nodeport作为参数的expose命令(minikube还不支持loadBalancer选项)。

    #创建一个对外公开的服务
    $ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080  
    service/kubernetes-bootcamp exposed
    #一个集群IP、一个内部端口和一个节点端口
    $ kubectl get services  
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          4m42s
    kubernetes-bootcamp   NodePort    10.97.100.182   <none>        8080:31324/TCP   12s
    #为了了解外部打开了哪个端口(通过NodePort选项),我们将运行Description service命令:
    $ kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: run=kubernetes-bootcamp Annotations: <none> Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.97.100.182 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 31324/TCP Endpoints: 172.18.0.4:8080 Session Affinity: None External Traffic Policy: Cluster Events: <none> #获取节点端口 $ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') $ echo NODE_PORT=$NODE_PORT NODE_PORT=31324 #我们可以使用curl、Node的IP和外部公开的端口来测试应用程序是否公开在集群之外: #我们得到了服务器的响应。本处被曝光。 $ curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6bf84cb898-5mdfp | v=1

      

      

    步骤2:使用标签

    Deployment会自动为Pod创建一个标签。使用describe Deployment命令,可以看到标签的名称:

    $ kubectl describe deployment
    Name:                   kubernetes-bootcamp
    Namespace:              default
    CreationTimestamp:      Sun, 07 Apr 2019 05:39:39 +0000
    Labels:                 run=kubernetes-bootcamp
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               run=kubernetes-bootcamp
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
      Labels:  run=kubernetes-bootcamp
      Containers:
       kubernetes-bootcamp:
        Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
        Port:         8080/TCP
        Host Port:    0/TCP
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
      Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   kubernetes-bootcamp-6bf84cb898 (1/1 replicas created)
    Events:
      Type    Reason             Age    From                   Message
      ----    ------             ----   ----                   -------
      Normal  ScalingReplicaSet  8m40s  deployment-controller  Scaled up replica set kubernetes-bootcamp-6bf84cb898 to 1
    

    让我们使用这个标签来查询我们的Pods列表。我们将使用kubectl get pods命令,其中-l作为参数,后面跟着Label值:

    $ kubectl get pods -l run=kubernetes-bootcamp
    NAME                                   READY   STATUS    RESTARTS   AGE
    kubernetes-bootcamp-6bf84cb898-kz876   1/1     Running   0          11m
    

    您也可以这样做,列出现有的服务:

    $ kubectl get services -l run=kubernetes-bootcamp
    NAME                  TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes-bootcamp   NodePort   10.108.220.83   <none>        8080:30790/TCP   11m
    

      

      

    获取Pod的名称并将其存储在POD_NAME环境变量中:

    $ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"
    "}}{{end}}')
    $ echo Name of the Pod: $POD_NAME
    Name of the Pod: kubernetes-bootcamp-6bf84cb898-kz876
    

      

    要apply(申请)新标签,我们使用Label命令,后面跟着对象类型、对象名称和新标签:

    $ kubectl label pod $POD_NAME app=v1
    pod/kubernetes-bootcamp-6bf84cb898-kz876 labeled
    

    这将为我们的Pod应用一个新的标签(我们将应用程序版本固定在Pod上),我们可以使用Description pod命令检查它:

    $ kubectl describe pods $POD_NAME
    Name:               kubernetes-bootcamp-6bf84cb898-kz876
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:               minikube/172.17.0.71
    Start Time:         Sun, 07 Apr 2019 05:39:46 +0000
    Labels:             app=v1
                        pod-template-hash=6bf84cb898
                        run=kubernetes-bootcamp
    Annotations:        <none>
    .......
    

      

    We see here that(我们在这里看到),标签现在已经贴在我们的Pod上了。现在,我们可以使用新标签查询豆荚列表:

    $ kubectl get pods -l app=v1
    NAME                                   READY   STATUS    RESTARTS   AGE
    kubernetes-bootcamp-6bf84cb898-kz876   1/1     Running   0          30m
    

    步骤3删除服务

    要删除服务,可以使用DELETE服务命令。在这里也可以使用标签:

    $ kubectl get services
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          33m
    kubernetes-bootcamp   NodePort    10.108.220.83   <none>        8080:30790/TCP   33m
    $ kubectl delete service -l run=kubernetes-bootcamp
    service "kubernetes-bootcamp" deleted
    $ kubectl get services
    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   34m
    
    #这证实了我们的服务被取消了。要确认该路由不再公开,可以使用以前公开的IP和端口:
    $ curl $(minikube ip):$NODE_PORT
    curl: (7) Failed to connect to 172.17.0.71 port 80: Connection refused
    #这证明该应用程序不再可以从集群外部访问。您可以确认该应用程序仍在运行.
    $ kubectl exec -ti $POD_NAME curl localhost:8080
    Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6bf84cb898-kz876 | v=1
    

    We see here that the application is up:

      

  • 相关阅读:
    apiAutoTest:基于mitmproxy实现接口录制
    FastAPI + Vue 前后端分离 接口自动化测试工具 apiAutoTestWeb
    FastAPI项目实战:"异步"接口测试"平台"
    apiAutoTest:自动化测试用例中调用自定义函数的实现
    测试笔记01-Git
    C++:常量
    C++: 变量类型
    C++:数据类型
    C++:第一个c++程序
    mitrproxy抓包微信小程序
  • 原文地址:https://www.cnblogs.com/linuxws/p/10663232.html
Copyright © 2011-2022 走看看