oc 是 OpenShift 的命令行客户端,基于 Kubernetes 的 kubectl 构建,并扩展了许多 OpenShift 特有的功能(如构建、部署配置、路由、镜像流等)。无论你是开发人员还是集群管理员,oc 都是与 OpenShift 交互的核心工具
1. 安装 oc 客户端
1.1 从红帽官网下载
访问 OpenShift 下载页面,选择对应操作系统的客户端:
Linux:openshift-client-linux.tar.gz
macOS:openshift-client-mac.tar.gz
Windows:openshift-client-windows.zip
解压后,将 oc 二进制文件放到 PATH 环境变量包含的目录中(如 /usr/local/bin)。
1.2 使用包管理器(Linux/macOS)
macOS Homebrew:
bash
brew install openshift-cli
Linux (RHEL/CentOS):
bash
sudo yum install openshift-clients
1.3 验证安装
java
oc version
输出示例:
markup
Client Version: 4.14.0-202403150918
Kubernetes Version: v1.27.6
2. 登录集群
2.1 使用 kubeadmin 登录(集群安装后)
bash
oc login -u kubeadmin -p <password> https://api.ocp4.example.com:6443
密码可在安装目录的 auth/kubeadmin-password 文件中找到。
2.2 使用 OAuth 用户登录
通过浏览器登录 OpenShift Web 控制台后,可在右上角用户菜单中点击 "Copy Login Command",获得一个带有令牌的 oc login 命令,直接粘贴执行即可。
2.3 检查当前上下文
bash
oc whoami # 显示当前用户
oc whoami --show-server # 显示当前集群 API 地址
oc config view # 查看 kubeconfig 配置
3. 基础概念与常用命令
OpenShift 资源类型与 Kubernetes 基本一致,但多了 BuildConfig、DeploymentConfig、Route、ImageStream 等专有资源。oc 命令格式一般为:
bash
oc <动作> <资源类型> <资源名称> [选项]
3.1 命名空间/项目
OpenShift 中用 项目 (Project) 表示 Kubernetes 的命名空间,但增加了额外的注解。
bash
# 查看所有项目
oc get projects
# 切换到指定项目
oc project my-project
# 创建项目
oc new-project my-project --display-name="My Project" --description="Test project"
# 查看当前项目
oc project
3.2 查看资源
bash
# 查看所有 Pod
oc get pods
# 查看所有 Deployment
oc get deploy
# 查看所有 Service
oc get svc
# 查看所有 Route(OpenShift 的 Ingress 替代)
oc get route
# 查看所有资源(包括自定义资源)
oc get all
# 查看特定 Pod 的详细信息
oc describe pod <pod-name>
# 以 YAML 格式输出资源
oc get pod <pod-name> -o yaml
3.3 创建资源
bash
# 通过 YAML 文件创建
oc apply -f my-resource.yaml
# 直接运行一个 Pod(快速测试)
oc run test-pod --image=nginx --restart=Never
# 暴露一个 Deployment 创建 Service
oc expose deployment my-app --port=8080
3.4 删除资源
bash
oc delete pod <pod-name>
oc delete deployment <deploy-name>
# 根据标签删除
oc delete pods -l app=myapp
3.5 编辑资源
bash
oc edit deployment my-app
会打开默认编辑器,保存后自动更新。
4. 应用部署与管理
OpenShift 提供了强大的构建和部署功能,oc 对此有专门的支持。
4.1 从源代码部署(S2I)
bash
# 使用 Java S2I 构建器从 Git 仓库部署应用
oc new-app registry.access.redhat.com/ubi8/openjdk-11~https://github.com/your/repo.git --name=my-java-app
此命令会自动:
创建 BuildConfig 和 ImageStream
触发构建,生成镜像
创建 DeploymentConfig 和 Service
4.2 查看构建和部署状态
bash
# 查看构建
oc get builds
oc logs build/<build-name>
# 查看部署
oc get deploymentconfigs
oc rollout status dc/my-java-app
# 触发新的部署(修改镜像或配置后)
oc rollout latest dc/my-java-app
4.3 暴露服务供外部访问
bash
# 为 Service 创建 Route
oc expose service my-java-app --hostname=myapp.apps.ocp4.example.com
# 如果不指定 hostname,会自动生成域名(*.apps 通配符)
oc expose service my-java-app
# 查看 Route 地址
oc get route
4.4 扩缩容
bash
# 手动扩缩 Deployment
oc scale deployment my-java-app --replicas=5
# 扩缩 DeploymentConfig
oc scale dc my-java-app --replicas=5
4.5 更新镜像
bash
# 直接修改 Deployment 的镜像
oc set image deployment/my-java-app my-java-app=myregistry/myimage:latest
# 对于 DeploymentConfig,使用 `oc tag` 触发新构建
oc tag my-image-stream:latest my-java-app:latest
5. 配置与存储
5.1 ConfigMap 管理
bash
# 从字面值创建
oc create configmap app-config --from-literal=key1=value1 --from-literal=key2=value2
# 从文件创建
oc create configmap app-properties --from-file=application.properties
# 查看 ConfigMap
oc get configmap app-config -o yaml
# 在 Pod 中挂载 ConfigMap(通过修改 Deployment 添加卷)
oc set volumes deployment/my-app --add --name=config --mount-path=/config --configmap-name=app-config
5.2 Secret 管理
bash
# 创建通用 Secret
oc create secret generic db-secret --from-literal=password=mypassword
# 创建镜像拉取 Secret
oc create secret docker-registry myregistrykey --docker-server=myregistry.com --docker-username=user --docker-password=pass
# 在 ServiceAccount 中使用镜像拉取 Secret
oc patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
5.3 PersistentVolumeClaim
bash
# 创建 PVC
cat <<EOF | oc apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
EOF
# 在 Pod 中挂载 PVC
oc set volumes deployment/my-app --add --name=data --mount-path=/data --claim-name=my-pvc
6. 日志与调试
6.1 查看容器日志
bash
# 查看 Pod 日志
oc logs my-pod
# 持续跟踪日志
oc logs -f my-pod
# 查看特定容器的日志(多容器 Pod)
oc logs my-pod -c my-container
# 查看前一个实例的日志(容器重启后)
oc logs --previous my-pod
6.2 进入容器执行命令
bash
# 启动交互式 Shell
oc exec -it my-pod -- /bin/bash
# 执行单条命令
oc exec my-pod -- ls -l
6.3 端口转发
将本地端口转发到 Pod 的端口,便于调试:
bash
oc port-forward pod/my-pod 8080:80
访问 http://localhost:8080 即可连接到 Pod 的 80 端口。
6.4 复制文件到/从 Pod
bash
# 从本地复制到 Pod
oc cp /local/file my-pod:/remote/path
# 从 Pod 复制到本地
oc cp my-pod:/remote/file /local/path
7. 高级功能
7.1 使用模板 (Template)
OpenShift 模板允许你将多个资源定义打包,通过参数化快速部署。
bash
# 从模板实例化应用
oc new-app --template=postgresql-persistent --param DATABASE_SERVICE_NAME=mydb --param POSTGRESQL_USER=user
# 查看可用模板
oc get templates -n openshift
7.2 镜像流 (ImageStream)
镜像流是 OpenShift 特有的抽象,用于跟踪镜像更新。
bash
# 创建镜像流
oc create imagestream myapp
# 标记外部镜像到镜像流
oc tag docker.io/library/nginx:latest myapp:latest
# 查看镜像流标签
oc describe is myapp
7.3 角色与权限管理
bash
# 给用户添加查看权限
oc policy add-role-to-user view myuser -n myproject
# 给 ServiceAccount 添加权限
oc policy add-role-to-user edit system:serviceaccount:myproject:default
# 查看当前用户的权限
oc policy can-i create pods
7.4 监控与指标
bash
# 查看节点资源使用情况
oc adm top nodes
# 查看 Pod 资源使用
oc adm top pods
# 需要先部署 Metrics Server 或 Heapster
8. 常用快捷命令与技巧
| 目的 | 命令 |
|---|---|
| 查看所有资源(包含路由) | oc get all |
| 持续观察资源变化 | oc get pods -w |
| 根据标签筛选 | oc get pods -l app=myapp |
| 显示 Pod 的 IP 和节点 | oc get pods -o wide |
| 输出 YAML 并编辑 | oc get pod mypod -o yaml |
| 导出资源到文件 | oc get pod mypod -o yaml |
| 删除所有失败 | Pod oc delete pods --field-selector status.phase=Failed |
| 查看 API 资源列表 | oc api-resources |
| 查看某个资源的字段说明 | oc explain pod.spec.containers |
9. oc 与 kubectl 的关系
oc 是 kubectl 的超集,所有 kubectl 命令都可以用 oc 执行(oc get pods 等同于 kubectl get pods)。
oc 增加了 OpenShift 特有资源(如 BuildConfig、DeploymentConfig、Route、ImageStream)的支持。
oc 提供了更简洁的应用部署命令(如 oc new-app),适合开发人员快速上手。
在纯 Kubernetes 环境中,oc 依然可用,但部分 OpenShift 特有命令会报错。
如果你习惯 kubectl,可以继续使用,但建议在 OpenShift 环境中使用 oc 以获得完整体验。
10. 实战演练:部署一个 Java 应用
结合之前的私有云场景,用 oc 部署一个 Spring Boot 应用:
bash
# 1. 登录集群
oc login -u kubeadmin -p <pass> https://api.ocp4.example.com:6443
# 2. 创建项目
oc new-project my-java-demo
# 3. 使用 S2I 从 Git 仓库部署
oc new-app registry.access.redhat.com/ubi8/openjdk-11~https://github.com/your/spring-boot-app.git --name=spring-app
# 4. 查看构建日志
oc logs -f bc/spring-app
# 5. 暴露服务
oc expose service spring-app
# 6. 获取访问地址
oc get route spring-app
# 7. 测试
curl http://spring-app-my-java-demo.apps.ocp4.example.com/hello
# 8. 扩缩容
oc scale deployment/spring-app --replicas=3
# 9. 查看 Pod 状态
oc get pods -w
# 10. 清理
oc delete project my-java-demo
11. 进一步学习
内置帮助:oc help、oc --help
OpenShift 官方文档:CLI 工具
红帽开发者教程: OpenShift 互动学习