热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

k8s入门使用Service管理Pod访问

我们通过Deployment可以为一个应用创建多个Pod,而且可以动态的进行增加、或者删除多余的Pod,KubernetesPod是有生命周期的,它们可以被创建,也可以被销毁,但是

我们通过Deployment可以为一个应用创建多个Pod,而且可以动态的进行增加、或者删除多余的Pod,Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,但是每次Pod的IP地址就会发生变化,外面如何访问到该Pod呢?总不能每次Pod重启就修改访问的IP地址吧。 每个 Pod 都会获取它自己的 IP 地址,但是每次即使这些 IP 地址不总是稳定可依赖的。 这会导致一个问题:在 Kubernetes 集群中,如果一组 Pod(称为 backend)为其它 Pod (称为 frontend)提供服务,那么那些 frontend 该如何发现,并连接到这组 Pod 中的哪些 backend 呢?

这个时候就要用到Service了。

一、Service概念

Service定义了一个服务的访问入口地址,前端的应用(Pod)通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。 Service与其后端Pod副本集群之间则是通过Label Selector来实现”无缝对接“

既然每个Pod都会被分配一个单独的IP地址,而且每个Pod都提供了一个独立的Endpoint**(Pod IP+ContainerPort)**以被客户端访问,现在多个Pod副本组成了一个集群来提供访问。

Kubernetes 需要在每个Node上安装kube-proxy,kube-proxy进程其实就是一个智能的软件负载均衡器,它负责把对Service的请求转发到后端的某个Pod实例上,并在内部实现服务的负载均衡与会话保持机制。

Kubernetes发明了一个很巧明的设计,Service不是共用一个负载均衡器的IP地址,而是每个Service分配了一个全局唯一的虚拟IP地址,这个虚拟IP被称为Cluster IP。这样每个服务就变成了具备唯一IP地址的”通信节点”,服务调用就变成了最基础的TCP网络通信问题。而且在Service的整个声明周期内,它的Cluster IP不会发生改变

二、Service的几种类型

在Serive定义时,我们需要指定spec.type字段,这个字段拥有四个选项:

ClusterIP。默认值。给这个Service分配一个Cluster IP,它是Kubernetes系统自动分配的虚拟IP,因此只能在集群内部访问。

NodePort。将Service通过指定的Node上的端口暴露给外部。通过此方法,访问任意一个NodeIP:nodePort都将路由到ClusterIP,从而成功获得该服务。

LoadBalancer。在 NodePort 的基础上,利用其他第三方的LB暴露服务的,谷歌或者亚马逊的LB等等。

ExternalName。将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上。

三、Service示例

1、ClusterIP

继续我们Nginx的案例,之前用DaemonSet创建了nginx应用,现在为这些应用创建一个Service

[root@k8s-01 ~]# cat nginx-service.yaml
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80

  • 第1行:定义资源类型为Service
  • 第2行:定义当前Service API的版本
  • 第3行:metadata设置
  • 第4行:设置Service的名称为nginx-service
  • 第5行:spec: 开始设置Service的内容
  • 第6行:selector: 为该Service指定一个匹配的标签
  • 第7行:app: nginx 所有带有标签app:nginx的Pod将使用该Service
  • 第8行:ports: 指定Service需要对外的端口
  • 第9行:设置端口协议:支持TCP和UDP
  • 第10行:设置Service的端口
  • 第11行:设置Pod的端口,Kubernetes会将发送给Service端口的连接,转发到Pod的端口上。

创建Nginx Service

[root@k8s-01 ~]# kubectl create -f nginx-service.yaml
service/nginx-service created

查看Nginx Service

[root@k8s-01 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 18d
nginx-service ClusterIP 10.254.247.47 <none> 80/TCP 10s

访问Servce IP

[root@k8s-01 ~]# curl --head 10.254.247.47
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Tue, 12 May 2020 07:26:00 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes

2、NodePort

在开始之前,将之前创建的pod和service清理下。

1)通过指令创建NodePort

nginx的yaml文件:

[root@k8s-01 ~]# cat nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

创建并查看Pod

