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。
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公开应用程序的更多相关文章
- k8s(4)-使用服务公开应用程序
Kubernetes中的服务是一个抽象,它定义了一组逻辑Pod和一个访问它们的策略.服务允许从属Pod之间的松散耦合.与所有Kubernetes对象一样,使用YAML (首选)或JSON 定义服务.服 ...
- 使用dotnet-monitor分析在Kubernetes的应用程序:Sidecar模式
dotnet-monitor可以在Kubernetes中作为Sidecar运行,Sidecar是一个容器,它与应用程序在同一个Pod中运行,利用Sidecar模式使我们可以诊断及监控应用程序. 如下图 ...
- scrapy爬行乌云网公开漏洞程序的分析
# -*- coding: utf-8 -*- from datetime import datetime import pymongo import scrapy from wooyun.items ...
- 用集装箱装ASP。带有Docker和Azure Kubernetes服务的NET Core应用程序
介绍 曾经有一个单一软件应用程序的时代,整个应用程序被打包并部署在作为单个进程运行的单个服务器上.我们都知道,在这个模型中,单点故障可能会导致整个应用程序崩溃. 微服务体系结构的发展是为了解决单片应用 ...
- CCF关于公开NOIP复赛选手程序的通告
为使参加NOIP复赛的选手能了解和保存其竞赛时编制的程序,并相互监督,CCF责成各省特派员在复赛后公开选手程序. 公布方式:以提高组和普及组分别为单位,通过网站或邮件等方式公开.以每个选手可以看到本省 ...
- 程序员修神之路--kubernetes是微服务发展的必然产物
菜菜哥,我昨天又请假出去面试了 战况如何呀? 多数面试题回答的还行,但是最后让我介绍微服务和kubernetes的时候,挂了 话说微服务和kubernetes内容确实挺多的 那你给我大体介绍一下呗 可 ...
- 如何将云原生工作负载映射到 Kubernetes 中的控制器
作者:Janakiram MSV 译者:殷龙飞 原文地址:https://thenewstack.io/how-to-map-cloud-native-workloads-to-kubernetes- ...
- [译]Kubernetes 分布式应用部署和人脸识别 app 实例
原文地址:KUBERNETES DISTRIBUTED APPLICATION DEPLOYMENT WITH SAMPLE FACE RECOGNITION APP 原文作者:skarlso 译文出 ...
- k8s 部署应用程序
k8s相关工具介绍: Kubeadm Kubeadm解决了处理TLS加密配置.部署核心Kubernetes组件和确保其他节点可以轻松地加入集群的问题.生成的集群通过RBAC等机制得到保护. 有关Kub ...
随机推荐
- Java 网络通信(TCP/UDP)
1.InetAdress类 与 Socket类 >InetAdress >Socket 2.TCP/IP协议簇 客户端: 创建 Socket:根据指定服务端的 IP 地址或端口号构 ...
- HDU1370Biorhythms(中国剩余定理||暴力)
Some people believe that there are three cycles in a person's life that start the day he or she is b ...
- 每天一个linux命令(13):more命令
版权声明更新:2017-05-17博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...
- CodeForces-734E Anton and Tree 树的直径
题目大意: 给定一棵有n个节点的树,有黑点白点两种节点. 每一次操作可以选择一个同种颜色的联通块将其染成同一种颜色 现在给定一个初始局面问最少多少步可以让树变为纯色. 题解: 首先我们拿到这棵树时先将 ...
- 标准模板库(STL)学习指南之map映射
转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...
- HDOJ1015(简单深搜)
Safecracker Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- SpringMvc之参数绑定注解详解之四
简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...
- content-disposition attachment filename 在Firefox和IE中得到不同的结果
在Firefox中需要把filename 用双引号包起来,才能得到想要的名字,不然如果含有空格,会丢掉空格后面的部分.而IE会把空格转为_,因此也需要HttpUtility.UrlPathEncode ...
- k8s 基础(4) k8s安装
转自 http://www.cnblogs.com/informatics/p/7389806.html 安装和配置 从github.com/kubernetes/kubernetes上下载1.6.8 ...
- [codeforces821E]Okabe and El Psy Kongroo
题意:(0,0)走到(k,0),每一部分有一条线段作为上界,求方案数. 解题关键:dp+矩阵快速幂,盗个图,注意ll 关于那条语句为什么不加也可以,因为我的矩阵C,就是因为多传了了len的原因,其他位 ...