前面我们已经完成了 Harbor(私有镜像仓库)的部署,并验证 Docker 可以正常 push(推送)和 pull(拉取)镜像。接下来进入更实用的一步:把一个真实 Web 应用打包成镜像,推送到 Harbor,再由 Kubernetes(K8s)拉取并运行。
一、实验目标
本阶段要完成的目标:
1. 创建一个自定义 Web 页面
2. 使用 Dockerfile(镜像构建文件)构建镜像
3. 将镜像推送到 Harbor(私有镜像仓库)
4. 使用 Kubernetes Deployment(部署)运行镜像
5. 使用 Service(服务)通过 NodePort(节点端口)暴露访问
最终访问地址:
http://172.16.11.142:30081
二、创建 Web 应用目录
mkdir -p ~/harbor-demo-web
cd ~/harbor-demo-web
三、创建首页文件
cat > index.html <<'EOF'
Harbor + Kubernetes + ChatGPT 部署成功!
这是 Kgale 和 ChatGPT 一起完成的真实应用镜像迁移实验。
这个页面来自 Harbor 私有镜像仓库。
镜像地址:172.16.11.142/library/kgale-web:v1
EOF
这个页面就是最终要运行在 Kubernetes(K8s)里的 Web 应用页面。
四、创建 Dockerfile
cat > Dockerfile <<'EOF'
FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.html
EOF
这份 Dockerfile(镜像构建文件)的作用是:
1. 使用 nginx:latest 作为基础镜像
2. 把自定义 index.html 放到 Nginx 默认网页目录
3. 生成一个自定义 Web 镜像
五、构建 Docker 镜像
sudo docker build -t kgale-web:v1 .
查看本地镜像:
sudo docker images | grep kgale-web
六、给镜像打 Harbor 标签
sudo docker tag kgale-web:v1 172.16.11.142/library/kgale-web:v1
镜像地址含义:
172.16.11.142 Harbor 私有镜像仓库地址
library Harbor 项目名
kgale-web 镜像名称
v1 镜像版本标签
完整镜像地址:
172.16.11.142/library/kgale-web:v1
七、推送镜像到 Harbor
sudo docker push 172.16.11.142/library/kgale-web:v1
推送成功后,进入 Harbor Web 面板查看:
项目 → library → 镜像仓库 → kgale-web
如果能看到 kgale-web:v1,说明镜像已经成功推送到 Harbor。
八、创建 Kubernetes 部署文件
cat > kgale-web.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kgale-web
spec:
replicas: 1
selector:
matchLabels:
app: kgale-web
template:
metadata:
labels:
app: kgale-web
spec:
nodeName: k8s-master # 指定运行到 k8s-master 节点
tolerations:
- operator: "Exists" # 容忍所有 Taint(污点),实验环境使用
containers:
- name: kgale-web # Container(容器)名称
image: 172.16.11.142/library/kgale-web:v1 # Harbor 私有仓库镜像
ports:
- containerPort: 80 # 容器内部端口
---
apiVersion: v1
kind: Service
metadata:
name: kgale-web-svc
spec:
type: NodePort # 使用 NodePort(节点端口)暴露服务
selector:
app: kgale-web
ports:
- port: 80 # Service(服务)端口
targetPort: 80 # Pod(容器组)端口
nodePort: 30081 # 外部访问端口
EOF
这份 YAML(资源配置文件)包含两个资源:
Deployment(部署):负责运行 Web 应用 Pod(容器组)
Service(服务):负责把 Web 应用暴露给外部访问
九、部署到 Kubernetes
kubectl apply -f kgale-web.yaml
成功输出:
deployment.apps/kgale-web created
service/kgale-web-svc created
十、查看运行状态
查看 Pod(容器组):
kubectl get pods -o wide
成功运行后,可以看到类似输出:
NAME READY STATUS RESTARTS AGE IP NODE
kgale-web-fb7b97c5-lxcqx 1/1 Running 0 3s 10.244.235.213 k8s-master
重点看:
1/1 Running Pod(容器组)运行成功
k8s-master 运行在 k8s-master 节点
查看 Service(服务):
kubectl get svc kgale-web-svc
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kgale-web-svc NodePort 10.105.118.115
这里的重点是:
80:30081/TCP
意思是:
Service(服务)内部端口是 80
外部访问端口是 30081
十一、浏览器访问测试
浏览器访问:
http://172.16.11.142:30081
如果页面正常打开,并看到:
Harbor + Kubernetes + ChatGPT 部署成功!
说明真实应用已经成功从 Harbor(私有镜像仓库)迁移到 Kubernetes(K8s)运行。
十二、实验结果
本阶段完成了:
1. 自定义 Web 应用创建成功
2. Docker Image(镜像)构建成功
3. 镜像推送到 Harbor 成功
4. Kubernetes Deployment(部署)创建成功
5. Pod(容器组)成功运行
6. Service(服务)通过 NodePort(节点端口)暴露成功
7. 浏览器成功访问 Web 页面
最终访问地址:
http://172.16.11.142:30081
最终镜像地址:
172.16.11.142/library/kgale-web:v1
十三、实验总结
这次实验完成了一个真实应用从本地构建到 Harbor,再由 Kubernetes 运行的完整流程。
完整链路如下:
自定义 Web 页面
↓
Dockerfile(镜像构建文件)
↓
Docker build(构建镜像)
↓
Docker push(推送镜像)
↓
Harbor(私有镜像仓库)
↓
Kubernetes Deployment(部署)
↓
Pod(容器组)Running(运行中)
↓
Service(服务)NodePort(节点端口)
↓
浏览器访问成功
这说明 Harbor 已经不只是能存放测试镜像,而是可以真正作为 Kubernetes 集群的私有镜像仓库使用。