我们不应该期望k8s Pod是健壮的,而是要假设Pod中的容器很可能因为各种原因发生故障而死掉。Deployment等Controller会通过动态的创建和销毁Pod来保证应用整体的健壮性。换句话说,Pod是脆弱的,但应用是健壮的。

每个Pod都有自己的IP地址,当Controller用新的Pod替代发生故障的Pod时,新Pod会分配新的IP地址,这就产生了一个问题:如果一组Pod对外提供服务,它们的IP很有可能发生变化,那么客户端如何找到并访问这个服务呢?答案就是Service。

一、创建Service

K8s Service从逻辑上代表一组Pod,具体是哪些Pod则是由label来挑选的。Service有自己的IP,而且这个IP是不变的。客户端只需要访问Service的IP,k8s则负责建立和维护Service与Pod的映射关系。无论后端Pod如何变化,对客户端不会有任何影响,因为Service没有变。

(1)创建deployment

apiVersion: apps/v1
kind: Deployment
metadata:name: httpd-deploymentlabels:app: httpd
spec:replicas: 3selector:matchLabels:app: httpdtemplate:metadata:labels:app: httpdspec:containers:- name: httpdimage: httpd:latestports:- containerPort: 80

(2)apply一下

zy@k8s-master:~$ kubectl apply -f httpd.yml
deployment.apps/httpd-deployment created

(3)查看pod

pod分配了各自的IP,这些IP只能被Kubernetes Cluster中的容器和节点访问。

zy@k8s-master:~$ kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
httpd-deployment-59fc85cfcd-kz4m8   1/1     Running   0          92s   10.244.1.17   k8s-node1   <none>           <none>
httpd-deployment-59fc85cfcd-m2tc4   1/1     Running   0          92s   10.244.2.11   k8s-node2   <none>           <none>
httpd-deployment-59fc85cfcd-nz4x5   1/1     Running   0          92s   10.244.2.12   k8s-node2   <none>           <none>

(4)创建Service

编写service配置文件

apiVersion: v1
kind: Service
metadata:name: httpd-svc
spec:selector:run: httpdports:- protocol: TCPport: 8080targetPort: 80

以上代码是 Kubernetes 中的 YAML 文件,用于创建一个名为 httpd-svc 的 Service 资源。该 Service 资源会将流量路由到拥有标签 run=httpd 的 Pod 上,同时将流量从端口 8080 转发到 Pod 中的端口 80。具体来说,代码的各个部分含义如下:

  • apiVersion: v1: 指定 Kubernetes API 版本为 v1,也就是最基本的 API 版本。
  • kind: Service: 指定创建的资源类型为 Service。
  • metadata: 定义元数据,包括资源的名称等信息。
  • name: httpd-svc: 指定该 Service 资源的名称为 httpd-svc
  • spec: 定义 Service 的规范,包括 Service 所要匹配的 Pod 标签以及端口信息。
  • selector: 指定 Service 所要匹配的 Pod 标签,这里是 run=httpd,表示该 Service 会将流量路由到所有拥有标签 run=httpd 的 Pod 上。
  • ports: 定义 Service 的端口映射规则,包括协议、端口号和目标端口号。这里的含义是将 Service 的 8080 端口映射到 Pod 中的 80 端口上。

apply一下:

zy@k8s-master:~$ kubectl apply -f httpd-service.yml
service/httpd-svc created

查看service:

zy@k8s-master:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
httpd-svc    ClusterIP   10.98.248.61   <none>        8080/TCP   3m13s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    26h

(5)查看service的详细信息

y@k8s-master:~$ kubectl describe service httpd-service
Name:              httpd-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=httpd,run=httpd
Type:              ClusterIP
IP:                10.102.206.215
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.21:80,10.244.1.22:80,10.244.2.16:80
Session Affinity:  None
Events:            <none>

endpoints罗列了三个Pod的IP和端口。我们知道Pod的IP是在容器中配置的,那么service的集群IP又是在哪里配置的呢?集群IP如何映射到pod的IP呢?答案是 iptables

二、外网如何访问Service

出来Cluster内部可以访问Service,很多情况下我们也希望应用的Service能够暴露给Cluster外部。K8s提供了多种类型的Service,默认是ClusterIP。

(1)ClusterIP

Service通过集群内部的IP对外提供服务,只有Cluster内的节点和pod可访问,这是默认的service类型。

(2)NodePort

service通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过 <NodeIP>:<NodePort>访问Service

