网站首页 文章专栏 02dashboard ingress部署.md
02dashboard ingress部署.md
创建于:2021-07-04 07:52:13 更新于:2024-12-03 17:33:20 羽瀚尘 426

背景

之前使用NodePort方式部署了k8s dashboard,但美中不足的是只能通过node的ip访问该服务。而k8s的pod是随机调度的,不知道什么时间该pod就不在原先的node上了。所以有必要将dashboard页面通过ingress的方式暴露出来。

http方式

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard-ingress
  namespace: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/secure-backends: "true"
spec:
  rules:
  - host: k8s.stackoverflow.club #生产中该域名应当可以被公网解析
    http:
      paths: 
      - path: /
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

这里面能修改的内容不多,只有metadata.namespec.rules[].host是自定义的,其他东西都动不得。

特别要强调以下几点:

  1. metadata.annotations.nginx.ingress.kubernetes.io/secure-backends: "true"表明后端服务是https访问的,这点非常重要。我在上面折腾了很久,配置错误实际上是用http方式访问https,返回503错误。
  2. metadata.namespace: kubernetes-dashboard用来设置ingress的命名空间,要和dashboard的一致,否则ingress无法访问dashboard数据。

https方式

首先要生成证书

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=k8s.stackoverflow.club"

修改命令中的域名部分,自己签一个证书(貌似这种方式省去生成ca?)

然后证书放到k8s中

kubectl create secret tls k8s-dashboard-secret  --key  tls.key --cert tls.crt

kubectl create secret是重点,用来生成密码之类的东西。

配置ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard-ingress
  namespace: kubernetes-dashboard
  annotations: 
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/secure-backends: "true"
spec:
  tls:
  - secretName: k8s-dashboard-secret
  rules:
  - host: k8s.stackoverflow.club #生产中该域名应当可以被公网解析
    http:
      paths: 
      - path:
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

注意以下几点:

  1. metadata.annotations用来声明nginx的重写等行为
  2. spec.tls用来添加证书,secretNamekubectl create secret相同

参考