上一篇,我们搭建了一个两个节点的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
需要说明的是:
-
里面的email、域名需要改成自己的,并且域名一定要是解析状态,非解析状态的域名无法成功申请证书;
-
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了。