通过Ingress暴露服务

在 Kubernetes 中应用可通过Ingress对外暴露服务。ACK默认部署了Ingress-Nginx,支持通过Ingress暴露HTTP和HTTPS类型的服务。

前提条件


  1. 需要先在阿里云ACK中创建Kubernetes集群

  2. Kubernetes集群中已部署ingress-nginx

  3. 安装kubectl命令行工具。

操作步骤


步骤一:创建应用和服务

1、创建两个应用(test-web1和test-web2)以及对应的Service(svc-web1和svc-web2)。

# kubectl run test-web1 --image=registry.cn-hangzhou.aliyuncs.com/yilong/ingress-test:web1
# kubectl expose deploy test-web1 --name=svc-web1 --port=80 --target-port=8080
# kubectl run test-web2 --image=registry.cn-hangzhou.aliyuncs.com/yilong/ingress-test:web2
# kubectl expose deploy test-web2 --name=svc-web2 --port=80 --target-port=8080

2、执行以下命令,确认两个应用及对应Service的状态是否正常。

# kubectl get po -l run=test-web1
NAME                        READY   STATUS    RESTARTS   AGE
test-web1-5df78d758-k9zlg   1/1     Running   0          4m16s
# kubectl get svc -l run=test-web1
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
svc-web1   ClusterIP   172.23.8.209   <none>        80/TCP    2m45s
# kubectl get po -l run=test-web2
NAME                       READY   STATUS    RESTARTS   AGE
test-web2-f5594985-gp7w4   1/1     Running   0          4m9s
# kubectl get svc -l run=test-web2
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
svc-web2   ClusterIP   172.23.9.181   <none>        80/TCP    2m40s

步骤二:通过Ingress暴露服务

ACK支持通过Ingress暴露HTTP和HTTPS两种类型的服务。

选项一:暴露HTTP类型服务

1、创建如下Ingress资源,对外暴露HTTP类型服务。

# cat <<EOF | kubectl create -f -
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-http
spec:
  rules:
  - host: web1.ingress-http.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: svc-web1
          servicePort: 80
  - host: web2.ingress-http.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: svc-web2
          servicePort: 80
EOF

2、确认Ingress资源创建成功。

# kubectl get ingress ingress-http
NAME           HOSTS                                         ADDRESS       PORTS   AGE
ingress-http   web1.ingress-http.com,web2.ingress-http.com   39.106.xx.xx  80      7s

3、验证对外暴露的应用可访问。

说明 请替换${IP}为上述Ingress资源ADDRESS字段显示的IP地址。

# curl -H "Host: web1.ingress-http.com" ${IP}/foo
web1: /foo
# curl -H "Host: web2.ingress-http.com" ${IP}/foo
web2: /foo

可以发现,通过请求头中不同Host设置,可以访问到Ingress代理后端的不同服务。

4、删除已创建的http-ingress资源。

# kubectl delete ingress http-ingress

选项二:暴露HTTPS类型服务

1、要暴露HTTPS类型服务,需要先创建TLS证书。

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=test.ingress-https.com/O=test.ingress-https.com"
# kubectl create secret tls ingrss-https --key tls.key --cert tls.crt

2、创建如下Ingress资源,对外暴露HTTPS类型服务。

cat <<EOF | kubectl create -f -
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-https
spec:
  tls:
  - hosts:
    - test.ingress-https.com
    secretName: ingress-https
  rules:
  - host: test.ingress-https.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: svc-web1
          servicePort: 80
      - path: /bar
        backend:
          serviceName: svc-web2
          servicePort: 80
EOF

3、确认Ingress资源创建成功。

# kubectl get ingress ingress-https
NAME            HOSTS                    ADDRESS       PORTS     AGE
ingress-https   test.ingress-https.com   39.106.xx.xx  80, 443   2m5s

4、验证对外暴露的应用可访问。

说明 请替换${IP}为上述Ingress资源ADDRESS字段显示的IP地址。

# curl -k -H "Host: test.ingress-https.com" https://${IP}/foo
web1: /foo
# curl -k -H "Host: test.ingress-https.com" https://${IP}/bar
web2: /bar

可以发现,通过请求不同的URL,可以访问到Ingress代理后端的不同服务。

5、删除已创建的https-ingress资源。

# kubectl delete ingress https-ingress

参考文档