关于 OpenShift(OKD) 网络 Service、Routes的一些笔记

news/2024/4/19 7:33:12/文章来源:https://blog.csdn.net/sanhewuyang/article/details/130361450

写在前面


  • 参加考试,分享一些学习 OpenShift 的笔记
  • 博文内容为 OpenShift 网络相关组件 Service、Routes 很浅的一些认识
  • 学习环境为 openshift v3 的版本,有些旧
  • 这里如果专门学习 openshift ,建议学习 v4 版本
  • 理解不足小伙伴帮忙指正

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波


软件定义网络(SDN)

SDN 即软件定义网络,一种网络架构理念,倡导网络架构与底层基础架构分离,简单讲,SDN 即使用软件方式实现传统硬件交换机和路由器完成的工作,在物理网络上实现多个虚拟的网络。

当前容器平台常用的软件定义网络解决方案或组件有开源的 Weave NetflannelCalicoOpen vSwitch

不同软件定义网络的解决方案或组件各有特点,如 Weave 、 flannel 及 Calico 配置比较简单,功能比较基础 。 Open vSwitch 比较成熟且功能强大,配置起来相对比较复杂

容器网络

默认 docker 使用虚拟网桥,同一个主机上所有容器都连接到该网桥,这些容器利用 Linux namesacp 技术,创建了一对 虚拟网卡,一端在容器内,一端在网桥,这对虚拟网卡类似一个通道一样,两端可以直接通信,同时这些容器只能与同一台主机上的其他容器通信,无法与其他主机上容器通信。

以前 容器跨主机通信中 解决方法,Host 模式端口绑定 的方式都有一定的局限的,通过 SDN 定义专门的容器网络,使网络架构更加灵活,更适用于云计算数据中心的要求.

Host模式

容器直接使用宿主机的网络,这样天生就可以支持跨主机通信。这种方式虽然可以解决跨主机通信问题,但应用场景很有限,容易出现端口冲突,也无法做到隔离网络环境,一个容器崩溃很可能引起整个宿主机的崩溃。

端口绑定

通过绑定容器端口到宿主机端口,跨主机通信时使用“主机IP+端口的方式访问容器中的服务。显然,这种方式 仅能支持网络栈的4层及以上的应用,·并且容器与宿主机紧耦合,很难灵活地处理问题,可扩展性不佳。

定义容器网络

使用 Open vSwitch 或 Flannel/Calico 等第三方SDN工具,为容器构建可以跨主机通信的网络环境。这类方案一般要求各个主机上的 Dockero 网桥的 cidr 不同,以避免出现IP冲突的问题,限制容器在宿主机上可获取的IP范围。并且在容器需要对集群外提供服务时,需要比较复杂的配置,对部署实施人员的网络技能要求比较高。

OpenShift 容器网络

OpenShift 3.9 版本使用 Open vSwitch 构建和维护 OpenShift 网络。 基于 Open vSwitch ,OpenShift 提供了三种不同网络方案:

  • ovs-subnet 插件,默认插件,提供一个 flat 网络,该网络中所有 pod 和 service 可以互相访问。
  • ovs-multitenant 插件,用于隔离 pods 和 service ,每个 project 都会分配一个唯一的虚拟网络 ID(VNID),每个项目中的 pod 都无法与其他项目中 pod 通信。VNID 为 0 的项目中 pod 可以与其他项目中所有 pod 通信,default 项目的 VNID 是 0。
  • ovs-networkpolicy 插件,支持管理员使用 NetworkPolicy 对象定义自己的隔离策略。

默认 master 是不允许通过集群网络访问容器,除非 master 节点同时配置为 nodes 节点。

在 OKD 默认安装环境中,每个 pod 都会获得唯一 ip 地址。一个 pod 中所有容器,就像在同一个主机上。每个 pod 分配一个 ip 意味着,可以把每个 pod 看做是一个物理机或者虚拟机。

OpenShift Service

service 是 Kubernetes 中一个核心的对象,通过 kube-proxy 或者 Ingress 为多个 pods 提供前端负载均衡。service 提供一个稳定的 IP 地址,与后端的多个 pods 通信,而客户端不需要跟踪各个 pod IP 地址。只需要知道 SVC 的地址或者 服务向外发布的地址即可。

在这里插入图片描述

