在阿里雲Serverless Kubernetes叢集中,我們可以通過LoadBalancer Service對外提供四層服務訪問,同樣您也可以通過Ingress來對外提供七層服務訪問,下面介紹如何在Serverless Kubernetes叢集中提供七層網域名稱服務 (DNS)訪問。

前提條件

  • 您已建立一個serverless叢集,叢集的VPC需要配置NAT Gateway,從而訪問外網,下載容器鏡像。
  • 您已通過kubectl串連到叢集,參見通過 kubectl 串連 Kubernetes 叢集

使用說明

  1. 不指定SLB執行個體情況下系統會自動幫您產生一個公網SLB執行個體。
  2. SLB執行個體預設前端監聽連接埠為80(HTTP協議)和443(HTTPS協議)。
  3. SLB執行個體HTTPS認證預設會初始化為第一個建立的Ingress配置的TLS認證,否則會初始化為系統預設認證;您可根據需要自行在SLB控制台上進行修改。
  4. 當您指定使用已存在的SLB執行個體時,要求該SLB執行個體規格必須是效能保障型(支援ENI);同時確保80和443連接埠當前沒有其他服務使用。

注釋說明

注釋 說明
service.beta.kubernetes.io/alicloud-loadbalancer-id 指定已存在的SLB ID

使用預設產生的SLB執行個體

當您不指定SLB執行個體時,系統會在第一個Ingress建立時自動產生一個效能保障型的公網SLB執行個體。

1、 部署測試服務

首先部署一個coffee service和tea service,編排模板如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: coffee
spec:
  replicas: 2
  selector:
    matchLabels:
      app: coffee
  template:
    metadata:
      labels:
        app: coffee
    spec:
      containers:
      - name: coffee
        image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: coffee-svc
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: coffee
  clusterIP: None
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tea
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tea 
  template:
    metadata:
      labels:
        app: tea 
    spec:
      containers:
      - name: tea 
        image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: tea-svc
  labels:
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: tea
  clusterIP: None
$ kubectl apply -f cafe-service.yaml                   #在cafe-service.yaml檔案中輸入上面的模板
deployment "coffee" created
service "coffee-svc" created
deployment "tea" created
service "tea-svc" created

# 部署完成後

$ kubectl get svc,deploy
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/coffee-svc   ClusterIP   <none>       <none>        80/TCP    1m
svc/tea-svc      ClusterIP   <none>       <none>        80/TCP    1m

NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/coffee   2         2         2            2           1m
deploy/tea      1         1         1            1           1m

2、配置 Ingress

通過Ingress配置coffee service和tea service對外暴露的網域名稱和Path路徑:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
spec:
  rules:
  # 配置七層網域名稱
  - host: foo.bar.com
    http:
      paths:
      # 配置Context Path
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      # 配置Context Path
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80
$ kubectl apply -f cafe-ingress.yaml
ingress "cafe-ingress" created
  
# 部署完成後,ADDRESS為自動產生的SLB執行個體IP

$ kubectl get ing
NAME           HOSTS         ADDRESS          PORTS     AGE
cafe-ingress   foo.bar.com   139.224.76.211   80        1m

3、測試服務訪問

说明 目前我們需要自行將網域名稱解析到SLB執行個體IP上
本例中在 hosts中添加一條DNS網域名稱解析規則,用於測試服務訪問。建議您在工作環境中對網域名稱進行備案。
139.224.76.211    foo.bar.com
通過瀏覽器測試訪問coffee服務。


通過命令列方式測試訪問coffee服務。

curl -H "Host: foo.bar.com" http://139.224.76.211/coffee
通過瀏覽器測試訪問tea服務。


通過命令列方式測試訪問tea服務。

curl -H "Host: foo.bar.com" http://139.224.76.211/tea

使用指定的SLB執行個體

我們可以通過注釋 service.beta.kubernetes.io/alicloud-loadbalancer-id來指定使用已存在的SLB執行個體,但要求該SLB執行個體必須為效能保障型規格(支援ENI)。
说明 系統會自動初始化SLB執行個體的80和443連接埠,請確保當前沒有其他服務使用。

1、 部署測試服務

首先部署一個tomcat測試應用,編排模板如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tomcat
spec:
  replicas: 1
  selector:
    matchLabels:
      run: tomcat
  template:
    metadata:
      labels:
        run: tomcat
    spec:
      containers:
      - image: tomcat:7.0
        imagePullPolicy: Always
        name: tomcat
        ports:
        - containerPort: 8080
          protocol: TCP
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: tomcat
  clusterIP: None
$ kubectl apply -f tomcat-service.yml                 #在tomcat-service.yaml中輸入上面的模板
deployment "tomcat" created
service "tomcat" created

# 部署完成後

$ kubectl get svc,deploy tomcat
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
svc/tomcat   ClusterIP   <none>       <none>        8080/TCP   1m

NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/tomcat   1         1         1            1           1m

2、申請SLB執行個體

您需要在叢集同Region下自行申請一個 效能保障型SLB執行個體(如slb.s2.small),可以是私網也可以是公網(依據具體需求)。本例中申請一個公網SLB執行個體,記錄SLB執行個體的ID。


3、配置TLS認證

您需要配置TLS認證實現HTTPS訪問。

说明 系統自動依據第一個建立的Ingress的TLS認證來初始化SLB的HTTPS預設認證,若需要修改HTTPS預設認證,可在SLB控制台自行修改;若需配置多個認證,可在SLB控制台HTTPS監聽擴充網域名稱下自行添加。
# 產生測試TLS認證
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=bar.foo.com/O=bar.foo.com"# 建立TLS認證Secret
$ kubectl create secret tls cert-example --key tls.key --cert tls.crt
secret "cert-example" created

# 查看建立TLS認證

$ kubectl get secret cert-example
NAME           TYPE                DATA      AGE
cert-example   kubernetes.io/tls   2         12s

4、配置 Ingress

通過Ingress配置tomcat service對外暴露的網域名稱和Path路徑,編排模板如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tomcat-ingress
  annotations:
    # 配置使用指定的SLB執行個體(SLB ID)
    service.beta.kubernetes.io/alicloud-loadbalancer-id: lb-xxxxxxxxxx            ##替換為你的SLB ID
spec:
  tls:
  - hosts:
    - bar.foo.com
    # 配置TLS認證
    secretName: cert-example
  rules:
  # 配置七層網域名稱
  - host: bar.foo.com
    http:
      paths:
      # 配置Context Path
      - path: /
        backend:
          serviceName: tomcat
          servicePort: 8080
$ kubectl apply -f tomcat-ingress.yml                       #在tomcat-ingress.yaml中輸入上面的模板
ingress "tomcat-ingress" created

# 部署完成後,ADDRESS為指定的SLB IP地址

$ kubectl get ing tomcat-ingress
NAME             HOSTS         ADDRESS        PORTS     AGE
tomcat-ingress   bar.foo.com   47.101.20.67   80, 443   1m
5、測試服務訪問
说明 目前我們需要自行將網域名稱解析到SLB執行個體IP上。
本例中在 hosts中添加一條DNS網域名稱解析規則,用於測試服務訪問。建議您在工作環境中對網域名稱進行備案。
47.101.20.67   bar.foo.com
通過瀏覽器測試訪問tomcat服務:


通過命令列方式測試訪問tomcat服務:

curl -k -H "Host: bar.foo.com" https://47.101.20.67