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