1. OpenShift là gì?
OpenShift là nền tảng PaaS / Kubernetes (nâng cao từ Kubernetes) của Red Hat, hỗ trợ triển khai, quản lý container, scaling, route, bảo mật, quản lý mạng nội bộ v.v. Trong OpenShift, các thành phần chính bao gồm:
- Project / Namespace: vùng chứa tài nguyên (pods, services, route).
- Pod / Deployment: chạy container ứng dụng.
- Service: để kết nối các pods, load balancing nội bộ.
- Route: để expose service ra bên ngoài (tạo hostname).
- Persistent Volume / Persistent Volume Claim (PV / PVC): lưu trữ dữ liệu trạng thái (database, upload file).
Khi triển khai website như WordPress, chúng ta cần ít nhất: database + ứng dụng + route + lưu trữ (nếu có upload ảnh, file) + bảo mật.
2. Cách tạo Host trên OpenShift?

* Cách 1:
Bước 1:
Đăng nhập vào OpenShift Cluster và chạy lệnh sau:
Bước 2:
Đầu tiên, bạn tạo 1 project riêng để triển khai ứng dụng:
oc new-project wordpress-demo
Hoặc trên web console: vào giao diện OpenShift > Projects > Create Project. Project này sẽ cô lập tài nguyên của ứng dụng WordPress + DB.
Bước 3:
WordPress cần database để lưu nội dung. Ta triển khai DB trước, lưu mật khẩu, thiết lập service để ứng dụng kết nối.
Chạy lệnh sau:
oc create secret generic mysql-pass –from-literal=password=MyStrongPass123
Sau đó viết file YAML triển khai MySQL
Ví dụ mysql.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
– name: mysql
image: mysql:5.7
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
– name: MYSQL_DATABASE
value: wordpress
ports:
– containerPort: 3306
volumeMounts:
– name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
– name: mysql-persistent-storage
emptyDir: {}—
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
– port: 3306
selector:
app: mysql
Sau đó chạy lệnh:
oc apply -f mysql.yaml
Kiểm tra pods & service:
oc get pods
oc get svc
Lưu ý: ở môi trường sản xuất, bạn không dùng emptyDir vì nó mất dữ liệu khi pod khởi động lại. Cần dùng Persistent Volume Claim (PVC) để lưu trữ bền.
Bước 4: Deploy ứng dụng web (WordPress)
Ta viết YAML cho wordpress
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
– name: wordpress
image: wordpress:latest
env:
– name: WORDPRESS_DB_HOST
value: mysql
– name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
– containerPort: 80
volumeMounts:
– name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
– name: wordpress-persistent-storage
emptyDir: {}
Sau đó đưa vào cluster:
oc apply -f
wordpress.yaml
Kiểm tra:
oc get pods
oc get svc
Bước 5: Expose WordPress ra ngoài
Sau khi service WordPress được tạo, bạn expose nó bằng Route:
oc expose service wordpress
Lệnh này sẽ tự tạo route, gán hostname (ví dụ wordpress-wordpress-demo.apps.cluster-domain.com). Bạn có thể xem:
oc get route
Hoặc chi tiết:
oc get route wordpress -o yaml
Khi route được tạo, bạn truy cập qua hostname đó và tiến hành bước cài đặt WordPress (giao diện web) — nhập tên site, tài khoản admin, mật khẩu DB đã tạo, v.v.
Cách 2: Sử dụng File SSH
Chúng ta sẽ làm như sau:
Bước 1: Ta sẽ gõ lệnh nano deploy_full.sh
Bước 2: Dán đoạn code sau đây vào:
#!/bin/bash
# — CẤU HÌNH MÀU SẮC —
GREEN=’\033[0;32m’
RED=’\033[0;31m’
YELLOW=’\033[1;33m’
CYAN=’\033[0;36m’
NC=’\033[0m’echo -e “${CYAN}=================================================${NC}”
echo -e “${CYAN} AUTO DEPLOY & CREATE HOST ON OPENSHIFT (FULL) ${NC}”
echo -e “${CYAN}=================================================${NC}”# 1. KIỂM TRA MÔI TRƯỜNG
if ! command -v oc &> /dev/null; then
echo -e “${RED}[ERROR] Không tìm thấy lệnh ‘oc’. Hãy cài đặt OpenShift CLI.${NC}”
exit 1
fiif ! oc whoami &> /dev/null; then
echo -e “${RED}[ERROR] Chưa đăng nhập. Hãy chạy ‘oc login’ trước.${NC}”
exit 1
fi# 2. NHẬP THÔNG TIN (Có giá trị mặc định)
read -p “1. Tên Project (Namespace) [vd: demo-web]: ” PROJECT_NAME
PROJECT_NAME=${PROJECT_NAME:-demo-web}read -p “2. Tên Ứng dụng (App Name) [vd: my-site]: ” APP_NAME
APP_NAME=${APP_NAME:-my-site}read -p “3. Docker Image [vd: nginx:latest]: ” DOCKER_IMAGE
DOCKER_IMAGE=${DOCKER_IMAGE:-nginx:latest}read -p “4. Port ứng dụng [vd: 80]: ” APP_PORT
APP_PORT=${APP_PORT:-80}echo -e “${CYAN}————————————————-${NC}”
# 3. XỬ LÝ PROJECT
if oc get project “$PROJECT_NAME” &> /dev/null; then
echo -e “${GREEN}[INFO] Project ‘$PROJECT_NAME’ đã tồn tại. Đang chuyển vào…${NC}”
oc project “$PROJECT_NAME” > /dev/null
else
echo -e “${GREEN}[INFO] Đang tạo mới Project ‘$PROJECT_NAME’…${NC}”
if ! oc new-project “$PROJECT_NAME”; then
echo -e “${RED}[ERROR] Không thể tạo project. Kiểm tra lại quyền hạn.${NC}”
exit 1
fi
fi# 4. TỰ ĐỘNG CẤP QUYỀN ROOT (QUAN TRỌNG)
# Bước này cố gắng cấp quyền để chạy các image yêu cầu root (như nginx mặc định)
echo -e “${YELLOW}[ACTION] Đang thử cấp quyền Root (anyuid) cho service account…${NC}”
if oc adm policy add-scc-to-user anyuid -z default -n “$PROJECT_NAME” &> /dev/null; then
echo -e “${GREEN}[SUCCESS] Đã cấp quyền ‘anyuid’ thành công! Image có thể chạy dưới quyền Root.${NC}”
else
echo -e “${YELLOW}[WARNING] Không thể cấp quyền ‘anyuid’ (Bạn có thể không phải là Admin cluster).${NC}”
echo -e “${YELLOW} -> Nếu Pod bị lỗi ‘CreateContainerConfigError’, hãy dùng image non-root (vd: bitnami/nginx).${NC}”
fi# 5. DEPLOYMENT
if oc get dc “$APP_NAME” &> /dev/null || oc get deployment “$APP_NAME” &> /dev/null; then
echo -e “${RED}[ERROR] Ứng dụng ‘$APP_NAME’ đã tồn tại trong project này. Vui lòng chọn tên khác.${NC}”
exit 1
fiecho -e “${GREEN}[INFO] Đang deploy image: $DOCKER_IMAGE …${NC}”
oc new-app “$DOCKER_IMAGE” –name=”$APP_NAME” > /dev/null# 6. EXPOSE ROUTE (TẠO HOST)
echo -e “${GREEN}[INFO] Đang tạo Route (Public URL)…${NC}”
oc expose svc/”$APP_NAME” –port=”$APP_PORT” > /dev/null# 7. CHỜ POD SẴN SÀNG (HEALTH CHECK)
echo -e “${YELLOW}[WAITING] Đang chờ Pod khởi động (có thể mất 30s-60s)…${NC}”
echo -n “Loading”
TIMEOUT=0
while [ “$(oc get pods -l app=$APP_NAME -o jsonpath='{.items[0].status.phase}’)” != “Running” ]; do
echo -n “.”
sleep 2
((TIMEOUT++))
if [ $TIMEOUT -gt 60 ]; then # Timeout sau khoảng 2 phút
echo -e “\n${RED}[TIMEOUT] Pod khởi động quá lâu. Vui lòng kiểm tra log bằng lệnh: oc logs -f deployment/$APP_NAME${NC}”
break
fi
done
echo “”# 8. KẾT QUẢ
ROUTE_URL=$(oc get route “$APP_NAME” -o jsonpath='{.spec.host}’)if [ -z “$ROUTE_URL” ]; then
echo -e “${RED}[ERROR] Có lỗi xảy ra, không tìm thấy URL.${NC}”
else
echo -e “${CYAN}=================================================${NC}”
echo -e “${GREEN} DEPLOY THÀNH CÔNG! ${NC}”
echo -e “${CYAN}=================================================${NC}”
echo -e “Website của bạn đang chạy tại:”
echo -e “👉 http://$ROUTE_URL”
echo -e “${CYAN}=================================================${NC}”
fi
Bước 3: Tiếp tục Cấp quyền: chmod +x deploy_full.sh.
Chạy: ./deploy_full.sh.
OK vậy là đã xong – hãy cùng trải nghiệm thử.