K3S 从放弃到入门(二) 使用域名访问dashboard

上一篇,我们搭建了一个两个节点的K3S集群,并且部署了一个dashboard,但是有一个不优雅的地方是访问dashboard需要加端口,这篇文章就来解决这个问题,最终效果是,通过域名访问dashboard。

第零步

准备一个域名,解析到主节点的IP上,这里假设域名是 k3s.example.com。

安装 Nginx Ingress

K3S默认安装,自带一个Traefik Ingress,但是,我发现网上的很多资料,都是用的Nginx Ingress,所以作为新手的我们,还是本着别人用什么我们也用什么的原则,装一个Nginx Ingress,这样如果碰到问题,网上参考资料也多。

在主节点运行命令:vi /etc/systemd/system/k3s.service修改配置文件,禁用系统自带的Traefik Ingress

把ExecStart那一行内容改成如图所示,主要是加了 --disable traefik参数。

运行命令重启服务:

systemctl daemon-reload
systemctl restart k3s

把这个文件https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml 下载到本地,用文本编辑器打开,把里面的内容替换一下,因为国内访问不了。

原始值 替换值
k8s.gcr.io/ingress-nginx/kube-webhook-certgen liangjw/kube-webhook-certgen
k8s.gcr.io/ingress-nginx/controller liangjw/ingress-nginx-controller

上传deploy.yaml文件,并执行命令:kubectl apply -f deploy.yaml稍等一会儿,就装好了。

安装cert-manager

把这个文件https://github.com/cert-manager/cert-manager/releases/download/v1.7.2/cert-manager.yaml 下载到本地,并上传的服务器,执行命令kubectl apply -f cert-manager.yaml

创建文件issur.yaml

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-issuer
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: user@example.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-http01
    # Enable the HTTP-01 challenge provider
    solvers:
    # An empty 'selector' means that this solver matches all domains
    - selector: {}
      http01:
        ingress:
          class: nginx
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: k3s-example-com
  namespace: kubernetes-dashboard
spec:
  secretName: k3s-example-com-tls
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt-issuer
  dnsNames:
  - k3s.example.com

需要说明的是:

  1. 里面的email、域名需要改成自己的,并且域名一定要是解析状态,非解析状态的域名无法成功申请证书;

  2. Issuer的类型分两种:ClusterIssuer和Issuer,ClusterIssuer可以跨namespace提供服务,Issuer类型只能在相同的namespace提供服务。这里证书需要放在kubernetes-dashboard所在的namespace中,所以我把他设置成ClusterIssuer,这样以后我在别的namespace中也能用他。

可以使用命令 kubectl get secret k3s-example-com-tls -n kubernetes-dashboard -o yaml 看下有没有成功。

配置Ingress

创建一个文件dashboard-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
  name: dashboard-ingress
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: k3s.example.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 8443
  tls:
    - hosts:
      - k3s.example.com
      secretName: k3s-example-com-tls

执行命令kubectl apply -f dashboard-ingress.yaml

不出意外,因该可以通过域名访问dashboard了。

Back to Top