k3s配置ingress使用ssl证书


What is Ingress?

Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.

    internet
        |
   [ Ingress ]
   --|-----|--
   [ Services ]

Ingress暴露了从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制。

可以将Ingress配置为提供服务外部可访问的URL,负载平衡流量,并提供基于SSL / TLS的虚拟主机。
入口控制器通常通过负载平衡器负责实现入口,尽管它也可以配置边缘路由器或其他前端以帮助处理流量。

说白了ingress的功能就是类是于反向代理,能够做到像nginx一样的反代的功能,控制流量,并有负载均衡的能力,本文主要讨论如何在k3s集群中配置https证书

  • 注意:k3s集群默认使用traefik来实现反向代理,但也支持使用nginx来作为 ingress controller 来实现反向代理

配置http ingress

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: PathPrefixStrip
spec:
  rules:
  # 这里可以配置多个域名代理规则
    - host: xxx # 域名
      http:
        paths:
          - backend:
              serviceName: service-01
              servicePort: 8080
    - host: xxx # 域名
      http:
       paths:
         - backend:
             serviceName: service-02
             servicePort: 8080
执行: kubectl apply -f ingress.yaml ,创建ingress。

[root@hostname ~]# kubectl get ingress 
NAME                 HOSTS                         ADDRESS         PORTS     AGE
test-ingress         xxxxx,xxxx                    172.17.19.115    80     6h15m

可以看到 端口为80,说明ingress已经为指定的service做好http代理

为ingress配置https

  • 首先配置k3s secret
apiVersion: v1
kind: Secret
metadata:
  name: testsecret-tls
  namespace: default
data:
  tls.crt: base64 encoded cert #此处必须为base64 加密后的证书 可使用 cat xxx.pem | base64  命令得到
  tls.key: base64 encoded key  #此处必须为base64 加密后的密钥 可使用 cat xxx.key | base64  命令得到
type: kubernetes.io/tls
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: test-ingress
  namespace: default # ingress要和secret在同一个名称空间下
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: PathPrefixStrip
     # http 重定向到 https
    ingress.kubernetes.io/ssl-redirect: "True"
spec:
  tls:
    - hosts:
        - xxxx.xxxx  # 这里是下面要配置https的域名
        - xxxx.xxxx  # 这里是下面要配置https的域名
      secretName: testsecret-tls
  rules:
  # 这里可以配置多个域名代理规则
    - host: xxx # 域名
      http:
        paths:
          - backend:
              serviceName: service-01
              servicePort: 8080
    - host: xxx # 域名
      http:
       paths:
         - backend:
             serviceName: service-02
             servicePort: 8080
先后执行: kubectl apply -f secret.yaml 
         kubectl apply -f ingress.yaml
-----------------------------------------------------
查看 secret : kubectl get secret

 [root@hostname ~]# kubectl get secret 
 NAME                  TYPE                                  DATA   AGE
 default-token-d25kq   kubernetes.io/service-account-token   3      10h
 testsecret-tls        kubernetes.io/tls                     2      7h25m

第二行为我们所创建的证书的secret对象
------------------------------------------------------
查看ingress: kubectl get ingress 

[root@hostname ~]# kubectl get ingress 
NAME                 HOSTS                         ADDRESS         PORTS     AGE
test-ingress       xxx.xxx,xxx.xxx                172.17.19.115   80, 443   7h26m

可以看到 端口已经添加了443

如果操作无误,这时访问我们的域名已经是变成了https,并且访问http也会被重定向到https


文章作者: Ubi-potato
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ubi-potato !
评论
  目录