准备工作

  1. 需要一个公网可访问的 IP,例如 139.198.121.121
  2. 需要一个域名,并且已经解析到到对应的IP,例如 A kubesphere.io 139.198.121.121,我们将 staging.kubesphere.io 域名解析到了 139.198.121.121
  3. 在KubeSphere上已经运行网站对应的服务,例如本例中的ks-console

启用项目网关

在 KubeSphere 中启用对应项目下的网关

我们开启的是一个NodePort类型的网关,需要在集群外部使用 LoadBalancer 转发到网关的端口,将 139.198.121.121 绑定到 LoadBalancer 上,这样我们就可以通过公网IP直接访问我们的服务了
如果在青云上,直接创建LoadBalancer类型的网关,填入公网IP对应的 eip,会自动创建好负载均衡器,并将端口转发到网关。

安装 cert-manager

详细安装文档可以参考 cert-manager

cert-manager 部署时会创建一个 webhook 来校验 cert-manager 相关对象是否符合格式,不过也会增加部署的复杂性。这里我们使用官方提供的一个 no-webhook 版本安装。

执行下列命令即可

 # Install the CustomResourceDefinitions and cert-manager itself
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v0.11.0/cert-manager-no-webhook.yaml

创建 Issuer

Issuer 是 cert-manager 中的概念,表示证书的签发者。在此实例中,我们使用免费的 letsencrypt 来获取TLS证书。

在 kubectl 中执行下面命令来创建一个kubesphere-system项目可用的 Issuer(注意修改项目和email信息)

kubectl -n kubesphere-system create -f - <<EOF
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
  name: letsencrypt-prod
  namespace: kubesphere-system
spec:
  acme:
    email: kubesphere@kubesphere.io
    privateKeySecretRef:
      name: letsencrypt-prod
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - http01:
        ingress:
          class: nginx
EOF

创建完成后,执行下面命令可以看到

[root@master ~]# kubectl -n kubesphere-system get issuers.cert-manager.io
NAME               AGE
letsencrypt-prod   46m

创建证书 Certificate

在kubectl里执行下面命令创建

kubectl -n kubesphere-system create -f - <<EOF
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: staging-kubesphere-io
  namespace: kubesphere-system
spec:
  commonName: staging.kubesphere.io
  dnsNames:
  - staging.kubesphere.io
  duration: 2160h
  issuerRef:
    name: letsencrypt-prod
  renewBefore: 360h
  secretName: staging-kubesphere-io
EOF

cert-manager 会根据 Certificate 自动进行 http01 challenge 签发证书,在 kubesphere-system 下创建对应的 TLS 证书

[root@master ~]# kubectl -n kubesphere-system get secrets
NAME                                TYPE                                  DATA   AGE
staging-kubesphere-io               kubernetes.io/tls                     3      40m

使用证书

证书签发完成后,确认对应的 TLS 证书已经在项目下创建,就可以在创建应用路由(Ingress)中使用证书了。如下,创建时选择对应的 TLS 证书即可

9 个月 后

按照这个方法做了,但是发现一个问题,在kubesphere-system这个系统NS中,我的admin
账户没法打开网关,在高级设置中没有打开网关的按钮。我已经确定把admin
添加到管理者角色中了

    1 个月 后

    Levi 系统 NS 目前不允许在界面进行操作

    • lxm 回复了此帖
      20 天 后

      Feynman kubesphere-system 是跑在host集群的,按照文章操作后,开启网关,lb创建在了member集群

      • lxm 回复了此帖

        lxm 找到问题,需要选择一下集群