发布服务
2026/7/23大约 2 分钟
一、 服务暴露(以 Nginx 为例)
在 Kubernetes 中,Pod 的 IP 是动态的,必须通过 Service 资源将服务暴露给外部访问。
1. 快速命令行发布 (Imperative)
如果你已经有一个正在运行的 Deployment(例如 nginx-deploy),可以使用 expose 命令快速创建 Service。
# 对应图片中的操作
kubectl expose deployment nginx-deploy --port=80 --target-port=80 --type=NodePort --name=nginx-service
- --port: Service 暴露的端口。
- --target-port: Pod 容器内部监听的端口。
- --type=NodePort: 关键参数。它会在所有节点上开启一个 30000+ 的随机端口,使外部浏览器可以访问。
2. YAML 文件发布 (Declarative)
通过编写配置文件可以更精准地控制端口(例如固定为 30080)。
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"nginx-service","namespace":"default"},"spec":{"ports":[{"nodePort":30080,"port":80,"protocol":"TCP","targetPort":80}],"selector":{"app":"nginx-deploy"},"type":"NodePort"}}
creationTimestamp: "2026-02-05T09:07:58Z"
name: nginx-service
namespace: default
resourceVersion: "38538"
uid: 4ce9be55-91e3-459c-b7d8-daa03798377a
spec:
clusterIP: 10.100.182.150
clusterIPs:
- 10.100.182.150
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- nodePort: 30080 # 手动指定外部访问端口
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-deploy # 必须与 Deployment 的 Labels 匹配
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
二、 Kubernetes Dashboard 部署与避坑
Dashboard 是官方的图形化管理界面,部署时需要处理网络和权限问题。
1. 部署步骤
- 下载并修改配置:从官方获取
recommended.yaml,并手动将kubernetes-dashboard的Service类型从ClusterIP改为NodePort(例如指定nodePort: 30443)。 - 应用配置:
kubectl apply -f recommended.yaml。 - 创建管理员账号:
# 创建账号并绑定集群管理员权限 (cluster-admin)
kubectl create serviceaccount admin-user -n kubernetes-dashboard
kubectl create clusterrolebinding admin-user-binding --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
2. 关键排错:协议问题
- 现象:浏览器报错
Client sent an HTTP request to an HTTPS server。 - 原因:Dashboard 强制使用加密协议。如果你在地址栏输入
http://就会触发此错误。 - 对策:必须手动输入
**https://<IP>:30443**。
3. 浏览器拦截提示(Chrome/Edge 特有)
由于使用自签证书,浏览器会拦截。如果找不到“继续访问”按钮,可以在页面空白处盲敲键盘输入:thisisunsafe。
三、 核心概念总结
| 概念 | 说明 | 你的应用场景 |
|---|---|---|
| ClusterIP | 默认类型,仅限集群内部互相调用。 | Nginx 访问内部数据库。 |
| NodePort | 在所有节点开启物理端口,打通内外网。 | 浏览器访问 Dashboard 或 Nginx。 |
| Metrics Server | 资源监控组件。 | Dashboard 里的 CPU/内存波浪图数据源。 |
| Token | 登录凭证。 | 进入 Dashboard 的“钥匙”,通过 kubectl create token<br>获取。 |
