K8s、Docker实战

94 阅读3分钟

假设要在 Kubernetes 上部署两个 Docker 镜像 co:v1nn:v1,你需要为每个服务分别创建 Deployment(用于管理 Pod)和 Service(用于访问服务)。下面是一个完整、清晰、可直接使用的部署流程(含 YAML 示例)。


✅ 一、前提条件

  • Kubernetes 集群已就绪(kubectl get nodes 能看到节点)

  • 两个镜像 co:v1nn:v1 已推送到 镜像仓库(如 Docker Hub、私有 Harbor 等)

    • 如果是本地镜像(如 Minikube),需确保镜像已加载到节点
  • 假设两个服务都监听 80 端口(如果不是,请替换为实际端口)

📌 如果镜像在私有仓库,还需创建 imagePullSecrets(本文末尾附说明)


✅ 二、部署步骤(每个服务一套 YAML)

我们将为每个服务创建:

  1. Deployment:运行 Pod
  2. Service:暴露服务(使用 NodePort 便于外部访问)

📁 1. 部署 co:v1 服务

文件:co-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: co-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: co
  template:
    metadata:
      labels:
        app: co
    spec:
      containers:
      - name: co-container
        image: co:v1          # ← 替换为你的完整镜像地址,如 registry/co:v1
        ports:
        - containerPort: 80   # ← 替换为实际端口
---
apiVersion: v1
kind: Service
metadata:
  name: co-service
spec:
  type: NodePort
  selector:
    app: co
  ports:
    - protocol: TCP
      port: 80        # Service 端口
      targetPort: 80  # Pod 端口
      nodePort: 30001 # 可选,范围 30000-32767

📁 2. 部署 nn:v1 服务

文件:nn-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nn-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nn
  template:
    metadata:
      labels:
        app: nn
    spec:
      containers:
      - name: nn-container
        image: nn:v1          # ← 替换为你的完整镜像地址
        ports:
        - containerPort: 80   # ← 替换为实际端口
---
apiVersion: v1
kind: Service
metadata:
  name: nn-service
spec:
  type: NodePort
  selector:
    app: nn
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30002       # 注意:不能和 co 的 nodePort 冲突!

✅ 三、应用配置

# 部署 co 服务
kubectl apply -f co-deployment.yaml

# 部署 nn 服务
kubectl apply -f nn-deployment.yaml

✅ 四、验证部署

# 查看 Pods
kubectl get pods -l app=co
kubectl get pods -l app=nn

# 查看 Services
kubectl get svc co-service
kubectl get svc nn-service

输出示例:

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
co-service      NodePort   10.96.123.45    <none>        80:30001/TCP   10s
nn-service      NodePort   10.96.234.56    <none>        80:30002/TCP   10s

✅ 五、访问服务

假设你的 Kubernetes 节点 IP 是 192.168.1.100

  • 访问 co 服务:http://192.168.1.100:30001
  • 访问 nn 服务:http://192.168.1.100:30002

💡 如果是云环境(如 AWS、阿里云),用节点的公网 IP;如果是本地(Minikube),用 minikube ip


✅ 六、进阶建议

1. 使用完整镜像地址(推荐)

如果镜像在 Docker Hub:

image: yourname/co:v1

如果在私有仓库:

image: harbor.example.com/project/co:v1

2. 私有镜像仓库?需要 imagePullSecrets

spec:
  containers:
  - name: co-container
    image: your-private-registry/co:v1
  imagePullSecrets:
  - name: regcred   # 需提前创建

创建 secret:

kubectl create secret docker-registry regcred \
  --docker-server=your-registry.com \
  --docker-username=xxx \
  --docker-password=xxx

3. 端口不是 80?修改 containerPort 和 targetPort

例如服务监听 8080:

ports:
- containerPort: 8080
...
targetPort: 8080

4. 需要服务间通信?

nn 的 Pod 中可通过 DNS 访问 co

curl http://co-service:80   # 同命名空间
curl http://co-service.default.svc.cluster.local:80  # 完整域名

✅ 七、清理资源

kubectl delete -f co-deployment.yaml
kubectl delete -f nn-deployment.yaml

🎯 总结

步骤操作
1为每个镜像写一个 Deployment + Service
2确保 selector.matchLabelstemplate.metadata.labels 一致
3使用不同 nodePort 避免冲突
4应用 YAML,验证 Pod 和 Service
5通过 <NodeIP>:<NodePort> 访问服务

按照这个流程,你就可以在 Kubernetes 上成功部署并访问两个服务!🎉