簡體   English   中英

在集群外公開 Kubernetes 服務

[英]Exposing a Kubernetes service outside the cluster

我正在嘗試公開一個在集群外公開的簡單 grafana 服務。 以下是我在此處發布之前在故障排除和研究方面所做的工作以及我的設置的一些細節。

Grafana 部署 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
spec:
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      replicas: 2
      securityContext:
        fsGroup: 472
        supplementalGroups:
          - 0
      containers:
        - name: grafana
          image: 'grafana/grafana:8.0.4'
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000
              name: http-grafana
              protocol: TCP
          env:
            - name: GF_DATABASE_CA_CERT_PATH
              value: /etc/grafana/BaltimoreCyberTrustRoot.crt.pem
          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:
            - name: grafana-configmap-pv
              mountPath: /etc/grafana/grafana.ini
              subPath: grafana.ini
            - name: grafana-pv
              mountPath: /var/lib/grafana
            - name: cacert
              mountPath: /etc/grafana/BaltimoreCyberTrustRoot.crt.pem
              subPath: BaltimoreCyberTrustRoot.crt.pem
      volumes:
        - name: grafana-pv
          persistentVolumeClaim:
            claimName: grafana-pvc
        - name: grafana-configmap-pv
          configMap:
            name: grafana-config
        - name: cacert
          configMap:
            name: mysql-cacert

Grafana 服務 yaml

apiVersion: v1
kind: Service
metadata:
  name: grafana
spec:
  type: ClusterIP
  ports:
    - port: 3000
      protocol: TCP
      targetPort: http-grafana
  clusterIP: 10.7.2.57
  selector:
    app: grafana
  sessionAffinity: None

我已將 nginx 安裝為 Ingress 控制器。 這是 nginx 控制器服務的 YAML

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/version: 1.0.0
    helm.sh/chart: ingress-nginx-4.0.1
spec:
  ports:
    - name: http
      protocol: TCP
      appProtocol: http
      port: 80
      targetPort: http
      nodePort: 32665
    - name: https
      protocol: TCP
      appProtocol: https
      port: 443
      targetPort: https
      nodePort: 32057
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  clusterIP: 10.7.2.203
  clusterIPs:
    - 10.7.2.203
  type: NodePort
  sessionAffinity: None
  externalTrafficPolicy: Cluster
status:
  loadBalancer: {}

Ingress 資源 yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grafana-ingress
spec:
  rules:
  - host: test.grafana.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: grafana
            port:
              number: 3000

入口 ip 10.7.0.5 根本無法訪問。 我曾多次嘗試重新部署資源。 grafana POD ips 可通過端口 3000 訪問,我可以登錄等,但無法通過 nginx 負載均衡器訪問 grafana。 我錯過了什么?

編輯:

kubectl get 服務的結果

NAME          TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
grafana       ClusterIP   10.7.2.55    <none>        3000/TCP   2d14h
hello-world   ClusterIP   10.7.2.140   <none>        80/TCP     42m
kubernetes    ClusterIP   10.7.2.1     <none>        443/TCP    9d

kubectl get ingress 的結果

NAME              CLASS    HOSTS   ADDRESS    PORTS   AGE
grafana-ingress   <none>   *       10.7.0.5   80      2d2h

kubectl get pods 的結果

default         grafana-85cdb8c656-6zgkg                    1/1     Running     0          2d21h
default         grafana-85cdb8c656-7n626                    1/1     Running     0          2d21h
default         hello-world-78796d6bfd-fwb98                1/1     Running     0          2d12h
ingress-nginx   ingress-nginx-controller-57ffff5864-rw57w   1/1     Running     0          2d12h

您的入口控制器的服務是 NodePort 類型,這意味着它沒有公共 IP 地址。 Service 的 ClusterIP (10.7.2.203) 僅在集群內部網絡中有用。

如果您的集群節點具有公共 IP 地址,您可以使用這些地址連接到入口控制器。 由於它的 Service 是 NodePort 類型,因此它會偵聽所有集群節點上的特定端口。 根據您提供的服務規范,這些端口分別為 32665(用於 HTTP)和 32057(用於 HTTPS)。

如果您希望入口控制器具有專用 IP 地址,則可以將其服務類型更改為 LoadBalancer。 您的 Kubernetes 服務提供商將為您的服務分配一個公共 IP 地址。 然后,您可以使用該 IP 地址連接到您的入口控制器。

這僅在您使用托管 Kubernetes 服務時有效。 如果您是自我管理的,那么您需要設置一個負載均衡器來偵聽公共 IP 地址並將流量路由到集群的節點。

你仍然暴露你的服務僅限於 k8s 內部網絡。

  • 一種解決方案是在您的 pod 定義(鏈接)中使用“hostNetwork: True”,這樣您的 pod 將通過您的主機網絡而不是 k8s 內部網絡公開(請注意,它確實會擴大您的安全風險)。

  • 另一種方法是使用來自您的雲提供商的負載均衡器服務或部署像MetalB這樣的本地負載均衡器服務

  • 或者您可以在一個或多個節點上手動部署 nginx 或 haproxy 等代理服務,以代理從 k8s 內部網絡到您的主機網絡和外部世界的流量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM