使用 ingress 创建对外服务
一,使用 ingress 创建对外服务
使用 ingress 暴露服务需要先新建一个svc,所以我们先使用如下内容创建一个,它会把 pod kubia端口8080上的服务转发到自己的8080上kubia-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- port: 8080
targetPort: 8080
selector:
app: kubia
然后使用kubectl create -f kubia-svc.yaml创建该svc,接下来我们创建一个ingress。ingress 支持创建HTTP和HTTPS的服务,接下来我们先来创建一个HTTP的:
创建 HTTP 协议的访问
http协议的访问比较简单,直接创建如下配置文件即可,通过这个ingress配置文件,nginx-ingress-controller就知道如何对外开发服务了。
kubia-http-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kubia
spec:
rules:
# 将服务映射到该域名
- host: kubia.example.com
http:
paths:
# 通过 / 路径就可以访问该服务
- path: /
# 该服务后端 svc 的名称及端口号
backend:
serviceName: kubia
servicePort: 8080
然后使用kubectl create -f kubia-http-ingress.yaml就可以创建ingress了。我们可以使用kubectl describe ingress kubia来查看他的介绍
root@master1:~# k describe ingress kubia Name: kubia Namespace: default Address: Default backend: default-http-backend:80 (<none>) Rules: Host Path Backends ---- ---- -------- kubia.example.com / kubia:8080 (10.244.1.59:8080,10.244.2.31:8080,10.244.3.30:8080) Annotations: Events: <none>
ok,现在我们就可以通过http://kubia.example.com/来访问目标svc了,在系统的hosts文件里配置一下,将这个域名映射到nginx-ingress-controller的 ip 地址就可以了,详情见下方:
配置域名到 ip 地址
首先获取
nginx-ingress-controller的 ip 地址,执行如下命令后按Tab补全名称,然后在IP列就可以找到对应的 ipkubectl describe pod -n ingress-nginx nginx-ingress-controller-
我的 ip 地址为
192.168.56.22,执行vi /etc/hosts,输入以下内容即可:192.168.56.22 kubia.example.com
修改完了之后,我们就可以进行访问了,执行curl http://kubia.example.com/,就可以看到来自 svc kubia的响应了
root@master1:~# curl http://kubia.example.com/ You've hit kubia-m68bq root@master1:~# curl http://kubia.example.com/ You've hit kubia-8r2cg root@master1:~# curl http://kubia.example.com/ You've hit kubia-flg8w
创建 HTTPS 协议的访问
这里的 https 访问是指从客户端到 ingress 控制器之间的连接是加密的,而控制器与后端svc及pod之间的连接则还是 http,如下所示:

想要让ingress可以提供https服务,我们首先需要有证书和私钥,这里我们先来创建他们俩
openssl genrsa -out tls.key 2048 openssl req -new -x509 \ -key tls.key \ -out tls.cert \ -days 360 \ -subj /CN=kubia.example.com
执行完之后你就可以在当前文件夹下发现两个文件,分别为tls.cert和tls.key。因为这种秘钥比较敏感,不适合直接挂载到 pod 上,所以可以使用 k8s 提供的专门用于提供敏感数据的资源secret来存放它,我们先来新建一个名为tls-secret的secret资源:
然后我们就可以修改上文中的kubia-http-ingress.yaml,将这个secret挂载上去:
kubia-https-ingress.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kubia spec: # 添加 tls 字段来启用 https tls: - hosts: # 启用 https 的域名 - kubia.example.com # 给其分配的证书及密钥,要求 tls 类型的 k8s secret 资源 secretName: tls-secret rules: - host: kubia.example.com http: paths: - path: / backend: serviceName: kubia servicePort: 8080
然后我们就可以通过以下命令来讲刚才创建的http服务提升至https,kubectl apply依靠kind及metadata字段中的数据来寻找要修改的资源,所以改名字并不会造成什么影响:
kubectl apply -f kubia-https-ingress.yaml
然后输入curl -k -v https://kubia.example.com,就可以发现我们的服务已经启用的https连接:
root@master1:~# curl -k -v https://kubia.example.com ... * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt ... * Server certificate: * subject: CN=kubia.example.com ... You've hit kubia-flg8w
使用 ingress 暴露多个服务
在kubia-ingress.yaml文件中可以看到,rules和paths都是数组,所以我们可以通过其暴露多个服务,如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kubia
spec:
rules:
- host: foo.example.com
http:
paths:
# 通过指定不同的路径来访问不同的服务
- path: /foo
backend:
serviceName: foo-svc
servicePort: 8080
- path: /bar
backend:
serviceName: bar-svc
servicePort: 8080
# 也可以通过指定多个 host 来配置不同的主机
- host: foo.example.com
http:
paths:
- path: /kubia
backend:
serviceName: kubia
servicePort: 8080
但是哪怕在一个文件中可以配置多个规则,但是依旧推荐为每一个svc都创建一个自己专属的ingress,这样条理会比较清晰,也方便日后的管理

浙公网安备 33010602011771号