Kubernetes网络

Kubernetes网络

Service 存在的意义

Service引入主要是解决Pod的动态变化,提供统一访问入口:

防止Pod失联,找到提供同一个服务的Pod(服务发现)

定义一组Pod的访问策略(负载均衡)

Pod与Service的关联

Service通过标签关联一组Pod

Service为一组提供负载均衡能力

Service定义与创建

创建service

kubectl create service clusterip web --tcp=80:80

导出成yaml文件

kubectl create service clusterip web6 --tcp=80:8080 --dry-run=client -o yaml > service.yaml

然后执行

kubectl apply -f service.yaml

查看service:

kubectl get service

定义service.yaml

apiVersion: v1

kind: Service

metadata:

name: web

spec:

type: ClusterIP # 服务类型

ports:

- port: 80

protocol: TCP

# Service端口

# 协议

targetPort: 80 # 容器端口(应用程序监听端口)

selector:

app: web

# 指定关联Pod的标签

多端口Service定义:

对于某些服务,需要公开多个端口,Service也需要配置多个端口定义,通过端口名称区分

Service三种常用类型

ClusterIP:

默认, 分配一个稳定的IP地址,即VIP,只能在集群内部访问。

NodePort:

每个节点上启用一个端口来暴露服务,可以在集群外部访问。也会分配一个稳定内部集群IP地址。

访问地址:

<任意NodeIP>:<NodePort>

端口范围:

30000-32767

NodePort:

会在每台Node上监听端口接收用户流量,在实际情况下, 对用户暴露的只会有一个IP和端口,那这么多台Node该使

用哪台让用户访问呢?

这时就需要前面加一个公网负载均衡器为项目提供统一访问入口了。

user -> 公网负载均衡器 -> service nodeport 30001 -> 分布各节点pod

user -> 公网负载均衡器 -> service nodeport 30002 -> 分布各节点pod

user -> 公网负载均衡器 -> service nodeport 30003 -> 分布各节点pod

userspace

LoadBalancer:

与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外, Kubernetes会请求底层云平台(例如阿里云、腾

讯云、 AWS等)上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。

Service代理模式

Service的底层实现主要有iptables和ipvs二种网络模式,决定了如何转发流量

二进制方式修改ipvs模式:

# vi kube-proxy-config.yml

mode: ipvs

ipvs:

scheduler: "rr“

# systemctl restart kube-proxy

注:配置文件路径根据实际安装目录为准

kubeadm方式修改ipvs模式:

kubectl edit configmap kube-proxy -n kube-system

注意:

1、 kube-proxy配置文件以configmap方式存储

2、如果让所有节点生效,需要重建所有节点kube-proxy pod

删除之后会自动拉起

然后再node节点上查看是否启用了ipvs规则

流程包流程:客户端 ->NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod

查看负载均衡规则:

o iptables模式

iptables-save |grep <SERVICE-NAME>

o ipvs模式

ipvsadm -L -n

Iptables 与 IPVS对比

Iptables:(适合小规模)

o 灵活,功能强大

o 规则遍历匹配和更新,呈线性时延

IPVS:(适合大规模)

o 工作在内核态,有更好的性能

o 调度算法丰富: rr, wrr, lc, wlc, ip hash,更高效

Service DNS名称

CoreDNS:是一个DNS服务器, Kubernetes默认采用,以Pod部署在集群中。

CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。

ClusterIP A记录格式:

<service-name>.<namespace-name>.svc.cluster.local

示例: my-svc.my-namespace.svc.cluster.local

Ingress为弥补NodePort不足而生

NodePort存在的不足:

o 一个端口只能一个服务使用,端口需提前规划

o 只支持4层负载均衡

Ingress是什么

o Ingress: K8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法

o Ingress Controller: 负责流量路由,根据Ingress生成具体的路由规则,并对Pod负载

均衡

Ingress Controller是什么?

Ingress管理的负载均衡器,为集群提供全局的负载均衡能力。

使用流程:

1. 部署Ingress Controller

2. 创建Ingress规则

Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。

项目地址: https://github.com/kubernetes/ingress-nginx

修改YAML里镜像地址为国内的: lizhenliang/ingress-nginx-controller:v1.1.0

其他控制器: https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

暴露Ingress Controller两种方式:

Service NodePort暴露Ingress Controller

共享宿主机网络( hostNetwork:True )

Ingress 规则配置

创建:

kubectl apply -f xxx.yaml

查看:

kubectl get ingress

测试:本地电脑绑定hosts记录对应ingress里面配置的域名

例: <Ingress Controller Pod所在Node IP> web.aliangedu.cn

Ingress 规则配置: HTTPS

上传证书文件和 certs.sh脚本

加压后执行脚本

配置HTTPS步骤:

1、准备域名证书文件(来自: openssl/cfssl工具自签或者权威机构颁发)

2、将证书文件保存到Secret

3、 Ingress规则配置tls

修改yaml文件

Ingress Controller怎么工作的?

Ingress Controller通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段 Nginx 配置,应用到管理的Nginx服务,然后热加载生效。以此来达到Nginx负载均衡器配置及动态更新的问题。

流程包流程:客户端 ->Ingress Controller(nginx) -> 分布在各节点Pod

四层(传输层):基于IP和端口进行转发

七层(应用层):基于应用层协议转发,例如HTTP:域名、URL等

service,背后有iptables实现

ingress,背后有ingress controller(内部是有个负载均衡技术,是什么?)实现

kube-proxy = ingress controller

访问流程1:

用户(域名) -> 公网负载均衡器 80,443 -> 所有宿主机 service nodeport -> ingress controller(nginx,基于域名) -> 分布在各个节点的pod

注: 增加service(iptables)转发,提高一点时延

访问流程2:

用户(域名) -> 公网负载均衡器 80,443 -> 指定宿主机 ingress controller(nginx,基于域名) -> 分布在各个节点的pod

注:域名必须得解析到ingress controller pod所在的节点ip

公网负载均衡器用途:

1、将内网k8s集群的service、ingress暴露到互联网

2、提高内网k8s集群安全性

nginx-ingress-controller 主要用于访问k8s api获取创建的ingress规则,生成nginx vhost配置并生效

nginx 就是nginx本尊,做了一些优化和功能加强

相关文章

10个运维拿来就用的 Shell 脚本,用了才知道有多爽

1、监控 MySQL 主从同步状态是否异常脚本#!/bin/bash HOST=localhost USER=root PASSWD=123.com IO_SQL_STATUS=$(mysql -h$...

通过 lua 进行 nginx redis 访问控制

Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等。1. 需求分析1. Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限...

NGINX常规CORS错误解决方案

CORS错误CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种机制,它使用额外的HTTP头部来告诉浏览器允许一个网页运行的脚本从不同于它自身来源的服务器上请求资...

每日漏洞 | Host头攻击

0x00 概述漏洞名称:Host头攻击风险等级:低问题类型:管理员设置问题0x01 漏洞描述很多场景下,开发者都相信HTTP Host header传递的参数值用来更新链接导出脚本或者一些敏感操作。但...

【Docker 新手入门指南】第八章:网络配置

一、端口映射进阶:-p与-P的核心差异随机映射(-P)场景:快速启动服务,自动分配宿主机端口(适用于开发测试)。docker run -d -P nginx # 容器 80 端口随机映射到宿主机高端口...