Kubernetes 中的 Service 解决的问题

  • Pod 的 IP 地址是不可靠的,当 Pod 所在的 Node 发生故障时,Pod 将被 Kubernetes 重新调度到另一个 Node,Pod 的 IP 地址将发生变化。无法被跟踪,
  • 如果容器应用本身是分布式的部署方式,做水平扩展,通过多个实例共同提供服务,需要在这些实例的前端设置一个负载均衡器来实现请求的分发。

下面的配置为一个 Service 的核心部分,这里为了方便,我们使用 json 的格式展示

┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc get svc hello-openshift -o json | jq .spec
{"clusterIP": "172.30.169.91","ports": [{"name": "8080-tcp","port": 8080,"protocol": "TCP","targetPort": 8080},{"name": "8888-tcp","port": 8888,"protocol": "TCP","targetPort": 8888}],"selector": {"app": "hello-openshift","deploymentconfig": "hello-openshift"},"sessionAffinity": "None","type": "ClusterIP"
}

具体的属性我们来了解下

  • clusterIP : 指定当前服务发布的 IP ,这个 IP 是作为 负载均衡的 入口地址
  • ports: 为服务发布的端口号,这里的端口 是 Service 提供能力的具体端口,对应 Pod 暴露的 端口,可以看到这是一个多端口的 Service
┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc get svc
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
hello-openshift   ClusterIP   172.30.169.91   <none>        8080/TCP,8888/TCP   11h
┌──[root@vms16.liruilongs.github.io]-[~]
└─$
  • selector : 选择器,K8s 通过标签的方式来选择对应的 后端能力提供者, 可以选择 deployment,replicaset,pod,replicationcontrollerd 等。选择后会自动创建对应的 Endpoint
┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc get svc hello-openshift  --show-labels
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE       LABELS
hello-openshift   ClusterIP   172.30.169.91   <none>        8080/TCP,8888/TCP   15h       app=hello-openshift
┌──[root@vms16.liruilongs.github.io]-[~]
└─$oc get pods --selector=app=hello-openshift
NAME                      READY     STATUS    RESTARTS   AGE
hello-openshift-1-j46gc   1/1       Running   0          15h
  • sessionAffinity : 负载分发策略, 目前 K8s 提供了两个负载分发策略:RoundRobin(轮询)SessionAffinity(基于客户端IP进行会话保持), 在默认情况下,Kubernetes 采用 RoundRobin 轮询模式对客户端请求进行负载分发,可以通过设置 service.spec.sessionAffinity=ClientIP 来启用 SessionAffinity 策略。还有最后一个 type.

type 用于定义发布的服务类型,默认为 ClusterIP

  • ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问
  • NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。Kubernetes master 将从给定的配置范围内(默认:30000-32767)分配端口,每个 Node 将从该端口(每个 Node 上的同一端口)代理到 Service。该端口将通过 Service 的 spec.ports[*].nodePort 字段被指定。
  • LoadBalancer:外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。使用支持外部负载均衡器的云提供商的服务,设置 type 的值为"LoadBalancer",将为 Service 提供负载均衡器。

关于 Service 的创建这里不做分享, OKD 中,大多数情况下会自动创建对应的 Service 资源对象。

OpenShift Routes

RouterOKD 所特有的,在 K8s 体系中,没有对应的API资源,包括上面我们谈到的 DC(DeploymentConfig)、IS 等。

Route 由共享的 router service 提供,以 实例方式方式运行在 pod 中,可以像普通 pod 一样水平扩展。

router service 是基于开源软件 HAProxy,提供集群外客户端访问集群内 pod

[student@master ~]$ oc get route -o wide
NAME               HOST/PORT                                       PATH      SERVICES           PORT      TERMINATION   WILDCARD
docker-registry    docker-registry-default.apps.lab.example.com              docker-registry    <all>     passthrough   None
registry-console   registry-console-default.apps.lab.example.com             registry-console   <all>     passthrough   None
[student@master ~]$

route 连接公网 IP 和内部 service IP 地址 。为了提高性能和减少延迟,OpenShift 路由器直接连接 pod ,此时 service 仅仅提供查询 endpoints 功能。管理员需要配置一个公网可以解析的主机名指向运行 route 的 node 公网 IP。典型地方式是使用 DNS wildcard 配置。

在这里插入图片描述

创建 Routes

yaml 文件方式创建

apiVersion: v1
kind: Route
metadata:name: hello
spec:host: hello.apps.lab.example.comport:targetPort: 8080-tcp #代表 svc 中某个 port 名称,svc 可以定义多个 portto:kind: Servicename: hello

直接通过命令行创建, 查看帮助文档

oc expose -h
oc expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|U
DP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-s
ervice] [--type=type] [options]

一个Demo

oc expose service nginx --name www --hostname=www.apps.lab.example.com

以下是该命令及其选项的详细说明:

  • oc:这是用于与 OpenShift 集群交互的命令行工具。
  • expose:此子命令用于暴露服务。
  • service nginx:这指定要暴露的服务的名称。在本例中,服务名为 nginx。
  • –name www:这指定将用于暴露服务的路由的名称。在本例中,路由将被命名为 www。
  • –hostname=www.apps.lab.example.com:这指定将用于路由的主机名。在本例中,主机名将为 www.apps.lab.example.com。

因此,当您运行此命令时,它将创建一个名为 www 的路由,其主机名为 www.apps.lab.example.com,将 nginx 服务暴露到 OpenShift 集群之外。

执行不带 --hostname 选项的 oc expose 命令创建的 routes 名称格式:

<route-name>-<project-name>.<default-domain>
  • route-name 代表路由名或者参考资源名(对于 oc new-app 命令代表模板,对于 oc expose 命令代表 service)
  • project-name 代表该资源所属 project 名
  • default-domain 配置在 master 节点,匹配通配 DNS 域。

示例,test 项目中名称为 quote 的路由器,显示为:quote-test.cloudapps.example.com

查找默认 routing 子域

默认 routing 子域定义在 master 节点 /etc/origin/master/master-config.yaml 配置文件 routingConfig 块。

示例:

[root@master master]# cat master-config.yaml | grep -A 1 routingConfig
routingConfig:subdomain: apps.lab.example.com
[root@master master]#

OpenShift HAProxy router 默认监听 80 和 443 端口,所以路由只能创建在那些 80 和 443 端口未使用的 node 上。否则只能更改路由监听端口,在路由部署配置文件中设置环境变量 ROUTER_SERVICE_HTTP_PORTROUTER_SERVICE_HTTPS_PORT

router 支持协议
  • HTTP
  • HTTPS with SNI
  • WebSockets
  • TLS with SNI

Routing 选择 和 类型

route 可以加密,也可以不加密。安全的 route 支持使用多种 TLS 加密。非安全的路由配置最简单,不需要 key 和证书

安全路由指定路由 TLS termination。可用的 TLS termination 类型如下:

  • Edge Termination,流量到达 pod 前,在 router 上就终止了。TLS 证书由 router 提供,因此路由必须配置 TLS 证书,否则 TLS termination 使用路由默认证书。由于 TLS 是在 router 上终止的,所以 router 到 endpoints 之间内部网络是非加密的。
  • Pass-through Termination,加密的流量直接发送给目的 pod,不需要路由提供 TLS termination。不需要 key 和证书。目的 pod 提供证书。这也是当前唯一支持客户端证书的方法(双向认证)。
  • Re-encryption Termination,基于 edge termination,但是 route 与目的 pod之间通信会再次加密,可能会使用不同证书。所有路径都做了加密,包括内部网络。route 可以使用健康检查确定 host 认证。

创建安全 route

创建安全路由前,需要生产 TLS 证书。

示例,为名称是 test.apps.lab.example.com 路由创建自签名证书。

  1. 创建私钥。openssl genrsa -out example.key 2048
  2. 使用私钥创建 certificate signing request(csr)。
openssl req -new -key example.key -out example.csr -subj "/C=US/ST=CA/L=LosAngeles/O=Example/OU=IT/CN=test.apps.lab.example.com"
  1. 使用 key 和 CSR 创建证书。
openssl x509 -req -days 366 -in example.csr -signkey example.key -out example.crt
  1. 创建路由
oc create route edge --service=test --hostname=test.apps.lab.example.com --key=example.key --cert=example.crt

访问加密路由 https://test.apps.lab.example.com

可以把证书相关的写成 shell

[root@master ~]# cat gencert.sh
#!/bin/bashecho "Generating a private key..."
openssl genrsa -out $1.key 2048
echoecho "Generating a CSR..."
openssl req -new -key $1.key -out $1.csr -subj "/C=US/ST=NC/L=Raleigh/O=RedHat/OU=RHT/CN=$1"
echoecho "Generating a certificate..."
openssl x509 -req -days 366 -in $1.csr -signkey $1.key -out $1.crt
echo
echo  "DONE."
echo
[root@master ~]#

Demo,创建一个支持 https 的路由

[root@master ~]# oc get svc
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
greeter   ClusterIP   172.30.106.99   <none>        8080/TCP,8888/TCP   6m
[root@master ~]# oc create route edge --service=greeter  --hostname=greeter.apps.lab.example.com --key=greeter.apps.lab.example.com.key --cert=greeter.apps.lab.example.com.crt
route "greeter" created
[root@master ~]# oc get route
NAME      HOST/PORT                      PATH      SERVICES   PORT       TERMINATION   WILDCARD
greeter   greeter.apps.lab.example.com             greeter    8080-tcp   edge          None
[root@master ~]# curl greeter.apps.lab.example.com

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 😃


《OKD 3.9 DO280 Red Hat OpenShift Administration I》

《开源容器云OpenShift:构建基于Kubernetes的企业应用云平台》

https://docs.okd.io/latest/welcome/index.html


© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103224.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源 AI 辅助编程工具 AutoDev 现已上架 Jetbrains 插件市场

我们非常高兴地宣布 AutoDev v0.2.0 的发布&#xff01;AutoDev 是一款强大的 AI 辅助编程工具&#xff0c;可以与 Jetbrains 系列 IDE 无缝集成&#xff08;VS Code 支持正在开发中&#xff09;。通过与需求管理系统&#xff08;如 Github Issue 等&#xff09;直接对接&#…

Vue收集表单数据学习笔记

收集表单数据 v-model双向数据绑定&#xff0c;收集的是input框的value&#xff0c;单选按钮不存在value&#xff0c;就像代码中的男女选项&#xff0c;即使绑定性别v-model“sex”&#xff0c;控制台依然不能接收性别的值&#xff0c;因为没有value值&#xff0c;&#xff0c…

欧几里得算法、扩展欧几里得算法(特解、应用、通解)

文章目录 1. 欧几里得算法&#xff08;也叫辗转相除法&#xff09;1.1 直接上模拟1.2 几何理解1.3 用代数方法证明 g c d ( a , b ) g c d ( b , a % b ) gcd(a, b) gcd(b, a \% b) gcd(a,b)gcd(b,a%b)1.3.1 左推右&#xff1a; g c d ( a , b ) g c d ( b , a % b ) gcd(a…

Handbook of MusicPsychology 音乐心理学手册 ( 多纳德·霍杰斯 Donald.A.Hodges) 笔记

由两个以上的音组成的结合音&#xff0c;除了该声波的波形&#xff0c;人耳会另外脑补出不存在的波形 频率相距较远的一些音与频率相距较近的一些音&#xff0c;前者累加的响度比后者要大 除了泛音部分&#xff0c;音的起声部分也是音色辨别的关键 音高、响度、音色、时值&a…

LINUX的系统管理与维护命令

文章目录 一、LINUX的系统管理与维护命令总结 一、LINUX的系统管理与维护命令 - Linux ls命令:显示指定工作目录下的内容 Linux pwd命令:显示当前工作目录 Linux cd命令:切换工作目录 Linux date命令:显示或设置系统时间 Linux su命令:切换用户 Linux clear命令:清除屏幕 Li…

Java编程设计语言-集合类

API(application programming interface)是JDK的重要组成部分&#xff0c;API提供了Java程序与运行它的系统软件&#xff08;Java虚拟机&#xff09;之间的接口&#xff0c;可以帮助开发者方便、快捷地开发Java程序 集合在程序设计中是一种重要的是数据结构&#xff0c;Java中提…

Semantic Kernel 知多少 | 开启面向 AI 编程新篇章

在 ChatGPT 火热的当下, 即使没有上手亲自体验&#xff0c;想必也对 ChatGPT 的强大略有耳闻。当一些人在对 ChatGPT 犹犹豫豫之时&#xff0c;一些敏锐的企业主和开发者们已经急不可耐地开展基于 ChatGPT 模型 AI 应用的落地探索。 因此&#xff0c;可以明确预见的是&#xf…

Java+Angular开发的医院信息管理系统源码,系统部署于云端,支持多租户

云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供 基于云计算技术的B/S架构的云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、…

系统分析师之软件工程(十二)

