TMC Self-Managed 提升跨多云环境安全性
作为云原生技术栈的关键技术之一,Kubernetes 被企业用户广泛试用并开始支撑实际业务应用运行,实现技术先进性带来的生产力提升。但与此同时,随着 Kubernetes 技术的不断广泛与深化使用,企业用户也开始面临诸多技术上的挑战,诸如在不同的基础架构环境中 (私有数据中心、公有云或边缘计算)统一管理的复杂度高,跨不同环境将 Kubernetes 作为一项标准服务交付到不同团队极具挑战性,不同环境和团队的运维方式不一致会导致安全性和合规性风险等等。
面对如此诸多挑战,VMware 推出了面向多云 / 混合云环境的 Kubernetes 资源统一管理的产品解决方案,VMware Tanzu Mission Control(简称 TMC)。这是一个集中式的管理平台,可跨多云环境和多集群进行一致的运维管理和安全保护。它为运维人员提供了单一控制点,使开发人员能够根据需要独立地推进业务向前发展,同时确保跨不同环境实现一致的管理和运维,以提升安全性和监管效果。
长久以来,TMC 只能以提供 SaaS 服务的方式供客户订阅使用。但是在很多情况下,尤其是一些对网络隔离性要求极高的用户,不允许将私有的 Kubernetes 集群开放给公网,导致这些用户无法使用 TMC 解决方案。所以,VMware 针对这种场景正式发布了 TMC 自管理版本(TMC Self-managed,TMC-SM) ,它将 TMC 作为本地部署的方式推向市场,使原先无法使用 TMC SaaS 服务的用户能够尝试使用该 Kubernetes 管理平台,或者原有 SaaS 用户在一些特殊情况下(比如断网)能够作为管理平台的高可用性备份。
本文将主要介绍 TMC-SM 的高层次架构以及部署步骤,让读者快速掌握和了解 TMC-SM 的功能。
高层次架构
TMC-SM 部署全部基于云原生,所以需要一个遵循 CNCF 规范的 Kubernetes 集群。TMC-SM 的高层次架构用一张图来表示如下:
其中:
- 灰色的部分需要用户自己提供,主要包括:基础架构的 CNI 组件,CSI 组件以及外部负载均衡器(LB);遵循 OIDC 标准的身份管理服务;私有镜像仓库;证书管理器和相关 secrets 等。
- 紫色的部分是自带的支撑服务组件,主要包括 Ingress 控制器 - Contour,登录服务 - Pinniped,S 3 存储服务 - Minio,消息服务 - Kafka 以及 SQL 服务 - Postgres 等。
- 黄色的部分是集群代理,需要被管辖的集群都必须安装。
- 绿色的部分是 TMC-SM 服务本体,所有的与用户交互的功能,例如集群生命周期管理,健康观测,数据保护,集群一致性检查,审计等等都在此处实现。TMC-SM 不仅包含交互式 Web 界面,而且还提供命令行工具 TMC CLI 来进行操作,以便集成进一些自动化流程中。
部署准备
在部署之前,我们需要做一些准备工作,主要清单如下:
- 一个遵循 CNCF 标准的 Kubernetes 集群,Api 版本 1.23.X,至少 1 个 Master 节点和 3 个 Worker 节点,每个节点的配置在 4 核 / 8 G 内存 / 40 G 本地磁盘以上。本文使用了 vSphere with Tanzu 7u3L 作为 Kubernetes 集群来源。
- 外部负载均衡器。本文使用 NSX-ALB 作为外部负载均衡器。
- 创建 DNS 记录。假设部署的子域名是 ,分配到的负载均衡器虚拟 IP 为 < load-balancer-ip>,那么需要创建的 DNS 记录清单如下:
- 遵循 OIDC 标准的身份管理服务。此项可以集成现有客户环境的身份服务,或者自建。因为仅做示范之用,本文使用了 OKTA 的 SaaS 服务作为身份管理服务:
前往
注册开发者账户,然后创建新的 app integration:
注意设置参数:
1)Grant Type:
a.Client Credentials
b.Authorization Code
c.Refresh Token
d.Resource Owner Password (optional)
2)Sign-in Redirect URI: https://pinniped-supervisor./provider/pinniped/callback
3)创建新的组 tmc:admin 并把自己的 ID 加入该组。然后把 tmc:admin 加入存取 app 的权限。
4)创建 custom claim mapping。增加名字为 groups 的新 claim,正则表达式 regex 可以是 tmc.* 或者 (tmc:admin|tmc:member) 或者仅仅是 .* 以保证 tmc:admin 和 tmc:member 组都能被选中。
-
私有镜像仓库。本文使用了自建的 Harbor 镜像服务器 harbor-tanzu.eng.vmware.com,并建立了公共项目 tmc。安装镜像将存储在该项目中。
-
安装证书管理器。本文使用 cert-manager 作为证书管理器,并创建相应的 ClusterIssuer,如下:
- 直接安装 cert-manager 如下,本文使用 1.10.2 版本:
#kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.2/cert-manager.yaml
如需离线安装,则须下载相应的容器镜像并推送私有镜像仓库,修改 yaml 文件重定向容器镜像后再执行 kubectl apply。
- 创建自签名证书,获得 ca 证书和私钥 key,此步骤可以通过多种方法获得,常用的就是使用 openssl 命令。然后将 ca 证书和私钥 key 放入 secret/ca-key-pair:
apiVersion: v1
kind: Secret
metadata:
name: ca-key-pair
namespace: cert-manager
data:
tls.crt: LS0tLS1CRUdJTiBDR…
tls.key: LS0tLS1CRUdJTiBFQ…
a) 创建名为 letsencrypt-prod 的 ClusterIssuer,样本 yaml 文件如下:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
ca:
secretName: ca-key-pair
部署
在准备好上述的部署前置条件之后,我们下载 TMC-SM 安装包并解压到 tmc 目录中,然后推送安装镜像到私有镜像仓库中:
#tmc/tmc-local push-images harbor --project harbor-tanzu.eng.vmware.com/tmc --username admin --password vmware
从安装程序中解出缺省的部署配置文件 values.yaml:
#tmc/tmc-local generate-values-schema --output-file values.yaml.tmpl
对 values.yaml 文件做相应的配置,主要的配置点有:
- oidc 服务配置
- 信任 ca 证书配置,包括 tls 和 harbor 的 ca 证书:
然后执行部署安装,并观察 tmc-local 命名空间中 pod 的运行情况,如果都在 running 状态表示部署成功:
#tmc/tmc-local deploy --image-prefix harbor-tanzu.eng.vmware.com/tmc --kubeconfig ~/.kube/config --values=values.yaml
访问 TMC-SM 控制台
使用浏览器访问 https://,并通过身份验证后,便进入了 TMC-SM 的主界面:
你会发现,TMC-SM 和 TMC SaaS 服务的界面几乎一样。同样的,两者的功能也几乎一致,完全可以作为高可用性备份。
总结
TMC 从单一控制点管理所有 Kubernetes 集群,涵盖打包 Kubernetes 发行版、代管 Kubernetes 服务和 DIY 服务。运维人员可以全面了解所有 Kubernetes 资源的状态,随时了解每个集群的运行状况,掌握访问策略、容器镜像仓库策略、网络策略和安全策略等。
TMC Self-managed 版本的推出,将 TMC 的使用范围扩大到了企业的私有环境,而且支持和原有的 SaaS 版本互为备份,提供管理平台的高可用性。
本文作者:熊铭杰,应用现代化解决方案架构师
内容来源|公众号:VMware 中国研发中心
有任何疑问,欢迎扫描下方公众号联系我们哦~
相关文章:

