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}}{{"\n"}}{{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:

  

Kubernetes公开应用程序的更多相关文章

  1. k8s(4)-使用服务公开应用程序

    Kubernetes中的服务是一个抽象,它定义了一组逻辑Pod和一个访问它们的策略.服务允许从属Pod之间的松散耦合.与所有Kubernetes对象一样,使用YAML (首选)或JSON 定义服务.服 ...

  2. 使用dotnet-monitor分析在Kubernetes的应用程序:Sidecar模式

    dotnet-monitor可以在Kubernetes中作为Sidecar运行,Sidecar是一个容器,它与应用程序在同一个Pod中运行,利用Sidecar模式使我们可以诊断及监控应用程序. 如下图 ...

  3. scrapy爬行乌云网公开漏洞程序的分析

    # -*- coding: utf-8 -*- from datetime import datetime import pymongo import scrapy from wooyun.items ...

  4. 用集装箱装ASP。带有Docker和Azure Kubernetes服务的NET Core应用程序

    介绍 曾经有一个单一软件应用程序的时代,整个应用程序被打包并部署在作为单个进程运行的单个服务器上.我们都知道,在这个模型中,单点故障可能会导致整个应用程序崩溃. 微服务体系结构的发展是为了解决单片应用 ...

  5. CCF关于公开NOIP复赛选手程序的通告

    为使参加NOIP复赛的选手能了解和保存其竞赛时编制的程序,并相互监督,CCF责成各省特派员在复赛后公开选手程序. 公布方式:以提高组和普及组分别为单位,通过网站或邮件等方式公开.以每个选手可以看到本省 ...

  6. 程序员修神之路--kubernetes是微服务发展的必然产物

    菜菜哥,我昨天又请假出去面试了 战况如何呀? 多数面试题回答的还行,但是最后让我介绍微服务和kubernetes的时候,挂了 话说微服务和kubernetes内容确实挺多的 那你给我大体介绍一下呗 可 ...

  7. 如何将云原生工作负载映射到 Kubernetes 中的控制器

    作者:Janakiram MSV 译者:殷龙飞 原文地址:https://thenewstack.io/how-to-map-cloud-native-workloads-to-kubernetes- ...

  8. [译]Kubernetes 分布式应用部署和人脸识别 app 实例

    原文地址:KUBERNETES DISTRIBUTED APPLICATION DEPLOYMENT WITH SAMPLE FACE RECOGNITION APP 原文作者:skarlso 译文出 ...

  9. k8s 部署应用程序

    k8s相关工具介绍: Kubeadm Kubeadm解决了处理TLS加密配置.部署核心Kubernetes组件和确保其他节点可以轻松地加入集群的问题.生成的集群通过RBAC等机制得到保护. 有关Kub ...

随机推荐

  1. ACM学习历程—HDU5475 An easy problem(线段树)(2015上海网赛08题)

    Problem Description One day, a useless calculator was being built by Kuros. Let's assume that number ...

  2. django models class 不识别问题解决方案

    目录 1. 事情起因 2. 排查经过 3. 总结 1. 事情起因 今天在写代码的时候,在django 的models目录中新增了一个pkg.py文件,里面定义了一个class, 在执行 makemig ...

  3. VBScript 内置函数

    本页列出了所有内建的 VBScript 函数: Date/Time 函数 Conversion 函数 Format 函数 Math 函数 Array 函数 String 函数 其他函数 Date/Ti ...

  4. 数据结构-二叉搜索树的js实现

    一.树的相关概念 1.基本概念 子树 一个子树由一个节点和它的后代构成. 节点的度 节点所拥有的子树的个数. 树的度 树中各节点度的最大值 节点的深度 节点的深度等于祖先节点的数量 树的高度 树的高度 ...

  5. 用Raspberry Pi搭建Azure IOT解决方案

    Raspberry Pi是一款基于Linux的单板机电脑.它由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本计算机科学教育.树莓派配备一枚博通(Broadcom)出产的ARM架构 ...

  6. 问题5:如何快速找到多个字典中的公共键(key)

    方法一:for in循环 from random import randint, sample a1 = {k; randint(1, 4) for k in 'abcdefg'} a2 = {k; ...

  7. winform 客户端采用HTTP协议与服务端通信

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

  8. Shrio00 Shiro认证登录、权限管理环境搭建

    基础环境准备: JDK -> java version "1.8.0_101" MAVEN -> Apache Maven 3.5.0 1 导入依赖 mysql驱动 m ...

  9. centos-6.4 yum EPEL

    初用centos,很多不习惯,记录一下. 首先装EPEL,不然默认的包少得可怜:(详见:http://www.rackspace.com/knowledge_center/article/instal ...

  10. 关于android上dpi/screen-size的厘清解释

    android定义了四种screen-size: small normal large xlarge 同时定义了六种dpi级别: ldpi (low) ~120dpimdpi (medium) ~16 ...