天天看點

阿裡雲Serverless Kubernetes通過Ingress提供7層服務通路

簡介

在阿裡雲Serverless Kubernetes叢集中,我們可以通過LoadBalancer Service對外提供四層服務通路,同樣我們也可以通過Ingress來對外提供七層服務通路,今天主要分享下如何在Serverless Kubernetes叢集中提供七層域名服務通路。

阿裡雲Serverless Kubernetes通過Ingress提供7層服務通路

使用說明

  1. 不指定SLB執行個體情況下系統會自動幫您生成一個公網SLB執行個體。
  2. SLB執行個體預設前端監聽端口為80(HTTP協定)和443(HTTPS協定);健康檢查路徑是根路徑(/),請確定後端服務能正常提供通路(響應碼為2xx或3xx)。
  3. SLB執行個體HTTPS證書預設會初始化為第一個建立的Ingress配置的TLS證書,否則會初始化為系統預設證書;您完全可根據需要自行在SLB控制台上進行修改。
  4. 當您指定使用已存在的SLB執行個體時,要求該SLB執行個體規格必須是性能保障型(支援ENI);同時確定80和443端口目前沒有其他服務使用。

注釋說明

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

部署示例

a. 使用預設生成的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
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上

3.1 通過浏覽器測試通路coffee服務:

阿裡雲Serverless Kubernetes通過Ingress提供7層服務通路

3.2 通過指令行方式測試通路coffee服務:

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

3.3 通過浏覽器測試通路tea服務:

阿裡雲Serverless Kubernetes通過Ingress提供7層服務通路

3.4 通過指令行方式測試通路tea服務:

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

b. 使用指定的SLB執行個體

我們可以通過注釋

service.beta.kubernetes.io/alicloud-loadbalancer-id

來指定使用已存在的SLB執行個體,但要求該SLB執行個體必須為性能保障型規格(支援ENI)。

注意:系統會自動初始化SLB執行個體的80和443端口,請確定目前沒有其他服務使用

這裡我們部署一個tomcat service:

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
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),可以是私網也可以是公網(依據具體需求)。

3、配置TLS證書

注意:系統自動依據第一個建立的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-uf6y73uq40u9oz1q8snxc
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
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上

5.1 通過浏覽器測試通路tomcat服務:

阿裡雲Serverless Kubernetes通過Ingress提供7層服務通路

5.2 通過指令行方式測試通路tomcat服務:

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