[英]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 地址並將流量路由到集群的節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.