(3)LoadBalancer

Service利用cloud provider 特有的负载均衡对外提供服务,云提供者负责将负载均衡的流量导向Service。

玩转k8s(四)—— 通过Service访问Pod相关推荐

  1. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)

    本节开始学习 Service. 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会 ...

  2. .net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查

    目录 1.pod管理 2.重启策略 3.健康检查 4.进入容器 正文 上一章我们已经通过yaml文件将.netcore程序跑起来了,但还有一下细节问题可以分享给大家. 1.pod管理 1.1创建pod ...

  3. 每天五分钟玩转K8S(二)

    接着上一篇,在安装完k8s后,就要开始对他进行折腾了!! 今天我们要做的就是对k8s的架构进行简单的学习(超级简单). 一.master节点 k8s cluster由master和node组成,节点上 ...

  4. K8S学习之service

    service 一种可以访问后端pod的策略,通过访问service来访问到service关联的后端pod,通常是通过Label Selector实现的. 在kubernetes集群中有三类ip地址: ...

  5. 读书笔记-每天5分钟玩转k8s

    一.K8s基本概念 一.Pod Pod 是容器的集合,通常会将紧密相关的一组容器放到一个 Pod 中,同一个 Pod 中的所有容器共享 IP 地址和 Port 空间,也就是说它们在一个 network ...

  6. 每天5分钟玩转K8S (看书笔记)

    文章目录 第3章 部署k8s集群 安装docker 安装kubeadm,kubelet,kubectl 使用kubeadm创建集群 1.kubeadm初始化创建master 2.配置kubectl 3 ...

  7. 玩转k8s(二)—— Kubernetes架构

    1. Master节点 Master是Kubernetes Cluster的大脑,运行这Daemon服务(守护进程)包括 kube-apiserver.kube-scheduler.kube-cont ...

  8. k8s中hostname, hosts文件, DNS和代理问题, service和pod的访问问题

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 验证一个域名的ip地址可以使用 nslookup xx.xx..xx 在kubernets中不同命名空间的服务相互访问 涉及到的是Pod和Servic ...

  9. k8s(四)—service服务(暴露方式:ClusterIP、NodePort、LoadBalancer、ExternalName、ingress)

    1.service简介 2.开启kube-proxy的ipvs [root@server2 ~]# kubectl -n kube-system get pod | grep proxy 每个节点都有 ...

最新文章

  1. ASP 三十二条精华代码
  2. struts2中struts.xml的http://struts.apache.org/dtds/struts-2.3.dtd文件路径
  3. python读取c盘中的csv文件-python读取当前目录下的CSV文件数据
  4. 学习WINDOWS内核好书
  5. sql注入学习——布尔盲注
  6. CENTOS5下VSFTPD的设置
  7. 互联网公司常用MySQL分库分表方案
  8. 风控人应知的坏账准备金知识
  9. Vertica数据库系列:这几天踩过时间函数的坑
  10. php数据保存txt文件怎么打开方式_php - 利用保存在TXT文件(PHP)中的数组数据 - SO中文参考 - www.soinside.com...
  11. html和css基础整理
  12. PetaLinux 添加启动后自动执行脚本
  13. Android安装同应用不同版本,android一个应用如何在一个手机上装多个不同版本的方法...
  14. 网络安全之KALI使用
  15. 乱象丛生or一路光明,看SSD市场发展现状
  16. java存储protobuf_java中利用mongodb存储protobuf
  17. 2013腾讯马拉松编程初赛3月23日1001
  18. 有哪些句子帮你熬过崩溃期的?
  19. 【东华oj】复试练习题
  20. 文字拉伸css_CSS 3D拉伸文字

热门文章

  1. 使用forEach添加序号
  2. 携手四川受灾家人共渡难关--慰问与赈灾
  3. 036 《你喜欢的样子我都有》观后感
  4. 520 抖音哄女友图片动画+详细讲解
  5. android抖音点赞动画,iOS仿抖音点赞动画、波浪图、主张图、3D旋转、图片处理、播放器等源码...
  6. 第五届“强网杯”全国网络安全挑战赛 - 青少年专项赛 crypto
  7. photoshop位图与智能对象、矢量图形区别
  8. linux 备份手机照片,如何更安全有效的保存手机里的照片?
  9. 自学经验总结+实战:python爬虫的自我修养与每天微信给女朋友发一份直男日报
  10. 运动蓝牙耳机什么牌子好,运动蓝牙耳机品牌推荐