云平臺并非浪得虛名。
基于它,你的應用很可能像權貴的干兒子,雖出身平凡,但是可憑空獲得一切。
比如,你的web應用本出身平凡,窮的連https都不支持,但是有了云平臺的基礎支持,你都不用改一行代碼,就可以讓它支持https協議,獲得應用本身的安全加固。
如何做?
其實就是基于kubernetes本身的 Ingress + tsl 機制。
步驟如下:
- 生成私鑰 tls.key, 密鑰位數是 2048
# openssl genrsa -out tls.key 2048
- 使用 tls.key 生成自簽證書
# openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=GuangDong/L=Guangzhou/O=DevOps/CN=myhttpbin.com
- 生成服務自簽信息,名字為httpbin
# kubectl create secret tls httpbin --cert=tls.crt --key=tls.key
- 創建httpbin的 deloyment, service等,代碼太多,此處忽略,創建了名字為httpbin的service。實際使用的時候這里應該部署的是你自己的服務。
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
App: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
- 配置ingress并配置tls和自簽信息(名字為httpbin):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: httpbin
namespace: default
annotations:
kubernetes.io/ingress.class: "Nginx"
spec:
tls:
- hosts:
- myhttpbin.com
secretName: httpbin
rules:
- host: myhttpbin.com
http:
paths:
- backend:
serviceName: httpbin
servicePort: 8000
path: /
關鍵代碼如下,這里指定了tls,并通過secretName的方式關聯了自簽信息:
tls:
- hosts:
- myhttpbin.com
secretName: httpbin
- 電腦主機添加/etc/hosts
172.21.92.223 myhttpbin.com
備注:172.21.92.223為Ingress controller的ip地址
- 訪問http://myhttpbin.com,則會自動重定向為https://myhttpbin.com
- 抓包,發現已經是https通信了
一行代碼沒改(真的是沒改代碼),但是如今你的服務(本例是httpbin)已經支持https的訪問方式了。
整個過程的細節如下:
總結:
在 Ingress 中配置tls將會告訴 Ingress controller 使用 TLS 加密從客戶端到后臺服務(httpbin)的通道。當客戶端(比如瀏覽器)通過http的方式訪問httpbin的時候,ingress controller會通過返回308代碼的方式讓客戶端重定向到https鏈接。
Secret的自簽證書信息是設置在ingress controller上的,因為我們看到httpbin服務本身并不支持https的方式。
最終,這種方式實現了以非侵入的方式讓你的服務支持https協議。