---
id: kubernetes-openshift
title: "OpenShift"
shortTitle: "OpenShift"
track: kubernetes
trackTitle: "Kubernetes"
order: 11
level: important
status: published
estimatedMinutes: 30
prerequisites:
  - kubernetes-managed
next: kubernetes-swarm
reviewedAgainst: 2026-10-12
sources:
  - title: "OpenShift Container Platform overview"
    url: https://docs.openshift.com/container-platform/latest/architecture/architecture.html
  - title: "OpenShift CLI"
    url: https://docs.openshift.com/container-platform/latest/cli_reference/openshift_cli/getting-started-cli.html
---

# OpenShift

OpenShift là Kubernetes kèm thêm thành phần của Red Hat. `kubectl` vẫn nói được với API. `oc` là CLI của họ, thêm việc đăng nhập và một số object riêng. Route là cách OpenShift đưa HTTP vào cluster. Nó không phải tên khác của Ingress trên mọi bản.

## Để làm gì

Đọc một Route, biết `oc` và `kubectl` cùng trỏ một cluster, và không tắt Security Context Constraint cho xong.

## Gồm những gì

- `oc login`, project tương ứng namespace.
- Route và host.
- Security Context Constraint ở mức biết vì sao container root bị chặn.

Không gồm cài cluster OpenShift.

## Dùng khi nào

Nơi làm việc đưa một cluster OpenShift. Chart Kubernetes thuần thường chạy được sau khi sửa securityContext. Đừng giả định chart trên Docker Desktop chạy nguyên si.

Không có cluster thì không đăng ký bản dùng thử chỉ cho bài này.

## Kiến thức cốt lõi

`oc login` lấy token và ghi kubeconfig. `oc project demo` chuyển namespace, cùng ý `kubectl config set-context --current --namespace=demo`. `oc get pods` và `kubectl get pods` đọc cùng API.

Route là object `route.openshift.io`. Nó có host và trỏ tới một Service. Ingress Kubernetes vẫn có thể có nếu cluster đã bật controller. Đọc kind trong YAML trước khi sửa. Sửa Ingress trong khi traffic đang vào bằng Route thì bạn sửa nhầm cửa.

Security Context Constraint giới hạn user trong container, capability, và volume. Image chạy root bị từ chối khi SCC của namespace không cho. Sửa image để chạy user không phải root. Đừng gán SCC privileged cho namespace app vì một lần pull bị lỗi.

## Lệnh và code mẫu

Đọc một Route:

```yaml
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: lab
spec:
  host: lab.apps.example.com
  to:
    kind: Service
    name: lab-web
  port:
    targetPort: http
```

`targetPort` ở đây là tên port trên Pod, phải khớp Service. Không apply.

## Thực hành

1. Chỉ kind và Service đích.
2. Viết một câu: `oc get route` khác `kubectl get ingress`.
3. Không `oc login` vào cluster công ty từ bài học nếu bạn chưa có việc ở đó.

## Kết quả mong đợi

Kind là `Route`, Service `lab-web`. Hai lệnh đọc hai loại object.

## Checklist

- [ ] Nhìn kind trước khi sửa cửa HTTP.
- [ ] Container không chạy root nếu SCC mặc định chặn.
- [ ] Không cấp SCC privileged để chart lạ chịu chạy.

## Lỗi thường gặp

**Pod `CreateContainerConfigError` hoặc bị SCC từ chối, rồi người ta sửa cluster.** Log nói user không được phép. Đổi `runAsUser` trong Deployment cho khớp, hoặc xin SCC đúng cho service account đó.

**Dùng `kubectl delete ns` trên namespace hệ thống của OpenShift.** Các namespace `openshift-` là của nền. Xóa là làm hỏng control plane. Chỉ xóa project app.

## Nguồn

1. [Architecture overview](https://docs.openshift.com/container-platform/latest/architecture/architecture.html) — Kubernetes và thành phần thêm.
2. [Getting started with the OpenShift CLI](https://docs.openshift.com/container-platform/latest/cli_reference/openshift_cli/getting-started-cli.html) — `oc login` và project.

## Tiếp theo

[Docker Swarm](./08-swarm.md)
