Red Hat企业级Kubernetes平台,安全默认收紧且自带完整工具链
OpenShift 是 Red Hat 的企业级 Kubernetes 平台。它不是一个简单的「Kubernetes 打包版」,而是在上游 Kubernetes 之上做了大量默认值与能力的扩展:更严格的安全模型、内置镜像仓库与构建能力、独立的 Ingress 抽象(Route)、自带的监控与日志栈,以及一整套运维 Operator。
需要先分清两个发行版:
OCP(OpenShift Container Platform) Red Hat 商业版,基于 RHEL CoreOS,需订阅,有厂商支持
OKD 社区版,基于 CentOS Stream CoreOS,免费,无官方支持
OKD 是 OCP 的上游,版本号一一对应(如 OKD 4.21 ↔ OCP 4.21),但**"能在 OKD 上跑"不等于"Red Hat 支持"**。生产环境用 OCP,学习和验证可以用 OKD 或 OpenShift Local。
版本节奏:约每 4 个月发布一个小版本,同时至少维持 4 个小版本的支持。EUS(Extended Update Support) 版本(如 4.20)额外提供更长的维护周期,生产升级通常按 EUS 到 EUS 规划。
安全模型 SCC(Security Context Constraints)默认收紧,替代已废弃的 PSP
Ingress Route 是原生抽象,Ingress 对象会被自动转换
镜像 ImageStream 提供镜像标签的间接层,配合内置的 Quay 仓库
构建 BuildConfig 支持 S2I(源码到镜像)构建
节点操作系统 RHCOS,由 MachineConfig Operator 声明式管理,不可手工改动
监控日志 内置 Prometheus、Alertmanager、Loki,开箱可用
应用市场 OperatorHub + OLM(Operator Lifecycle Manager)
节点访问 SSH 默认关闭,用 oc debug node/<name> 进入
# 下载客户端(包含 oc 与 kubectl)
export ARCH=$(uname -m)
curl -k https://mirror.openshift.com/pub/openshift-v4/$ARCH/clients/ocp/latest/openshift-client-linux.tar.gz \
-o oc.tar.gz
tar zxf oc.tar.gz
sudo mv oc kubectl /usr/local/bin/
oc version
oc login https://api.ocp.example.com:6443 -u <user>
oc 的版本不能落后于集群超过一个小版本,否则会出现难以理解的 API 报错,升级集群后记得同步更新客户端。
# 安装器与 oc 在同一个发行包目录下
curl -k https://mirror.openshift.com/pub/openshift-v4/$ARCH/clients/ocp/latest/openshift-install-linux.tar.gz \
-o openshift-install-linux.tar.gz
tar zxf openshift-install-linux.tar.gz
sudo mv openshift-install /usr/local/bin/
openshift-install version
安装方式有几种,适用场景不同:
IPI(Installer-Provisioned Infrastructure) 安装器自动创建云资源,最省事
UPI(User-Provisioned Infrastructure) 自己准备机器与负载均衡,最灵活
Agent-based Installer 离线/裸金属友好,生成 ISO 后引导
SNO(Single Node OpenShift) 单节点,边缘场景
OpenShift Local(前身 CRC) 本机虚拟机,开发体验用
install-config.yaml 是安装的核心输入:
apiVersion: v1
baseDomain: example.com
metadata:
name: sno
compute:
- name: worker
replicas: 0
controlPlane:
name: master
replicas: 1
platform:
none: {}
networking:
networkType: OVNKubernetes
bootstrapInPlace:
installationDisk: /dev/disk/by-id/<disk-id>
pullSecret: '<从 Red Hat 获取的 pull secret>'
sshKey: '<公钥>'
要点:compute.replicas 为 0 加上 controlPlane.replicas 为 1,才构成单节点;SNO 只支持 OVNKubernetes 网络类型。
# 生成安装资产并引导
openshift-install --dir=ocp create single-node-ignition-config
openshift-install --dir=ocp wait-for install-complete
export KUBECONFIG=ocp/auth/kubeconfig
oc get nodes
# 准备 install-config.yaml 与 agent-config.yaml 后生成引导 ISO
openshift-install --dir=ocp agent create image
# 用 ISO 引导机器后等待安装完成
openshift-install --dir=ocp agent wait-for bootstrap-complete
openshift-install --dir=ocp agent wait-for install-complete
agent-config.yaml 中需要指定 rendezvous IP 与各主机的网络配置。
# 从 Red Hat 控制台下载 crc 二进制与 pull secret
crc setup
crc start
crc oc-env # 输出配置 oc 环境变量的命令
eval $(crc oc-env)
oc login -u kubeadmin https://api.crc.testing:6443
crc stop
crc delete
# 集群版本与升级状态
oc get clusterversion
oc adm upgrade
oc adm upgrade --to=4.21.5
# 集群 Operator 健康(任何 Operator Degraded 都要立刻查)
oc get clusteroperators
oc describe clusteroperator <name>
# 节点与机器
oc get nodes
oc get machines -A
oc get machineconfigpools
oc debug node/<node-name> # 进入节点,再 chroot /host 拿到宿主 shell
SCC 是 OpenShift 与上游差异最大、也最容易踩坑的地方。上游 Kubernetes 用 PodSecurityPolicy(已废弃)后改用 Pod Security Admission,而 OpenShift 一直用自己的 SCC。
工作机制:
1. 准入控制器根据 Pod 的 securityContext 与 ServiceAccount 的权限,
自动挑选「能满足 Pod 要求、且该 SA 有权使用」的**最严格**的 SCC
2. SCC 通过 RBAC 授权,动词是 use
3. 选中的 SCC 决定:能否以 root 运行、能否用 hostNetwork、允许哪些 Capability、
SELinux 上下文、可用的 UID 范围等
默认自带的 SCC:
restricted-v2 默认,最严格
nonroot-v2 允许指定非 root UID
hostnetwork-v2 允许 hostNetwork / hostPort
hostaccess 允许 hostNetwork 与 hostPort(旧版)
hostmount-anyuid 允许挂载宿主机目录
node-exporter 为 node-exporter 定制
anyuid 允许以镜像内指定 UID 运行(含 root)
privileged 完全特权,慎用
pipelines-scc Tekton 流水线使用
授权示例:
# 给某个 ServiceAccount 授权(推荐,粒度最小)
oc adm policy add-scc-to-user nonroot-v2 -z my-sa -n my-namespace
# 给一组用户授权(慎用)
oc adm policy add-scc-to-group anyuid system:serviceaccounts:my-namespace
# 查看当前生效的 SCC
oc get scc
oc describe scc restricted-v2
# OpenShift 原生用 Route
oc expose svc/my-service
oc get routes
oc get route my-route -o yaml
# Ingress 也支持,但内部会被转换成 Route
oc get ingress
restricted-v2 会强制使用命名空间分配的随机 UID,而不是镜像里声明的 UID。这是从上游 Kubernetes 迁过来的应用最容易直接失败的地方:镜像里写死 USER 101 的 nginx、USER 999 的 redis、PostgreSQL 的 USER 26 都会因权限不足启动失败。正确做法是改用支持任意 UID 的镜像(Red Hat UBI 系列天然支持,GID 0 可写),或退一步绑定 nonroot-v2,而不是图省事直接给 anyuid —— 那等于放弃了这一层隔离。securityContext 里写了 runAsUser: 65534,如果该 ServiceAccount 只能使用 restricted-v2,Pod 会被直接拒绝。报错信息通常是 unable to validate against any security context constraint,看到这句就去查 SCC。restricted-v2 要求显式声明 runAsNonRoot: true 与 seccompProfile,并丢弃所有 Capability(只回加 NET_BIND_SERVICE)。从上游搬过来的清单默认不带这些字段,需要补齐。yum install,所有节点级改动都要通过 MachineConfig Operator 下发,MachineConfig 变更会触发滚动重启节点。改一次内核参数可能要等几十分钟,规划时要留出窗口。oc debug node/<node-name>,进去后默认落在容器里,需要 chroot /host 才拿到宿主机根文件系统。nginx.ingress.kubernetes.io/...)在 OpenShift 的默认 Ingress Controller(HAProxy)上无效,对应能力要用 route.openshift.io/... 的注解或 Route 的字段表达。迁移过来的 Helm chart 常在这里静默失效——不报错,但配置没生效。DeploymentConfig 已废弃,官方建议改用 Deployment。新项目不要再写 DeploymentConfig,它缺少 Deployment 的许多特性且不再演进。:latest 会触发一次标签解析,imagePullPolicy 的默认行为与直接引用镜像不同,排查「为什么没拉到最新镜像」时先确认这一点。oc adm upgrade 会给出推荐路径,不要用 --force 绕过。oc get clusteroperators 显示 Degraded=True 都意味着集群处于非正常状态,升级前必须先修好;oc adm must-gather 是收集诊断信息给 Red Hat 支持的标准动作。kubectl — Kubernetes集群管理工具(OpenShift 完全兼容)kubeadm — Kubernetes集群安装工具helm — 在 OpenShift 上同样可用argocd — OpenShift 上常用的 GitOps 工具tekton — OpenShift Pipelines 的上游项目