k8s中ingress資源的應用

Ingress實現虛擬主機的方案

環境介紹

主機 IP地址 服務
master 192.168.1.21 k8s
node01 192.168.1.22 k8s
node02 192.168.1.23 k8s

基於[ http://www.javashuo.com/article/p-wzdhboob-dy.html]() 的實驗繼續進行
node

一、首先肯定要運行ingress-nginx-controller服務。

在gitbub上找到所需的ingress的yaml文件

k8s中ingress資源的應用

k8s中ingress資源的應用

k8s中ingress資源的應用
k8s中ingress資源的應用

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

k8s中ingress資源的應用

(1)執行一下

[root@master ingress]# kubectl apply -f mandatory.yaml

(2)查看一下

[root@master ingress]# kubectl get pod -n ingress-nginx

k8s中ingress資源的應用

二、將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

k8s中ingress資源的應用

三、建立一個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

k8s中ingress資源的應用

[root@master yaml]# kubectl get svc

k8s中ingress資源的應用

而後複製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.

k8s中ingress資源的應用

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.

k8s中ingress資源的應用

[root@master yaml]# kubectl describe ingresses. ingress-1

k8s中ingress資源的應用

[root@master yaml]# kubectl describe ingresses. ingress-2

k8s中ingress資源的應用

五、因爲實驗環境限制,因此本身用來模擬-一個域名。

進入本機的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)運行所在的節點IP。

k8s中ingress資源的應用

訪問一下

[root@master yaml]# kubectl get svc -n ingress-nginx 
//查看映射的端口

k8s中ingress資源的應用

http://www1.bdqn.com:30817/nginx

k8s中ingress資源的應用

http://www2.bdqn.com:30817/git

k8s中ingress資源的應用

總結上述示例的pod是如何一步一步可使client訪問到的,總結以下:

後端pod===》service====》ingress規則====》寫入Ingress-nginx-controller配置文件並自動重載使更改生效===》對本機進行域名解析====》實現client經過域名的IP+端口均可以訪問到後端podgithub

Ingress資源實現https代理安全訪問。

在上面的操做中,實現了使用ingress-nginx爲後端全部pod提供一個統一的入口,那麼,有一個很是嚴肅的問題須要考慮,就是如何爲咱們的pod配置CA證書來實現HTTPS訪問?在pod中直接配置CA麼?那須要進行多少重複性的操做?並且,pod是隨時可能被kubelet殺死再建立的。固然這些問題有不少解決方法,好比直接將CA配置到鏡像中,可是這樣又須要不少個CA證書。web

這裏有更簡便的一種方法,就拿上面的狀況來講,後端有多個pod,pod與service進行關聯,service又被ingress規則發現並動態寫入到ingress-nginx-controller容器中,而後又爲ingress-nginx-controller建立了一個Service映射到羣集節點上的端口,來供client來訪問。vim

k8s中ingress資源的應用

在上面的一系列流程中,關鍵的點就在於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"
//生成證書

k8s中ingress資源的應用

2. 建立secret資源, 保存證書。

[root@master https]# kubectl create secret tls tls-secret --key=tls.key --cert tls.crt

三、建立一個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

k8s中ingress資源的應用

[root@master https]# kubectl get svc

k8s中ingress資源的應用

四、建立對應的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.

k8s中ingress資源的應用

5.查找對應service nodePort的443端口映射的端口,直接用瀏覽器訪問便可。

進入本機的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)運行所在的節點IP。

k8s中ingress資源的應用

查看映射端口

[root@master https]# kubectl get svc -n ingress-nginx

k8s中ingress資源的應用

https://www3.bdqn.com:31372/api

k8s中ingress資源的應用

k8s集羣利用了「一切皆爲資源」的原理,把生成的ca證書當成一個公共的資源來使用,使用時只需綁定保存的ca證書便可,不像以前同樣,須要一個一個的建立ca證書,而後在關聯起來,方便好用又快捷。瀏覽器

相關文章
相關標籤/搜索