iT邦幫忙

2021 iThome 鐵人賽

DAY 26
2
DevOps

k8s 入門學習 30天系列 第 26

IT 鐵人賽 k8s 入門30天 day26 k8s Task Set up Ingress on Minikube with the NGINX Ingress Controller

前言

參考文件: https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
今天要來實作 Set up Ingress on Minikube with the NGINX Ingress Controller 這個任務

Ingress 是一個用來定義路由規則的 k8s 元件

Ingress controller 則是實作這個路由的實體

這個任務將會使用 nginx 當作 Ingress Controller

透過設定路由規則, 讓 client 端透過 HTTP URI 存取到對應的應用

佈署目標

1 啟動 minikube 的 Ingress Controller 功能

2 佈署一個 hello world 的應用

3 建立 Ingress 路由, 並且測試路由

4 建立第二個應用

5 更改路由導入第二個應用

啟動 minikube 的 Ingress Controller 功能

使用以下指令開啟 minikube 的 ingres controller 功能

minikube addons enable ingress

使用以下指令查看 enable 之後的結果

kubectl get pods -n ingress-nginx

佈署一個 hello world 的應用

使用以下指令佈署一個 hello world app

kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

使用 NodePort 的方式讓使用者可以透過 clusterIP 存取到 hello world 應用

執行以下指令

kubectl expose deployment web --type=NodePort --port=8080

使用以下指令檢查 NodePort 設定

kubectl get service web

使用以下指令讓 minikube 給予 service 一個對外 IP

minikube service web --url

透過上面的 url 從瀏覽器存取 hello world 應用

建立 Ingress 路由, 並且測試路由

建立 example-ingress.yaml 如下

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8080

上面設定內容如下

建立一個 Ingress

名稱設定為 example-ingress

設定路由規則如下

domain name 是 hello-world.info

對應到的 service 名稱是 web

對應到的 service port 是 8080

使用的 matchPath 為 Prefix

建立指令如下

kubectl apply -f example-ingress.yaml

檢查 ingress 設定使用以下指令

kubectl get ingress

設定 domain resolve 到 /etc/hosts 新增一行如下

192.168.49.2 hello-world.info

要注意的是, 這邊的 IP 是根據 kubectl get ingress 查到的那個 IP, 每個實作各有不同

驗證剛剛的設定透過以下指令

curl hello-world.info

建立第二個應用

使用以下指令佈署第2個 hello world app

kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0

使用 NodePort 的方式讓使用者可以透過 clusterIP 存取到第2個 hello world 應用

執行以下指令

kubectl expose deployment web2 --type=NodePort --port=8080

更改路由導入第二個應用

新增以下項目到 example-ingress.yaml

- path: /v2
  pathType: Prefix
  backend:
    service:
      name: web2
      port:
        number: 8080

更新之後的 example-ingress.yaml 如下

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8080
          - path: /v2
            pathType: Prefix
            backend:
              service:
                name: web2
                port:
                  number: 8080

設定說明如下:

新增路由 /v2

對應到 service 名稱 web2

對應到 service Port 8080

使用以下指令更新 Ingress 路由

kubectl apply -f example-ingress.yaml

測試設定的 Ingress 路由

測試 hello-world.info

curl hello-world.info

測試 hello-world.info/v2

curl hello-world.info/v2

清除 Ingress 佈署

kubectl delete -f example-ingress.yaml

後記

部署每個資源之前都必須理解佈署目標的架構

否則就會迷失在該怎麼處理設定

做個圖像化的架構圖是個不錯的方式


上一篇
IT 鐵人賽 k8s 入門30天 -- day25 Indexed Job for Parallel Processing with Static Work Assignment
下一篇
IT 鐵人賽 k8s 入門30天 -- day27 Communicate Between Containers in the Same Pod Using a Shared Volume
系列文
k8s 入門學習 30天30

尚未有邦友留言

立即登入留言