集群设置:
- 操作系统:Ubuntu 18.04,带有 Kubernetes 推荐的安装设置
- 使用 Kubespray 引导集群
- CNI 是印花布
速览(当 redis 服务 ip 为 时10.233.90.37
):
- 主机:
psql 10.233.90.37:6379
=> 成功 主机:
psql 10.233.90.37:80
=> 成功Pod(在任何命名空间中)
psql 10.233.90.37:6379
=> 超时- Pod(在任何命名空间中)
psql redis:6379
=> 超时 - Pod(在任何命名空间中)
psql redis.namespace.svc.cluster.local
=> 超时 - Pod(在任何命名空间中)
psql redis:80
=> 成功 - Pod(在任何命名空间中)
psql redis.namespace.svc.cluster.local:80
=> 成功
Kubernetes 服务(NodePort、LoadBalancer、ClusterIP)不会为 pod 转发 80 和 443 以外的端口。Pod 端口可以不同,但如果 Service 端口不是 80 或 443,则对 Service 的请求会超时。
从主机到 Kubernetes 服务的请求在 80 和 443 以外的端口上工作。但是从 pod 到这些其他端口的请求失败。
从 pod 到端口 80 和 443 上的服务的请求确实有效。
user@host: curl 10.233.90.37:80
200 OK
user@host: curl 10.233.90.37:5432
200 OK
# ... exec into Pod
```bash
bash-4.4# curl 10.233.90.37:80
200 OK
bash-4.4# curl 10.233.90.37:5432
Error ... timeout ...
user@host: kubectl get NetworkPolicy -A
No resources found.
user@host: kubectl get PodSecurityPolicy -A
No resources found.
示例服务:
apiVersion: v1
kind: Service
metadata:
labels:
app: redis
name: redis
namespace: namespace
spec:
ports:
- port: 6379
protocol: TCP
targetPort: 6379
name: redis
- port: 80
protocol: TCP
targetPort: 6379
name: http
selector:
app: redis
type: NodePort # I've tried ClusterIP, NodePort, and LoadBalancer
这种疯狂的 Kubernetes 服务端口行为是怎么回事!?
调试后发现可能与 ufw 和 iptables config 有关。
ufw 设置(非常宽松):
Status: enabled
80 ALLOW Anywhere
443 ALLOW Anywhere
6443 ALLOW Anywhere
2379 ALLOW Anywhere
2380 ALLOW Anywhere
10250/tcp ALLOW Anywhere
10251/tcp ALLOW Anywhere
10252/tcp ALLOW Anywhere
10255/tcp ALLOW Anywhere
179 ALLOW Anywhere
5473 ALLOW Anywhere
4789 ALLOW Anywhere
10248 ALLOW Anywhere
22 ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
6443 (v6) ALLOW Anywhere (v6)
2379 (v6) ALLOW Anywhere (v6)
2380 (v6) ALLOW Anywhere (v6)
10250/tcp (v6) ALLOW Anywhere (v6)
10251/tcp (v6) ALLOW Anywhere (v6)
10252/tcp (v6) ALLOW Anywhere (v6)
10255/tcp (v6) ALLOW Anywhere (v6)
179 (v6) ALLOW Anywhere (v6)
5473 (v6) ALLOW Anywhere (v6)
4789 (v6) ALLOW Anywhere (v6)
10248 (v6) ALLOW Anywhere (v6)
22 (v6) ALLOW Anywhere (v6)
Kubespray 部署失败,并禁用了 ufw。Kubespray 部署成功并启用了 ufw。
部署后,禁用 ufw 将允许 pod 连接到 80、443 以外的端口。但是,禁用 ufw 时集群会崩溃。
知道发生了什么吗?我是否缺少 ufw 配置中的端口....?kubespray 安装成功需要 ufw 似乎很奇怪。