Ingress實現虛擬主機的方案
環境介紹
主機 | IP地址 | 服務 |
---|---|---|
master | 192.168.1.21 | k8s |
node01 | 192.168.1.22 | k8s |
node02 | 192.168.1.23 | k8s |
基於[ https://blog.51cto.com/14320361/2464655]() 的實驗繼續進行
1、首先確定要運行ingress-nginx-controller服務。
在gitbub上找到所需的ingress的yaml文件
4. master下載
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml
5. 修改 mandatory.yaml 文件
[root@master ingress]# vim mandatory.yaml
hostNetwork: true #213
(1)執行一下
[root@master ingress]# kubectl apply -f mandatory.yaml
(2)查看一下
[root@master ingress]# kubectl get pod -n ingress-nginx
2、將ingress-nginx-controller暴露爲一個Service資源對象。
[root@master yaml]# vim service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
(1)執行一下
[root@master ingress]# kubectl apply -f service-nodeport.yaml
(2)查看一下
[root@master ingress]# kubectl get svc -n ingress-nginx
3、創建一個deployment資源,和一個service資源, 並相互關聯。
[root@master yaml]# vim deploy1.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deploy1
spec:
replicas: 2
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx1
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
app: nginx1
ports:
- port: 80
targetPort: 80
執行一下
[root@master yaml]# kubectl apply -f deploy1.yaml
查看一下
[root@master yaml]# kubectl get pod
[root@master yaml]# kubectl get svc
然後複製deploy1.yaml資源工創建另外”一對“服務。
[root@master yaml]# vim deploy2.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deploy2
spec:
replicas: 2
template:
metadata:
labels:
app: nginx2
spec:
containers:
- name: nginx2
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: nginx2
ports:
- port: 80
targetPort: 80
執行一下
[root@master yaml]# kubectl apply -f deploy2.yaml
查看一下
[root@master yaml]# kubectl get deployments.
4. 創建ingress的yaml文件,關聯是svc1和svc2
[root@master yaml]# vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-1
spec:
rules:
- host: www1.bdqn.com
http:
paths:
- path: /
backend:
serviceName: svc-1
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-2
spec:
rules:
- host: www2.bdqn.com
http:
paths:
- path: /
backend:
serviceName: svc-2
servicePort: 80
執行一下
[root@master yaml]# kubectl apply -f ingress.yaml
查看一下
[root@master yaml]# kubectl get ingresses.
[root@master yaml]# kubectl describe ingresses. ingress-1
[root@master yaml]# kubectl describe ingresses. ingress-2
5、由於實驗環境限制,所以自己用來模擬-一個域名。
進入本機的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)運行所在的節點IP。
訪問一下
[root@master yaml]# kubectl get svc -n ingress-nginx
//查看映射的端口
總結上述示例的pod是如何一步一步可以使client訪問到的,總結如下:
後端pod===》service====》ingress規則====》寫入Ingress-nginx-controller配置文件並自動重載使更改生效===》對本機進行域名解析====》實現client通過域名的IP+端口都可以訪問到後端pod
Ingress資源實現https代理安全訪問。
在上面的操作中,實現了使用ingress-nginx爲後端所有pod提供一個統一的入口,那麼,有一個非常嚴肅的問題需要考慮,就是如何爲我們的pod配置CA證書來實現HTTPS訪問?在pod中直接配置CA麼?那需要進行多少重複性的操作?而且,pod是隨時可能被kubelet殺死再創建的。當然這些問題有很多解決方法,比如直接將CA配置到鏡像中,但是這樣又需要很多個CA證書。
這裏有更簡便的一種方法,就拿上面的情況來說,後端有多個pod,pod與service進行關聯,service又被ingress規則發現並動態寫入到ingress-nginx-controller容器中,然後又爲ingress-nginx-controller創建了一個Service映射到羣集節點上的端口,來供client來訪問。
在上面的一系列流程中,關鍵的點就在於ingress規則,我們只需要在ingress的yaml文件中,爲域名配置CA證書即可,只要可以通過HTTPS訪問到域名,至於這個域名是怎麼關聯到後端提供服務的pod,這就是屬於k8s羣集內部的通信了,即便是使用http來通信,也無傷大雅。
1. 生成證書
[root@master yaml]# mkdir https
//創建一個放置證書的目錄
[root@master yaml]# cd https/
[root@master https]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=testsvc /O=testsvc"
//生成證書
2. 創建secret資源, 保存證書。
[root@master https]# kubectl create secret tls tls-secret --key=tls.key --cert tls.crt
3、創建一個deploy3.yaml文件,模擬一個web服務。
[root@master yaml]# vim deploy3.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deploy3
spec:
replicas: 2
template:
metadata:
labels:
app: nginx3
spec:
containers:
- name: nginx3
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: nginx3
ports:
- port: 80
targetPort: 80
執行一下
[root@master https]# kubectl apply -f deploy3.yaml
查看一下
[root@master https]# kubectl get pod
[root@master https]# kubectl get svc
4、創建對應的ingress規則。
[root@master https]# vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-3
spec:
tls:
- hosts:
- www3.bdqn.com #域名
secretName: tls-secret #保存的證書
rules:
- host: www3.bdqn.com
http:
paths:
- path: /
backend:
serviceName: svc-3
servicePort: 80
執行一下
[root@master https]# kubectl apply -f ingress.yaml
查看一下
[root@master https]# kubectl get ingresses.
5.查找對應service nodePort的443端口映射的端口,直接用瀏覽器訪問即可。
進入本機的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)運行所在的節點IP。
查看映射端口
[root@master https]# kubectl get svc -n ingress-nginx
k8s集羣利用了“一切皆爲資源”的原理,把生成的ca證書當成一個公共的資源來使用,使用時只需綁定保存的ca證書即可,不像之前一樣,需要一個一個的創建ca證書,然後在關聯起來,方便好用又快捷。