8. kubernetes ingress和ingerss Controller

8. kubernetes ingress和ingerss Controller

[TOC]

本文基于馬哥的docker和k8s視頻總結(jié), 在此致謝馬哥.

  • 卸載四層以上會話, 例如SSL
  • Ingress controller => 入口控制器, 擁有七層代理和調(diào)度能力的應(yīng)用程序(其實是一個pod)
    • Nginx
    • Traefik
    • Envoy
  • Ingress資源

如何在kubernetes上實現(xiàn)七層調(diào)度?

  1. 先部署一個Ingress Controller
  2. 根據(jù)自己的需要配置(虛擬主機或url代理)前端
  3. 根據(jù)service收集到的后端pod的IP定義成upstream server并反映在Ingress
  4. Ingress動態(tài)注入到Ingress Controller
ingress controller.png

如何部署一個Ingress?

kubernetes ingress-nginx-controller-架構(gòu).png
kubectl explain ing.spec
    # backend <object> 定義后端有哪些主機
    # rules <[]object> 定義規(guī)則
    # tls <[]object> 定義https時才使用此參數(shù), 用于卸載7層會話

kubectl explain ing.spec.rules
    # host  <string> 定義虛擬主機
    # http.paths    <[]Object> -required- 定義url

kubectl explain ing.spec.backend
    # serviceName   <string> -required- 定義后端pod的名稱
    # servicePort   <string> -required- 定義后端pod的端口

nginx ingress controller

使用github上關(guān)于ingress的項目: https://github.com/kubernetes/ingress-nginx

# 1.創(chuàng)建文件放置目錄
mkdir ~/ingress-nginx ; cd ~/ingress-nginx

# 2. 下載需要使用的yaml文件, 注意使用raw格式的url
for file in namespace.yaml configmap.yaml rbac.yaml with-rbac.yaml;do wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/$file; done

# 3. 分別創(chuàng)建
kubectl apply -f namespace.yaml # 注意必須要首先創(chuàng)建名稱空間
kubectl apply -f ./ # apply可以針對目錄進行, 它會自動引用目錄下所有文件

# 注: 第2, 3步可以替換為引用mantadory.yaml文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
# 4. 查看ingress-nginx的pod是否被創(chuàng)建, 注意指明名稱空間
kubectl get pods -n ingress-nginx
NAME                                      READY STATUS            RESTARTS AGE
nginx-ingress-controller-79f6884cf6-g8x5h 0/1   ContainerCreating 0        77s
    # 注: 這一步下載的nginx-ingress-controller非常慢, 我第一次下載鏡像, 創(chuàng)建pod花了40分鐘
    # 記錄下載的鏡像名與版本:
    # quay.io/kubernetes-ingress-controller/nginx-ingress-controller   0.25.1                     0439eb3e11f1        3 weeks ago         511MB

# 用以下命令查看pod情況, 注意指明名稱空間!
kubectl describe pods nginx-ingress-controller-79f6884cf6-g8x5h -n ingress-nginx

# 直接連入ingress-controller中查看配置情況
kubectl exec -it -n ingress-nginx nginx-ingress-controller-79f6884cf6-g8x5h -- /bin/sh
# 5. 創(chuàng)建后端被代理的服務(wù)service并使用
vi deploy-demo.yml
apiVersion: v1
kind: Service
metadata:
    name: myapp
    namespace: default
spec:
    selector:
        app: nginx
        release: canary
    ports:
    - name: http
        port: 80
        targetPort: 80
--- # 注意一定要使用三個橫線來分割
apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deploy
    namespace: default
spec:
    replicas: 2
    selecotr:
        matchLabels:
            app: nginx
            release: canary
    template:
        metadata:
            labels:
                app: nginx
                release: canary
        spec:
            containers:
            - name: nginx-container
                image: nginx:1.14-alpine
                ports:
                - name: http
                    containerPort: 80
kubectl apply -f deploy-demo.yml
# 6. 創(chuàng)建Service接入集群外部流量
# 也可以直接共享node的網(wǎng)絡(luò)名稱空間, 但需要手動改造配置文件with-rbac.yaml, 
# 將Deployment改為daemonSet, 去掉replicas并修改一些對應(yīng)配置, 最重要的是
# 在template.spec中添加一項配置: hostNetwork
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml

vi 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
      nodePort: 30080 # 可自定義節(jié)點對外暴露的端口
      protocol: TCP 
    - name: https
      port: 443 
      targetPort: 443 
      nodePort: 30443 # 可自定義節(jié)點對外暴露的端口
      protocol: TCP 
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
kubectl apply -f service-nodeport.yaml
# 7. 創(chuàng)建Ingress
vi ingress-demo.yaml

可以使用虛擬主機(主機名)的方式進行定義:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: ingress-test
    namespace: default # 與Deployment和Service應(yīng)屬于同一個名稱空間
    annotations:
        kubernetes.io/ingress.class: "nginx" # 寫明使用nginx類型的ingress-controller
spec:
    rules:
    - host: myapp.test.com # 定義外部能夠通過DNS解析到的主機名
        http:
            paths:
            - path: # 前端使用url進行映射, 可以為空(此時會使用根"/")
                backend: # 映射到的后端, 會根據(jù)后面哪些pod來生成upstream
                    serviceName: myapp
                    servicePort: 80

也可以使用url的方式進行定義, 以下為示例

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: ingress-test
    annotations: # 此項非常重要, 指明使用的ingress-controller類型
        nginx.ingress.kubernetes.io/rewrite-target: /
spec:
    rules:
    - http:
        paths:
        - path: /testpath
            backend:
                serviceName: myapp
                servicePort: 80
kubectl apply -f ingress-demo.yml

# 8. 外部訪問測試
https://192.168.200.201:30080

記錄一個實操成功的案例配置

mkdir ~/ingress-nginx ; cd ~/ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

vi 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
      nodePort: 30080
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
kubectl apply -f service-nodeport.yaml
vi tomcat-deploy.yml
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  selector:
    app: tomcat
    release: test
  ports:
  - name: http
    port: 8080
    targetPort: 8080

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat
      release: test
  template:
    metadata:
      labels:
        app: tomcat
        release: test
    spec:
      containers:
      - name: tomcat-container
        image: tomcat:8-alpine
        ports:
        - name: http
          containerPort: 8080
kubectl apply -f tomcat-deploy.yml
vi tomcat-ingress.yml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tomcat-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: node2
    http:
      paths:
      - path:
        backend:
          serviceName: myapp
          servicePort: 8080
kubectl apply -f tomcat-ingress.yml
# 測試: 在宿主機上先做好DNS解析, 然后使用瀏覽器訪問http://虛擬機ip:8080, 可查看到在容器中運行的tomcat服務(wù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楣号,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奠货,更是在濱河造成了極大的恐慌,老刑警劉巖蕊退,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拌滋,死亡現(xiàn)場離奇詭異,居然都是意外死亡夫晌,警方通過查閱死者的電腦和手機泣棋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門胶哲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潭辈,你說我怎么就攤上這事鸯屿。” “怎么了把敢?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵寄摆,是天一觀的道長。 經(jīng)常有香客問我修赞,道長婶恼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮勾邦,結(jié)果婚禮上蚣录,老公的妹妹穿的比我還像新娘。我一直安慰自己眷篇,他們只是感情好萎河,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布牍陌。 她就那樣靜靜地躺著大年,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椎椰,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音沾鳄,去河邊找鬼慨飘。 笑死,一個胖子當(dāng)著我的面吹牛译荞,可吹牛的內(nèi)容都是我干的瓤的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吞歼,長吁一口氣:“原來是場噩夢啊……” “哼圈膏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起篙骡,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稽坤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糯俗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尿褪,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年得湘,在試婚紗的時候發(fā)現(xiàn)自己被綠了杖玲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡淘正,死狀恐怖摆马,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸿吆,我是刑警寧澤囤采,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站伞剑,受9級特大地震影響斑唬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一恕刘、第九天 我趴在偏房一處隱蔽的房頂上張望缤谎。 院中可真熱鬧,春花似錦褐着、人聲如沸坷澡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽频敛。三九已至,卻和暖如春馅扣,著一層夾襖步出監(jiān)牢的瞬間斟赚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工差油, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拗军,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓蓄喇,卻偏偏與公主長得像发侵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妆偏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容