为了确保你可以通过 curl http://192.168.9.182:30080curl http://192.168.9.183:30080 访问 Tomcat 服务,即使 Pod 只运行在 k8s-master01 上,你需要确保以下几点:

  1. Service 配置正确:NodePort 类型的 Service 配置正确,并在所有节点上暴露服务端口。
  2. kube-proxy 正常工作:kube-proxy 在所有节点上正常工作,确保请求可以从任意节点转发到运行 Pod 的节点。
  3. 防火墙和网络配置:所有节点的防火墙和网络配置允许访问 NodePort 端口。

1. Pod 配置 (tomcat.yaml)

确保 Pod 被调度到 k8s-master01

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
    env: dev
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-master01
  containers:
  - name: tomcat-pod-java
    ports:
    - containerPort: 8080
    image: tomcat:8.5-jre8-alpine
    imagePullPolicy: IfNotPresent

2. Service 配置 (tomcat-svc.yaml)

确保创建一个 NodePort 类型的 Service:

apiVersion: v1
kind: Service
metadata:
  name: tomcat
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 8080
    nodePort: 30080
  selector:
    app: myapp
    env: dev

3. 应用配置并查看状态

应用配置文件:

kubectl apply -f tomcat.yaml
kubectl apply -f tomcat-svc.yaml

查看 Pod 和 Service 的状态:

kubectl get pods -o wide
kubectl get svc

4. 确保 kube-proxy 正常运行

检查 kube-proxy 在所有节点上是否正常运行:

kubectl get daemonset -n kube-system kube-proxy -o wide
kubectl logs -n kube-system daemonset/kube-proxy

5. 验证访问

通过以下命令验证是否可以通过所有节点访问 Tomcat 服务:

curl http://192.168.9.181:30080
curl http://192.168.9.182:30080
curl http://192.168.9.183:30080

验证 Service 和 Endpoints

检查 Service 和 Endpoints 配置是否正确:

kubectl get svc tomcat -o yaml
kubectl get endpoints tomcat -o yaml

确认防火墙和网络配置

确保所有节点的防火墙允许 30080 端口的流量:

# 查看防火墙状态
sudo firewall-cmd --list-all

# 允许 30080 端口的流量
sudo firewall-cmd --permanent --add-port=30080/tcp
sudo firewall-cmd --reload

通过这些步骤,确保所有节点都能够通过 NodePort 访问 Tomcat 服务。即使 Pod 只运行在 k8s-master01 节点上,NodePort 服务会在所有节点上暴露,并通过 kube-proxy 将请求转发到正确的节点。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