我正在嘗試公開一個在集群外公開的簡單 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
uj5u.com熱心網友回復:
您的入口控制器的服務是 NodePort 型別,這意味著它沒有公共 IP 地址。Service 的 ClusterIP (10.7.2.203) 僅在集群內部網路中有用。
如果您的集群節點具有公共 IP 地址,您可以使用這些地址連接到入口控制器。由于它的 Service 是 NodePort 型別,因此它會偵聽所有集群節點上的特定埠。根據您提供的服務規范,這些埠分別為 32665(用于 HTTP)和 32057(用于 HTTPS)。
如果您希望入口控制器具有專用 IP 地址,則可以將其服務型別更改為 LoadBalancer。您的 Kubernetes 服務提供商將為您的服務分配一個公共 IP 地址。然后,您可以使用該 IP 地址連接到您的入口控制器。
這僅在您使用托管 Kubernetes 服務時有效。如果您是自我管理的,那么您需要設定一個負載均衡器來偵聽公共 IP 地址并將流量路由到集群的節點。
uj5u.com熱心網友回復:
你仍然暴露你的服務僅限于 k8s 內部網路。
一種解決方案是在您的 pod 定義(鏈接)中使用“hostNetwork: True” ,這樣您的 pod 將通過您的主機網路而不是 k8s 內部網路公開(請注意,它確實會擴大您的安全風險)。
另一種方法是使用來自您的云提供商的負載均衡器服務或部署像MetalB這樣的本地負載均衡器服務
或者您可以在一個或多個節點上手動部署 nginx 或 haproxy 等代理服務,以代理從 k8s 內部網路到您的主機網路和外部世界的流量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354592.html
標籤:nginx Kubernetes
