kubernetes從入門到精通系列09-ingress 控制器

kubernetes從入門到精通系列目錄:


kubernetes從入門到精通系列09-ingress 控制器


如果 k8s 需要提供一個網站,並且這個站點需要以 https 訪問,而 iptables/ipvs 工作在 4 層,客戶發出的 ssl 請求根本不被解析就被調度到後端 POD了。解決方法有兩個:

  1. 可以在公有云的負載均衡器上配置上 ssl 證書。
  2. 新建一個負載均衡器的 POD ,例如 nignx ,這個 POD 共享主機的網絡命名空間,也就是說可以直接通過 nodeip 訪問到負載均衡器,ssl 證書配置在這個負載均衡器上,對外連接為 https 而對內的代理為 http 協議到 POD 網絡的 POD 上。
  • 存在的問題
<code>- 負載均衡器 POD 使用節點的網絡名稱空間, 那麼它只   能在這個 node 節點上運行一個了,否則就出現端口衝突
- 負載均衡器是代理 POD 卸載 ssl 證書的關鍵節點, 它不能只運行一個, 它需要在所有節點運行一個
/<code>
  • 解決方法
<code>- 負載均衡器使用 DaemonSet 在每個 node 節點運行一個,代理請求至 POD 網絡的中的 POD 上 

- 如果集群節點非常的多,其實不必在每個 node 節點都必須運行一個負載均衡器 POD
- 控制負載均衡器 POD 運行的數量可以通過 lables 指定運行那幾個 node 節點上
- 然後可以在負載均衡器 POD 所在的 node 節點上打上 "汙點" 使其他的 POD 不會再被調度上來, 而只有負載均衡器 POD 可以容忍這些 "汙點"
/<code>
  • 負載均衡器可選,按照優先級先後排序
<code>Envoy            # 雲原生高性能服務代理,已從cncf畢業
Traefik # 為微服務而生的反向代理
Nginx # 改造後可以適用於微服務環境
HAproxy # 不推薦使用
/<code>

新建一個 service 將需要代理的不同服務的 pod 分類

新建一個 ingress 資源,從 service 中取得分類結果,映射進 Envoy 中,重載 Envoy 軟件。

9.1 ingress.spec 規範

  • API 和 kind
<code>apiVersion: extensions

kind: ingress
/<code>
  • ingress.spec
<code>backend         # 後端有哪些 POD
rules # 調度規則
host # 虛擬主機
http # http 路徑
/<code>

9.2 ingress-nginx 代理

  • 後端 service 和 pods
<code>apiVersion: v1
kind: Service
metadata:
name: service-ingress-myapp
namespace: default
spec:
selector:
app: myapp
release: canary
ports:
- name: http
port: 80
targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 4
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary

spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
/<code>
  • 創建 ingress-nginx
<code>kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.21.0/deploy/mandatory.yaml
/<code>
  • 讓 ingress-nginx 在集群外部訪問
<code>kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.21.0/deploy/provider/baremetal/service-nodeport.yaml
/<code>
  • 創建 ingress 對象,它能將 ingress-nginx 與 service 關聯,從而在 service 後主機發生變動的時候,反應在 ingress-nginx 這個容器的配置文件中
<code>apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-deploy-myapp
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: myapp.kaliarch.com # 基於主機名的訪問
http:
paths:
- path: # 空的時候代表根,訪問根的時候映射到 backend
backend: # 後端的 service 的配置
serviceName: service-ingress-myapp # 關聯 service 從而獲取到後端主機的變動

servicePort: 80 # 關聯 service 的地址
/<code>
  • 查看 ingress-nginx 對外暴露的端口,這裡為30080,和 30443 兩個
<code>kubectl get service -n ingress-nginx
/<code>
  • 使用 nodeip + ingress-nginx 暴露端口訪問,由於上面創建的 ingress 為基於主機名稱的,所以需要在訪問時在 /etc/hosts 做好映射到 node。
<code>http://myapp.kaliarch.com:30080/index.html
/<code>

9.3 ingress-tomcat 代理

  • 後端 service 和 pods
<code>apiVersion: v1
kind: Service
metadata:
name: service-ingress-tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: http
port: 8080
targetPort: http
- name: ajp
port: 8009
targetPort: ajp

---
apiVersion: apps/v1
kind: Deployment
metadata:

name: deploy-tomcat
namespace: default
spec:
replicas: 4
selector:
matchLabels:
app: tomcat
release: canary
template:
metadata:
labels:
app: tomcat
release: canary
spec:
containers:
- name: tomcat
image: tomcat:8.5.32-jre8-alpine
ports:
- name: http
containerPort: 8080
- name: ajp
containerPort: 8009
/<code>
  • 製作自簽名證書,讓 ingress-nginx 帶有證書來訪問
<code># 生成 key
openssl genrsa -out tls.key 2048

# 生成自簽證書,CN=域名必須要與自己的域名完全一致
openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=tomcat.kaliarch.com
/<code>
  • 創建 secret 證書對象,它是標準的 k8s 對象
<code>kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
/<code>
  • 創建帶證書的 ingress 對象,它能將 ingress-tomcat 與 service 關聯,從而在 service 後主機發生變動的時候,反應在 ingress-tomcat 這個容器的配置文件中
<code>apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-deploy-tomcat-tls
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- tomcat.kaliarch.com
secretName: tomcat-ingress-secret
rules:
- host: tomcat.kaliarch.com
http:
paths:
- path:
backend:
serviceName: service-ingress-tomcat
servicePort: 8080
/<code>
  • 查看 ingress-nginx 對外暴露的端口,這裡為30080,和 30443 兩個
<code>kubectl get service -n ingress-nginx
/<code>
  • 使用 nodeip + ingress-nginx 暴露端口訪問,由於上面創建的 ingress 為基於主機名稱的,所以需要在訪問時在 /etc/hosts 做好映射到 node。
<code>https://tomcat.kaliarch.com:30443/<code>


分享到:


相關文章: