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

news2024/9/20 5:28:46

写在前面


  • 参加考试,分享一些学习 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.com
  port:
    targetPort: 8080-tcp #代表 svc 中某个 port 名称,svc 可以定义多个 port
  to:
    kind: Service
    name: 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/bash

echo "Generating a private key..."
openssl genrsa -out $1.key 2048
echo

echo "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"
echo

echo "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.coloradmin.cn/o/458812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻量级服务器nginx:反向代理的具体配置

系列文章目录 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 反向代理和负载均衡 系列文章目录一 反向代理1.正向代理2.反向代理 二 反向代理的实际部署1.配置tomcat2.配置host&#xff0c;nginx反向代理的配置三 结果展示四 总结 一 反向代理 1.正向代理 我们…

通过docker发布项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言例如&#xff1a;docker项目的发布方式 [docker发布的参考链接](https://www.cnblogs.com/emperorking/articles/11244253.html) 一、docker是什么&#xff1f;…

Django框架之自定义管理页面

Django框架Admin站点管理一些默认的显示和功能包括语言都可以自定义设置处理&#xff0c;以贴近我们的实际业务。 属性说明 列表页属性 配置文件myapp/admin.py from django.contrib import admin from .models import Grades, Students# Register your models here.# 注册班…

收废品小程序开发中的常见问题及解决方法

常见问题 1. 用户界面设计 小程序的用户界面设计至关重要。设计师需要在用户界面中提供清晰的指示&#xff0c;以便用户可以轻松地找到他们需要的功能。同时&#xff0c;设计师还需要确保用户界面的整体风格与公司的品牌形象相符。 2. 功能开发 开发小程序的功能需要考虑到…

深入学习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…

交叉验证之KFold和StratifiedKFold的使用(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

力扣---LeetCode88. 合并两个有序数组

文章目录 前言88. 合并两个有序数组链接&#xff1a;方法一&#xff1a;三指针(后插)1.2 代码&#xff1a;1.2 流程图&#xff1a;方法二&#xff1a;开辟新空间2.1 代码&#xff1a;2.2 流程图&#xff1a;2.3 注意&#xff1a; 总结 前言 “或许你并不熠熠生辉甚至有点木讷但…

POSTGRESQL COPY 命令原理与加速数据 导入提高速度200%以上

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

vue2+vue3——107+

vue2vue3——107 vue2 Vuex工作原理图【23:54】vue2 搭建Vuex环境【26:40】插入 话题npm i vue3 store / index.js修改 vue2 求和案例_vuex版【22:39】vue2 vuex开发者工具的使用【23:21】vue2 getters配置项【07:55】vue2 mapState与mapGetters【25:20】vue2 mapActions与mapM…

egg3.0连接egg-mongoose操作数据库,删除一条数据、批量删除数据

删除一条数据 定义service app\service\role.js async delItem() {const { ctx } this;let results;await ctx.model.Role.deleteOne({ name: test-S3 }).then(res > {console.log(results-del-success, res);results res?.deletedCount > 0;}).catch(err > {con…

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

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

为何C语言的函数调用要用到堆栈,而汇编却不需要自定义栈

一 ≠ 汇编不需要堆栈 汇编中一般不初始化&#xff0c;也就是直接使用系统的堆栈而已&#xff0c;自己定义堆栈还是要初始化的。 之前看了很多关于uboot的分析&#xff0c;其中就有说要为C语言的运行&#xff0c;准备好堆栈。 而自己在Uboot的start.S汇编代码中&#xff0c…

crm-day04 分页查询市场活动,刷新市场活动列表

分页插件 分页这个组件前端要写也很麻烦&#xff0c;而且与业务逻辑代码无关&#xff0c;因此我们引入一个分页查询的插件。 进行jsp测试 三大步骤&#xff1a; 1、引入相关的包 2、创建容器来保存插件的运行结果 容器是<input typetext/>或者div。 3、容器加载完成后&a…

猫猫与主人

时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 对猫猫按照友善值进行排序 对主人按照期望友善值进行排序 就可以找到能收养猫猫的主人 对主人的友善值取一个max最后跟猫猫的期望友…

用大佬开发的模板做了“智慧水务”,终于可以和老板谈加薪喽!

为什么各个行业要进行数字化转型&#xff1f; 其实很好理解&#xff0c;这其中很大一部分属于传统行业&#xff0c;以往运营方式较为粗放&#xff0c;信息标准化程度偏低&#xff0c;但同时也意味着数字化的历史包袱轻&#xff0c;此时跟上潮流进行数字化转型&#xff0c;有利于…

美颜SDK的性能测试和优化方案

美颜SDK作为美颜相机、短视频等应用的核心技术之一&#xff0c;对于提升用户体验和增加应用商业价值起到了至关重要的作用。然而&#xff0c;如何对美颜SDK进行性能测试和优化&#xff0c;成为了广大应用开发者们所面临的一大难题。很多开发者也曾经向小编提起过应该如何着手优…

nodejs+python+php+springboot+vue 校园安全车辆人员出入安全管理系统

拟开发的校园安全管理系统通过测试,确保在最大负载的情况下稳定运转,各个模块工作正常,具有较高的可用性。系统整体界面简洁美观,用户使用简单,满足用户需要。在因特网发展迅猛的当今社会,校园安全管理系统必然会成为在数字信息化建设的一个重要方面。 本文阐述了开发的校园安全…

马斯克要告微软 拒绝AI训练“白嫖”数据

“现在是诉讼时间。”4月20日&#xff0c;推特被微软踢出其数字营销平台后&#xff0c;新掌门人马斯克立马发推回击称&#xff0c;微软用推特的数据做“非法训练”。这一怼&#xff0c;直接揭开了AI大模型开发商与数据源的利益之争。 此前&#xff0c;在线社区论坛Reddit与程序…

黑马redis实战篇-商铺缓存

目录 五、实战篇-商户查询缓存 5.1 什么是缓存 5.2 添加Redis缓存 1、不添加redis时&#xff0c;数据查询的作用模型&#xff1a; 2、添加redis时&#xff0c;数据查询的作用模型&#xff1a; 3、业务流程图&#xff1a;​编辑 4、代码实现 5、练习题 5.3 缓存更新策略…

【Android FrameWork (三)】- SystemServer

文章目录 知识回顾启动第一个流程initZygote的流程 前言源码分析1.system_server2.SystemServer.main3,startBootstrapServices4,startService 拓展知识LoadApkcontext 对于Android context 大家是怎么理解的&#xff1f;LocalServices.java: addServece方法中 ArrayMap和HashM…