使用无选择器服务和手动端点从 microk8s pod 访问外部 InfluxDb 数据库?
Posted
技术标签:
【中文标题】使用无选择器服务和手动端点从 microk8s pod 访问外部 InfluxDb 数据库?【英文标题】:Accessing an external InfluxDb Database from a microk8s pod using selectorless service and manual endpoint? 【发布时间】:2021-12-18 07:32:34 【问题描述】:要点:我正在努力让一个 pod 连接到集群外部的服务。 基本上,pod 设法解决了无选择器服务的 ClusterIp,但流量没有通过。如果我从集群主机点击无选择器服务的 ClusterIp,流量确实会通过。
总的来说,我对 microk8s 和 k8s 还很陌生。不过,我希望我能说得通……
背景:
我正在尝试将部分基础架构从一台虚拟机上的 docker-compose 设置移动到 microk8s 集群(有 2 个节点)。
在 docker compose 中,我有一个 Grafana 容器,连接到一个 InfluxDb 容器。
kubectl 版本:
Client Version: version.InfoMajor:"1", Minor:"22+", GitVersion:"v1.22.2-3+9ad9ee77396805", GitCommit:"9ad9ee77396805781cd0ae076d638b9da93477fd", GitTreeState:"clean", BuildDate:"2021-09-30T09:52:57Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"
我现在想在 microk8s 集群上设置一个 Grafana 容器,并让它连接到仍在 docker-compose vm 上运行的 InfluxDb。
所有这些虚拟机都在 ESXi 主机上运行。
InfluxDb 暴露在 10.1.2.220:8086 microk8s-master 的 ip 为 10.1.2.50 microk8s-slave-1 的 ip 为 10.1.2.51我已启用入口和 dns。我也启用了metallb,虽然我不打算在这里使用它。
我已经配置了一个无选择器服务、一个远程端点和一个出口网络策略(当前允许所有)。
从 microk8s-master 和 slave-1,我可以
telnet 直接到 10.1.2.220:8086 成功 telnet到服务的ClusterIP(10.152.183.26):8086,成功到达influxdb wget ClusterIp:8086在 Pod 内部,如果我对 influxdb-service:8086 执行 wget,它将解析到 ClusterIP,但之后会超时。 但是,我可以访问(wget)指向同一命名空间中其他 pod 的服务
更新:
我已经能够通过解决方法让它工作,但我认为这不是正确的方法。
我的临时解决方案是在 metallb 上公开无选择器服务,然后在 pod 内使用该公开的 ip。
InfluxDb 的服务和端点
---
apiVersion: v1
kind: Service
metadata:
name: influxdb-service
labels:
app: grafana
spec:
ports:
- protocol: TCP
port: 8086
targetPort: 8086
---
apiVersion: v1
kind: Endpoints
metadata:
name: influxdb-service
subsets:
- addresses:
- ip: 10.1.2.220
ports:
- port: 8086
服务和端点显示正常
eso@microk8s-master:~/k8s-grafana$ microk8s.kubectl get endpoints
NAME ENDPOINTS AGE
neo4j-service-lb 10.1.166.176:7687,10.1.166.176:7474 25h
influxdb-service 10.1.2.220:8086 127m
questrest-service 10.1.166.178:80 5d
kubernetes 10.1.2.50:16443,10.1.2.51:16443 26d
grafana-service 10.1.237.120:3000 3h11m
eso@microk8s-master:~/k8s-grafana$ microk8s.kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 26d
questrest-service ClusterIP 10.152.183.56 <none> 80/TCP 5d
neo4j-service-lb LoadBalancer 10.152.183.166 10.1.2.60 7474:31974/TCP,7687:32688/TCP 25h
grafana-service ClusterIP 10.152.183.75 <none> 3000/TCP 3h13m
influxdb-service ClusterIP 10.152.183.26 <none> 8086/TCP 129m
eso@microk8s-master:~/k8s-grafana$ microk8s.kubectl get networkpolicy
NAME POD-SELECTOR AGE
grafana-allow-egress-influxdb app=grafana 129m
test-egress-influxdb app=questrest 128m
描述:
eso@microk8s-master:~/k8s-grafana$ microk8s.kubectl describe svc influxdb-service
Name: influxdb-service
Namespace: default
Labels: app=grafana
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.152.183.26
IPs: 10.152.183.26
Port: <unset> 8086/TCP
TargetPort: 8086/TCP
Endpoints: 10.1.2.220:8086
Session Affinity: None
Events: <none>
eso@microk8s-master:~/k8s-grafana$ microk8s.kubectl describe endpoints influxdb-service
Name: influxdb-service
Namespace: default
Labels: <none>
Annotations: <none>
Subsets:
Addresses: 10.1.2.220
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
<unset> 8086 TCP
Events: <none>
eso@microk8s-master:~/k8s-grafana$ microk8s.kubectl describe networkpolicy grafana-allow-egress-influxdb
Name: grafana-allow-egress-influxdb
Namespace: default
Created on: 2021-11-03 20:53:00 +0000 UTC
Labels: <none>
Annotations: <none>
Spec:
PodSelector: app=grafana
Not affecting ingress traffic
Allowing egress traffic:
To Port: <any> (traffic allowed to all ports)
To: <any> (traffic not restricted by destination)
Policy Types: Egress
Grafana.yml:
eso@microk8s-master:~/k8s-grafana$ cat grafana.yml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: grafana-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: ""
claimRef:
name: grafana-pvc
namespace: default
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/MainVol/grafana
server: 10.2.0.1
readOnly: false
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
volumeName: grafana-pv
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: grafana
name: grafana
spec:
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
securityContext:
fsGroup: 472
supplementalGroups:
- 0
containers:
- name: grafana
image: grafana/grafana:7.5.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: http-grafana
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /robots.txt
port: 3000
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 2
livenessProbe:
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 3000
timeoutSeconds: 1
resources:
requests:
cpu: 250m
memory: 750Mi
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-pv
volumes:
- name: grafana-pv
persistentVolumeClaim:
claimName: grafana-pvc
---
apiVersion: v1
kind: Service
metadata:
name: grafana-service
spec:
ports:
- port: 3000
protocol: TCP
targetPort: http-grafana
selector:
app: grafana
#sessionAffinity: None
#type: LoadBalancer
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: "g2.some.domain.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana-service
port:
number: 3000
---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: grafana-allow-egress-influxdb
namespace: default
spec:
podSelector:
matchLabels:
app: grafana
ingress:
-
egress:
-
policyTypes:
- Egress
【问题讨论】:
您使用的是哪个 Kubernetes 版本? kubectl 版本 -> 1.22+ / 1.22.2 microk8s: 1.22.2 我后来发现我的路由器没有提供到集群 pod 网络的路由。它默认为 10.1.0.0/16 (我已经用于其他用途)我将 pod CIDR 更改为 10.5.0.0/16 ,然后在我的 pfsense 路由器中添加到该网络的路由,现在我的大部分网络工作得更好了:) 【参考方案1】:由于我没有得到太多回应,我将用我的“解决方法”来回答这个问题。不过,我仍然不确定这是最好的方法。
我通过在 metallb 上暴露无选择器服务,然后在 grafana 中使用暴露的 ip 来让它工作
kind: Service
apiVersion: v1
metadata:
name: influxdb-service-lb
#namespace: ingress
spec:
type: LoadBalancer
loadBalancerIP: 10.1.2.61
# selector:
# app: grafana
ports:
- name: http
protocol: TCP
port: 8086
targetPort: 8086
---
apiVersion: v1
kind: Endpoints
metadata:
name: influxdb-service-lb
subsets:
- addresses:
- ip: 10.1.2.220
ports:
- name: influx
protocol: TCP
port: 8086
然后我在 grafana (10.1.2.61) 中使用负载均衡器 ip
【讨论】:
以上是关于使用无选择器服务和手动端点从 microk8s pod 访问外部 InfluxDb 数据库?的主要内容,如果未能解决你的问题,请参考以下文章