我正在努力解决这个问题,因为现在基本上已经有几周了......整个互联网上实际上没有一个如何做到这一点的例子。其实很安静很搞笑。
我的仪表板部署:
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- args:
- --namespace=kube-system
- --enable-insecure-login
- --insecure-bind-address=0.0.0.0
image: kubernetesui/dashboard:v2.3.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 9090
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
name: kubernetes-dashboard
ports:
- containerPort: 9090
name: http
protocol: TCP
resources: {}
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsGroup: 2001
runAsUser: 1001
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /certs
name: kubernetes-dashboard-certs
- mountPath: /tmp
注意以下事项:
截至官方仪表板参数文档
我将参数添加到仪表板部署中:
--enable-insecure-login
这会导致不安全的登录:这意味着仪表板上将提供默认端口 9090(我猜是容器)。
如您所见,我进一步使该容器可以在 kubernetes pod 本身上访问
ports:
- containerPort: 9090
name: http
protocol: TCP
在那之后,..当然我也在仪表板本身的服务中路由了那个端口。
这是我的服务.yaml:
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
creationTimestamp: "2022-04-05T13:11:22Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
resourceVersion: "12795"
selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
uid: 01bb1897-e18f-418e-949d-465069b561de
spec:
clusterIP: 10.152.183.208
clusterIPs:
- 10.152.183.208
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- nodePort: 30838
port: 9090
protocol: TCP
targetPort: 9090
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
在这里我们可以清楚地看到端口都已正确分配:
- nodePort: 30838
port: 443
protocol: TCP
targetPort: 9090
nodePort
是可选的..它将是服务将所有这些公开给外界(又名浏览器等)的端口
port
是服务将在集群内部公开的端口。我选择将其保留为默认值。
最后,
targetPort
必须与 Pod 上最初暴露的端口匹配。确实如此。
当然,我在仪表板参数中设置了
--insecure-bind-address=0.0.0.0
,以允许在任何地址上提供不安全的端口。
当我尝试用浏览器访问它时,它就死了。没有反应,什么也没有。
那么我哪里出错了?
真的没有例子吗?如果我设法让它发挥作用,事实上我计划正式向 Kubernetes 本身或一些主要的教程服务提出解决方案。我看到数百人为此苦苦挣扎,最终放弃等等。:D
查看 kubernetes-dashboard 源代码,它要么提供 HTTPS,要么提供 HTTP(但不能同时提供两者)。拥有
--insecure-bind-address=0.0.0.0
、insecure-port=9090
并且没有关于 cert/TLS 的参数(即 删除默认值 --auto-generate-certificates
)对我来说很有效。