目录 一、 软件开发生命周期 1.1 开发阶段工作细分 二、软件开发模型 2.1 瀑布模型 2.2 原型模型 2.3 增量模型与螺旋模型 2.4 V模型 2.5 喷泉模型 2.6 快速应用开发模型RAD 2.7 构件主装模型 2.8 统一过程 2.9 敏捷方法 三、逆向工程 四、净室软件工程 一、 软件…

斯坦福| ChatGPT用于生成式搜索引擎的可行性

文&#xff5c;智商掉了一地 随着 ChatGPT 在文本生成领域迈出了重要一步&#xff0c;Bing 浏览器也接入了聊天机器人功能&#xff0c;因此如何保证 Bing Chat 等搜索引擎结果的精确率和真实性也成为了搜索领域的热门话题之一。 当我们使用搜索引擎时&#xff0c;往往希望搜索结…

电子阅读器市场角力,AI成为关键变量

配图来自Canva可画 近年来&#xff0c;随着国家“书香型社会”建设政策的出台&#xff0c;公众的阅读需求正在逐年增加&#xff0c;各类读书产品和读书活动&#xff0c;也如同雨后春笋般涌现&#xff0c;人们的阅读体验日益得到丰富。比如&#xff0c;昨天世界读书日举行的“不…

更简单的存取Bean方式-@Bean方法注解

1.Bean方法存储 类注解是添加在某个类上的,那么方法注解是添加在某个方法前的 public class UserBeans {Beanpublic User user1(){User user new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");retur…

【分布式搜索引擎ES01】

分布式搜索引擎ES 分布式搜索引擎ES1.elasticsearch概念1.1.ES起源1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引 1.3.es的一些概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch 1.4.1安装es、kibana、IK分词器1.4.2扩展词词典与停用词词典 2.索引库操作2.1.mappi…

Springcloud连接nacos集群,nacos地址配置为nginx,报错:requst nacos server failed

先说下版本&#xff1a; Spring cloud&#xff1a; Hoxton.SR12 spring.cloud.alibaba&#xff1a; 2.2.9.RELEASE spring.boot&#xff1a; 2.3.12.RELEASE Linux Centos7 nacos-server&#xff1a;2.1.0 nginx&#xff1a; 1.20.2 环境说明&#xff1a; nacos正常搭建三个集…

supervisor安装

说明 Supervisor翻译过来是监管人&#xff0c;在Linux中Supervisor是一个进程管理工具&#xff0c;当进程中断的时候Supervisor能自动重新启动它。可以运行在各种类Linux/unix的机器上&#xff0c;supervisor就是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通…

【虚幻引擎】UE4/UE5科大讯飞文字合成语音

一、链接地址 链接&#xff1a;https://pan.baidu.com/s/15Qoc48x3DLpw4eW1qHXInQ 提取码&#xff1a;jqpx B站视频链接&#xff1a;https://space.bilibili.com/449549424?spm_id_from333.1007.0.0 二、案例介绍 第一步&#xff1a;首先进入讯飞开放平台注册一个账号&…

ThreadPoolExecutor源码阅读流程图

1.创建线程池 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), def…

Automa函数学习(三)

从变量中获取数据 当我们想要用automa获取文本标签获取到网页的文本内容后,想要将获取到的文本内容当做参数往后面的标签里进行传递时就需要用到automa提供的传参格式 {{ variables.自定义参数名}} 举例: 先建立打开百度首页工作流 前面自定义的变量名为text,所以这里参数拼接…

开放式耳机有什么好处,盘点几款性能不错的开放式耳机

随着人们对生活质量要求的提高&#xff0c;大家在运动的时候都喜欢戴上耳机&#xff0c;享受运动的乐趣。但是传统耳机戴久了之后就会出现耳朵酸痛的情况&#xff0c;这是因为传统耳机佩戴方式是通过空气振动来传递声音&#xff0c;而人在运动时就会伴随着大量的汗水&#xff0…

深入学习RabbitMQ五种模式(一)

1.安装erlang 下载otp_win64_25.3.exe https://www.erlang.org/downloads erlang安装完成&#xff0c;需要配置erlang环境变量 ERLANG_HOMEE:\software\Erlang OTPPATH%PATH%;%ERLANG_HOME%\bin; 2.安装RabbitMQ 下载rabbitmq-server-3.11.13.exe https://www.rabbitmq.com/dow…