TMC Self-Managed 提升跨多云环境安全性
作为云原生技术栈的关键技术之一,Kubernetes 被企业用户广泛试用并开始支撑实际业务应用运行,实现技术先进性带来的生产力提升。但与此同时,随着 Kubernetes 技术的不断广泛与深化使用,企业用户也开始面临诸多技术上的挑战&#x…...

并发编程 - 线程间三种常见的通信手段
线程间通信是指多个线程之间通过某种机制进行协调和交互,例如:线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中有以下三种实现线程等待的手段 : Object 类提供的 wait(),notify() 和 notifyAll() 方法;C…...
iperf3命令使用说明
iperf3 是一款网络性能测试工具,用于在TCP和UDP数据流之间测量最大带宽。它可以帮助您测试网络连接的速度、延迟、丢包等参数。以下是一些常用的选项和参数的解释: 通用选项: -s 或 --server:运行服务器模式。-c 或 --client &l…...
华纳云:美国Linux服务器磁盘分区备份的操作方式
在美国的Linux服务器上进行磁盘分区备份可以通过以下步骤进行操作: 了解磁盘分区情况: 在开始备份之前,首先需要了解服务器上的磁盘分区情况。可以使用命令 fdisk -l 或 lsblk 查看当前的磁盘和分区信息。 安装备份工具: 如果服务…...
Arrays类
Arrays类位于 java.util 包中,主要包含了操作数组的各种方法。 int[] arr new int[5];//新建一个大小为5的数组Arrays.fill(arr,4);//给所有值赋值4String str Arrays.toString(arr); // Arrays类的toString()方法能将数组中的内容全部打印出来System.out.print(s…...
lua ipairs pairs
这两个函数都是用来遍历表格数组的,性能几乎没有区别,其他区别如下: iparis只会遍历数字索引,并在遇到第一个非数字索引时终止 paris则会遍历所有 local t {22,33,44,name沧浪水,urlwww.freecls.com,55,66}t[10] 100 for k,v…...
swift3.0 废弃 swift 4.0 以后字符串截取
截取前 n 个字符: let str "Hello, Swift!" let prefix str.prefix(5) print(prefix) // "Hello" 截取后 n 个字符: let str "Hello, Swift!" let suffix str.suffix(6) print(suffix) // "Swift!" 截取指…...
休息是不可能休息的
654.最大二叉树 分析:相比较遍历顺序构建二叉树,这个相对简单。 思路:每次找到数组最大值,然后分割数组 class Solution { public:TreeNode*judge(vector<int>&nums){if(nums.size()0) return nullptr;int maxNum0,in…...

Java面向对象(内部类)(枚举)(泛型)
内部类 内部类是五大成员之一(成员变量、方法、构造方法、代码块、内部类); 一个类定义在另一个类的内部,就叫做内部类; 当一个类的内部,包含一个完整的事物,且这个事务不必单独设计…...
macOS - 安装 GNU make、cmake
文章目录 关于 cmake使用 brew 安装 关于 GNU make方式一:brew方式二:下载源码 关于 cmake 官网:https://cmake.org/ 使用 brew 安装 brew 安装 cmake: https://formulae.brew.sh/formula/cmake安装使用 brew : https://blog.csdn.net/lovec…...
vue中style scoped属性的作用
一、为什么要给style 节点加 scoped 属性(vue) 1、作用:当style标签里面有scoped属性时,它的css只作用于当前组建的元素。在单页面项目中可以使组件之间互不污染,实现模块化(实现组件的私有化,不…...
【ARM 嵌入式 编译系列 10.2 -- 符号表与可执行程序分离详细讲解】
文章目录 符号表与可执行程序分离方法一 使用eu-strip方法二 使用 objcopy上篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 下篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结 符号表与可执行程序分离 接着上篇文章 ARM 嵌入式 编译…...
Gin各种参数接收
Gin参数接收 文章目录 Gin参数接收1.各个参数的接收方法Gin中发送JSON数据Gin接收querystring数据Gin接收Form的参数Gin接收URI参数 2.参数绑定方式接收(更加方便)推荐一款软件 1.各个参数的接收方法 声明: 这里的c都是c *gin.Context中的c Gin中发送JSON数据 在传输或接受JS…...

【Python】进阶之 MySQL入门教程
文章目录 数据库概述Mysql概述Mysql安装与使用Navicat安装和使用Mysql终端指令操作Mysql和python交互订单管理案例实现 数据库概述 数据库的由来 发展历程说明人工管理阶段用纸带等进行数据的存储文件系统阶段数据存储在文件中数据库阶段解决了文件系统问题高级数据库阶段分布式…...

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法
Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法一、问题描述二、解决方法1.打开 WORD 2019,点击菜单中的“文件”;…...
三个整数排序
描述 给定三个整数,请将它们按从小到大的顺序输出。 输入 输入为一行,包含三个整数,用空格分隔。 输出 输出为一行,包含三个整数,用空格分隔,表示排序后的结果。 输入样例 1 9 3 7 输出样例 1 3 …...
Nginx反向代理出现错误 502 bad gateway 案例解析
场景描述 Nginx uwsgi flask Flask框架写的程序,使用uwsgi启动,Nginx作为反向代理调用Flask应用。 Flask应用有些操作时间比较长,会超过1分钟,在网页端访问会出现错误: 502 bad gateway。 Nginx的错误日志中会出现错误…...

截止到目前全量主体总数有多少?
企业主体类型 企业主体类型有很多种,一般我们会分为公司(有限责任)、合伙企业、个人独资企业、个体经营户这些类别。 今天我们按照企业,个体,组织的分类方式来看各个主体的总数。 企业:统一社会信用代码…...

HTTP--Request详解
请求消息数据格式 请求行 请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1 请求头 客户端浏览器告诉服务器一些信息 请求头名称: 请求头值 常见的请求头: User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息 可…...
Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client
目录 一、linux posix线程相关函数介绍二、tcp server基础版本三、tpc服务端多线程版本四、tpc客户端代码tcp编程时, 一个server可以对应多个client, server端用多线程可以实现. linux下多线程可以使用POSIX的线程函数, 下面给出服务端和客户端的代码. 一、linux posix线程相关…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...