在 Kubernetes 中应用可通过Ingress对外暴露服务。ACK默认部署了Ingress-Nginx,支持通过Ingress暴露HTTP和HTTPS类型的服务。
需要先在阿里云ACK中创建Kubernetes集群。
Kubernetes集群中已部署ingress-nginx。
安装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
ACK支持通过Ingress暴露HTTP和HTTPS两种类型的服务。
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
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