使用无选择器服务和手动端点从 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 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

Select2:使用ajax数据源时添加和选择手动值

microk8s处理微服务之间的调用

如何从联合端点抓取所有指标?

Service Fabric 中无状态服务的服务解析器

如何使用默认 Ingress 使用 Kubernetes microk8s 设置 Letsencrypt?

通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)