介绍
我最近得到了一个简单的网络应用程序,它可以在带有 MicroK8S 的三节点 Ubuntu 服务器上运行。我决定尝试重建我的集群并使用 YAML 清单重新安装所有内容,以确保该过程可复制。但是,现在无法从集群外部访问该应用程序。我正在寻找调试技术来深入了解为什么 NodePort 显然没有在所有节点上创建 TCP 侦听器。
这是我的节点:
姓名 | 知识产权 | 颜色 | 角色 |
---|---|---|---|
排列 | 192.168.50.251 | 黄色的 | 领导者 |
尼卡 | 192.168.50.74 | 蓝色的 | 工人 |
山崎 | 192.168.50.135 | 绿色的 | 工人 |
集群再次选择在第三个节点 Yamazaki 上运行工作负载。我希望任何访问 Arran 或 Nikka 的网络流量都会在内部重新路由到 Yamazaki 以得到服务,就像以前发生的那样。
我做了什么
从以前工作的集群/应用程序,这是我重置所有内容的方法:
microk8s leave
在所有follower节点上做对每个跟随者节点的领导者执行
microk8s kubectl delete node <nodename>
(他们离开时不会自动删除)microk8s reset
在所有节点上执行启用插件(dns、ingress)。我不知道是否有必要
microk8s add-node
为每个跟随者在领导者上创建加入命令microk8s join <ip>/<token>
对每个关注者运行一个新的加入命令在任何节点上运行
microk8s status
以确保集群处于 HA 模式使用
microk8s images import workload.tar
通过启动应用程序
microk8s kubectl apply -f k8s-manifests/production/pod.yaml -f k8s-manifests/production/nodeport.yaml
这是吊舱:
apiVersion: v1 kind: Pod metadata: name: k8s-workload annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"k8s-workload","namespace":"default"},"spec":{"containers":[{"image":"k8s-workload","imagePullPolicy":"Never","name":"k8s-workload","ports":[{"containerPort":9090,"protocol":"TCP"}]}]}} spec: containers: - image: k8s-workload imagePullPolicy: Never name: k8s-workload ports: - containerPort: 9090 protocol: TCP
这是节点端口:
apiVersion: v1 kind: Service metadata: name: np-service spec: type: NodePort ports: - port: 9090 targetPort: 9090 nodePort: 30090 selector: run: k8s-workload # This should not be needed, but it didn't help # this time anyway externalIPs: [192.168.50.251]
检查应用程序是否正在通过内部容器调用运行,
microk8s kubectl exec -ti k8s-workload -- curl http://localhost:9090
这很好检查应用程序是否通过任何节点上的端口转发器运行,
microk8s kubectl port-forward pod/k8s-workload 9090 --address='0.0.0.0'
这很好节点不在外部侦听(
curl http://localhost:30090
连接被拒绝,与来自 LAN 上非集群计算机的任何节点 IP 地址相同)
系统状态
这是运行的内容microk8s kubectl get all -o wide
:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/k8s-workload 1/1 Running 0 20h 10.1.134.193 yamazaki <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 35d <none>
service/np-service NodePort 10.152.183.175 192.168.50.251 9090:30090/TCP 3d21h run=k8s-workload
我不知道service/kubernetes
是什么,我认为它只是标准 K8S 基础设施的一部分。
观察
我认为这篇文章是在说我的网络应用程序需要成为一项服务,但我只有一个 pod。我认为当它以前工作时,我只有一个 pod,但集群变得有点混乱,所以应用程序的服务版本可能与 pod 版本同时运行。
这篇文章还建议我应该使用入口系统。但是,考虑到 NodePort 是我目前的学习重点,我还不想放弃它。入口可以稍后出现。
我想我可以确定没有防火墙问题,因为即使在集群节点上的控制台会话中,任何与端口 30090 的连接都会被拒绝。
我想运行类似 的命令microk8s kubectl logs service np-service
来查看 NodePort 在做什么,但 logs 子命令仅适用于 pod。
接下来我可以尝试什么?