一、通过Service访问Pod

每个Pod都有自己的IP地址,当Controller用新的Pod替换发生故障的Pod时,新Pod会分配到新的IP地址,例如:有一组Pod对外提供HTTP服务,它们的IP很可能发生变化,那么客户端如何找到并访问这个服务呢,Service由此而生。Service从逻辑上代表了一组Pod,具体是哪些则由label来挑选,Service有自己的IP,并且这个IP是不变的,客户端只需要访问Service IP,无论后端Pod如何变化,对客户端访问不会有任何影响,k8s负责建立和维护Service与Pod映射关系。

1、创建Service

①创建示例文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas:
template:
metadata:
labels:
app: httpd #Service将会用这个label来挑选Pod
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort:

②创建一个Httpd的Deployment应用

[root@k8s-node1 ~]# kubectl apply -f httpd.yaml
deployment.extensions "httpd" created [root@k8s-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
httpd-fcdb8b4d8-bzsq8 / Running 2m 10.2.72.180 192.168.56.12
httpd-fcdb8b4d8-k5ds9 / Running 2m 10.2.72.182 192.168.56.12
httpd-fcdb8b4d8-ks4qq / Running 2m 10.2.72.181 192.168.56.12

上图Pod分配了各自的IP,这些IP只能被k8s集群中的容器和节点访问

[root@k8s-node2 ~]# curl 10.2.72.180
<html><body><h1>It works!</h1></body></html>

③创建Service文件

apiVersion: v1      #Service的apiVersion
kind: Service #资源类型
metadata:
name: httpd-svc #Service的名字
spec:
selector:
app: httpd #标签选择,挑选哪些label为app: httpd的Pod作为Service的后端
ports:
- protocol: TCP #将Service的8080端口映射到Pod的80端口,使用TCP协议
port:
targetPort:

④创建Service并查看

[root@k8s-node1 ~]# kubectl apply -f httpd-svc.yaml
service "httpd-svc" created [root@k8s-node1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc ClusterIP 10.1.168.37 <none> /TCP 7s
kubernetes ClusterIP 10.1.0.1 <none> /TCP 8d

httpd-svc分配到一个集群IP,可以通过该IP访问后端的Pod

[root@k8s-node2 ~]# curl 10.1.168.37:
<html><body><h1>It works!</h1></body></html>

⑤查看httpd-svc和Pod的对应关系

[root@k8s-node1 ~]# kubectl describe service httpd-svc
Name: httpd-svc
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpd-svc","namespace":"default"},"spec":{"ports":[{"port":,"protocol":"TC...
Selector: app=httpd
Type: ClusterIP
IP: 10.1.168.37
Port: <unset> /TCP
TargetPort: /TCP
Endpoints: 10.2.72.180:,10.2.72.181:,10.2.72.182:
Session Affinity: None
Events: <none>

Service的Cluster IP是通过iptables映射到Pod中

2、DNS访问Service

①k8s集群中的DNS服务

[root@k8s-node1 ~]# kubectl get deployment --namespace=kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
coredns 4d
heapster 4d

coredns插件是一个DNS服务,当有新的Service被创建,就会添加到DNS记录,集群中的Pod可以通过SERVICE_NAME访问Service

②创建示例

[root@k8s-node1 ~]# kubectl run busybox --rm -it --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ #
/ #
/ #
/ #
/ #
/ # wget httpd-svc.default:
Connecting to httpd-svc.default: (10.1.168.37:)
saving to 'index.html'
index.html % |*************************************************************************| :: ETA
'index.html' saved

同一个命名空间下,busybox Pod可以直接通过httpd-svc访问Service,这也验证了DNS的效性。

不同命名空间下,访问Service需要带上namespace,

wget httpd-svc.demon:

二、外网访问Service

  • 1、ClusterIP
  • Service通过Cluster内部的IP对外提供服务,只有集群内的节点和Pod可以访问,这是默认的Service类型
  • 2、NodePort
  • Service通过Cluster节点的静态端口对外提供服务,Cluster外部可以通过NodeIP:访问Service
  • 3、LoadBalancer
  • Service 利用cloud provider特有的load balancer对外提供服务,cloud provider负责将load balancer的流量导向Service,目前支持GCP、AWS、Azur等

1、NodePort

①创建示例文件

apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
type: NodePort
selector:
app: httpd
ports:
- protocol: TCP
port:
targetPort:

②创建并查看

[root@k8s-node1 ~]# kubectl apply -f httpd-svc.yaml
service "httpd-svc" created
[root@k8s-node1 ~]# kubectl get svc httpd-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc NodePort 10.1.186.145 <none> :/TCP 12s

1、EXTERNAL-IP为nodes,表示可以通过Cluster每个节点自身的IP访问Service
2、PORT(S) 8080:57643,8080是ClusterIP监听的端口,57643刚是节点上监听的端口,k8s默认会从30000~32767这个范围内分配一个可用的端口,每个节点都会监听此端口,并将请求转发给Service

③测试NodePort

[root@k8s-node1 ~]# curl 192.168.56.12:
<html><body><h1>It works!</h1></body></html>

NodePort与ClusterIP一样,也是通过iptables规则实现,负载均衡到每一个Pod,NodePort默认的是随机选择,也可以指定某个固定端口

apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
type: NodePort
selector:
app: httpd
ports:
- protocol: TCP
nodePort: 30000 #指节点上监听的端口
port: 8080 #指ClusterIP上监听的端口
targetPort: 80 #指Pod监听的端口

Node和ClusterIP在各自端口上接收到的请求都会通过iptables转发到Pod的targetPort

linux运维、架构之路-K8s通过Service访问Pod的更多相关文章

  1. linux运维架构师职业规划

    1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...

  2. k8s通过Service访问Pod

    如何创建服务 1.创建Deployment #启动三个pod,运行httpd镜像,label是run:mcw-httpd,Seveice将会根据这个label挑选PodapiVersion: apps ...

  3. k8s通过service访问pod(五)--技术流ken

    service 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod ...

  4. k8s通过service访问pod(五)

    service 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod ...

  5. 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

    做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...

  6. Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!

    Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...

  7. Linux运维企业架构实战系列

    Linux运维企业架构项目实战系列 项目实战1-LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2-LVS.nginx实现负载均衡系列 2.1 项目实战2.1-实现基于LVS负载均衡集 ...

  8. Linux运维企业架构项目实战系列

    Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...

  9. Linux 运维入门到跑路书单推荐

    一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...

随机推荐

  1. Spark中分布式使用HanLP(1.7.0)分词示例

    HanLP分词,如README中所说,如果没有特殊需求,可以通过maven配置,如果要添加自定义词典,需要下载“依赖jar包和用户字典". 分享某大神的示例经验: 是直接"java ...

  2. Oracle-DDL 2- 视图&索引

    DDL-数据定义语句: 二.视图 --视图(view),本身不保存数据,保存的是一个查询语句--对视图的操作等同于对查询语句中源数据的操作--视图占用存储空间较小,可以快速的对特定数据进行访问和操作- ...

  3. SSM框架中表单提交出现400错误

    在jsp页面中: 在controller里传递参数: 由于参数sonTime时String类型,要把String类型的时间转换成Date类型的时间,在过程无法自动完成转换故出现400错误,可以使用@D ...

  4. reids集群状态正常redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster

    重新启动redis集群时启动失败,报错: redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachab ...

  5. python_0基础开始_day08

    第八节 1,文件操作 文件操作目的: 持久化,永久存储 (数据库之前 -- 文件操作就是代替数据库) 读 1,找到文件位 2,双击打开 3,进行一些操作 4,关闭文件 open() 打开,通过pyth ...

  6. mysql-1.1基础

    笔记内容:mysql基础,创建数据库,创建表,操作数据表,操作数据,简单查询,条件查询,排序,分组,聚合,连接查询(等值连接,内连接,外链接),子查询 自己提示:脑图笔记存于网盘中  右键:新标签页打 ...

  7. C中的函数指针的用法

    include<stdio.h> typedef int (*Cal)(int a,int b);//定义一个函数指针,第一个int是指向函数的返回值的类型,后面括号里面的两个int是指指 ...

  8. 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项

    混合开发 随着移动互联网的高速发展,常规的开发速度已经渐渐不能满足市场需求.原生H5混合开发应运而生,目前,市场上许多主流应用都有用到混合开发,例如支付宝.美团等.下面,结合我本人的开发经验,简单谈一 ...

  9. 如何使用sftp下载Linux服务器上的文件到本地

    下载Linux服务器上的文件到本地 Linux服务器上的操作 sftp xxxxx@jumper.xxxx.com 使用put命令进行文件上传,put app.log 本地操作 sftp xxxxx@ ...

  10. 4种常用的Ajax请求方式

    在jQuery中,AJAX常见的请求方式主要有一下4种: 1.$.ajax()返回其创建的 XMLHttpRequest 对象 $.ajax() 只有一个参数:参数key/value对象,包含各配置及 ...