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:

      

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/linuxws/p/10663232.html
Copyright © 2011-2022 走看看