我在Raspberry Pi上建立了一个小型Kubernetes集群,该集群目前由1个Master和1个Worker组成。我创建了NGINX的简单部署,并为此创建了NodePort服务。我的YAML如下所示:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
type: NodePort
ports:
- nodePort: 30333
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
PODS已启动并且正在运行,服务也已启动
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-5d66cc795f-bgqdp 1/1 Running 0 65m
nginx-5d66cc795f-mb8qw 1/1 Running 0 65m
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
nginx-service NodePort 10.104.133.199 <none> 80:30333/TCP 66m
但是我无法从主节点访问NGINX。
curl http://192.168.178.101:30333
curl: (7) Failed to connect to 192.168.178.101 port 30333: Connection timed out
如果我在Worker节点上尝试正常,NGINX会响应。 从工作节点可以使用IP地址:30333或主机名:30333,尽管localhost:30333不起作用!
从我的主人到工人的联系似乎很好。我可以在IP地址或主机名上ping通SSH,等等。
有什么想法我做错了吗?
get节点的输出-o宽:
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8-master Ready master 13d v1.17.4 192.168.178.100 <none> Raspbian GNU/Linux 10 (buster) 4.19.97-v7+ docker://19.3.8
k8-w1 Ready worker 13d v1.17.4 192.168.178.101 <none> Raspbian GNU/Linux 10 (buster) 4.19.97-v7+ docker://19.3.8
describe服务的输出:
$ kubectl describe service nginx-service
Name: nginx-service
Namespace: default
Labels: app=nginx
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-service","namespace":"default"},"s...
Selector: app=nginx
Type: NodePort
IP: 10.104.133.199
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30333/TCP
Endpoints: 10.44.0.1:80,10.44.0.2:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
更新: 我在NodePort 30333上尝试了一个简单的Telnet命令到Worker。但是出现连接超时错误。
然后,我删除了NodePort服务,并尝试了一个简单的端口转发命令
kubectl port-forward pod/nginx-545b8fdd47-brg7r 8080:80
这正常,我可以通过此端口从Master-> Worker连接。
但是NodePort服务仍然无法正常工作!
答案 0 :(得分:2)
因此,经过许多小时和几天的努力,我认为我已经找到了问题的根源。
我找到了这个博客: https://limpygnome.com/2019/09/21/raspberry-pi-kubernetes-cluster/
是哪个导致我出现此错误报告的: https://github.com/kubernetes-sigs/kubespray/issues/4674
因此执行以下操作将允许连接:
sudo iptables -P FORWARD ACCEPT
但是我想重启后(即使使用iptables-persistent)也无法坚持下去,我假设规则是由Docker / K8s在启动过程中和更改后动态更新的。
这使我进行了进一步调查,并在Weave网络文档中找到了有关使用iptables v 1.8及更高版本的主机的K8s网络问题的信息。 (尽管其中一些问题可能已经解决,但这似乎也适用于其他K8s网络提供商)。 然后,我在Weave日志文件中看到它确实拒绝了请求。
因此,通过在我的节点上执行以下操作,我可以使它永久运行。
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
我现在可以通过NodePort在所有节点之间进行访问,并且可以从群集外部访问所有节点。