[root@k8s-01 ~]# kubectl create -f nginx-pod.yaml
pod/nginx-pod created
[root@k8s-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 26s
[root@k8s-01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Running 0 32s 172.30.64.4 k8s-01 <none> <none>

现在用命令将其配置为NodePort的形式:

[root@k8s-01 ~]# kubectl expose pod nginx-pod --type=NodePort
service/nginx-pod exposed
[root@k8s-01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 18d
nginx-pod NodePort 10.254.199.142 <none> 80:30248/TCP 29s

这个时候可以看到nginx-pod的类型变成了NodePort,而且后面也写明了端口的映射关系:将pod中的80端口映射到node的30248端口。

现在就直接访问node的30248端口:

master:
《k8s入门-使用Service管理Pod访问》

node:
《k8s入门-使用Service管理Pod访问》

2)通过yaml形式创建NodePort

在开始之前,先删除刚刚的service

[root@k8s-01 ~]# kubectl delete svc nginx-pod
service "nginx-pod" deleted

然后编写yaml文件

[root@k8s-01 ~]# cat service-nginx.yml
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 32001
targetPort: 80
nodePort: 32111

  • port:service暴露在cluster ip(Seriver ip )上的端口,:port 是提供给集群内部客户访问service的入口。
  • nodePort:kubernetes提供给集群外部客户访问service入口的一种方式(另一种方式是[LoadBalancer]),是提供给集群外部客户访问service的入口。
  • targetPort:targetPort很好理解,targetPort是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。

创建:

[root@k8s-01 ~]# kubectl create -f service-nginx.yml
service/nginx-service created

访问:
《k8s入门-使用Service管理Pod访问》

四、外部系统访问Service问题

我们需要掌握kubernetes中的三种IP

  • Node IP:Node节点IP地址
  • Pod IP:Pod的IP地址
  • Cluster IP:Service的IP地址

NodePort的实现方式是在Kubernetes集群里的每个Node上为需要外部访问的Service开启一个对应的TCP请求,外部系统只要用任意Node的IP地址+具体的NodePort端口即可访问服务,在任意node上运行netstat服务,我们可以看到NodePort端口被监听。

但NodePort还没有完全解决外部访问Service的所有问题,比如负载均衡的问题,假如说我们集群中有10个Node,则此时最好有一个负载均衡,外部的请求只需要访问此负载均衡器的IP地址,由负载均衡负责转发流量到后面的node上。
《k8s入门-使用Service管理Pod访问》

上图中Load balancer组件独立于Kubernetes集群之外,通常是一个硬件的负载均衡器,或者是以软件方式实现的,例如Haproxy或者Nginx。对于每个Service,我们通常配置一个对应的Load balancer实例来转发流量到后端的Node。

参考文章:
https://k.i4t.com/kubernetes_service.html
http://k8s.unixhot.com/kubernetes/service-admin.html
http://www.eryajf.net/2127.html


推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 视图分区_组复制常规操作网络分区amp;混合使用IPV6与IPV4 | 全方位认识 MySQL 8.0 Group Replication...
    网络分区对于常规事务而言,每当组内有事务数据需要被复制时,组内的成员需要达成共识(要么都提交,要么都回滚)。对于组成员资格的变更也和保持组 ... [详细]
  • Kubernetes(k8s)基础简介
    Kubernetes(k8s)基础简介目录一、Kubernetes概述(一)、Kubernetes是什么(二& ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • 护墙_搭建LVS负载均衡NAT和DR模式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了搭建LVS负载均衡NAT和DR模式相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • 目录Atlas介绍Atlas部署Atlas基本管理Atlas结合MHA故障恢复读写分离建议Atlas介绍Atlas是由Qihoo360Web平台部基础架构团队开发维护的一个基于My ... [详细]
  • 什么是网关服务器初学linux服务器开发时,我们的服务器是很简单的,只需要一个程序完成与客户端的连接,接收客户端数据,数据处理,向客户端发送数据。但是在处理量很大的情况下,一 ... [详细]
  • PartI:取经处: http:www.ramkitech.com201210tomcat-clustering ... [详细]
author-avatar
tuiqiuq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有