自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

五分鐘K8S實(shí)戰(zhàn)-使用Ingress

網(wǎng)絡(luò) 網(wǎng)絡(luò)優(yōu)化
Ingress 通常是充當(dāng)網(wǎng)關(guān)的作用,后續(xù)我們?cè)谑褂?Istio 時(shí),也可以使用 Istio 所提供的控制器來替換掉 Ingress-nginx,可以更方便的管理內(nèi)外網(wǎng)流量。

背景

技術(shù)、生活、觀點(diǎn)、原創(chuàng)。 原創(chuàng)公眾號(hào); 主要關(guān)注 Go、JVM、并發(fā)、分布式、網(wǎng)絡(luò)等相關(guān)技術(shù)。

前兩章中我們將應(yīng)用部署到了 k8s 中,同時(shí)不同的服務(wù)之間也可以通過 service 進(jìn)行調(diào)用,現(xiàn)在還有一個(gè)步驟就是將我們的應(yīng)用暴露到公網(wǎng),并提供域名的訪問。

這一步類似于我們以前配置 Nginx 和綁定域名,提供這個(gè)能力的服務(wù)在 k8s 中成為 Ingress。

通過這個(gè)描述其實(shí)也能看出 Ingress 是偏運(yùn)維的工作,但也不妨礙我們作為研發(fā)去了解這部分的內(nèi)容;了解整個(gè)系統(tǒng)是如何運(yùn)轉(zhuǎn)的也是研發(fā)應(yīng)該掌握的技能。

安裝 Ingress 控制器

在正式使用 Ingress 之前需要給 k8s 安裝一個(gè) Ingress 控制器,我們這里安裝官方提供的 Ingress-nginx 控制器。

當(dāng)然還有社區(qū)或者企業(yè)提供的各種控制器:

圖片圖片

有兩種安裝方式: helm 或者是直接 apply 一個(gè)資源文件。

關(guān)于 helm 我們會(huì)在后面的章節(jié)單獨(dú)講解。

這里就直接使用資源文件安裝即可,我已經(jīng)上傳到 GitHub 可以在這里訪問:https://github.com/crossoverJie/k8s-combat/blob/main/deployment/ingress-nginx.yaml

其實(shí)這個(gè)文件也是直接從官方提供的復(fù)制過來的,也可以直接使用這個(gè)路徑進(jìn)行安裝:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

yaml 文件的內(nèi)容是一樣的。

不過要注意安裝之后可能容器狀態(tài)一直處于 Pending 狀態(tài),查看容器的事件時(shí)會(huì)發(fā)現(xiàn)鏡像拉取失敗。

k describe pod ingress-nginx-controller-7cdfb9988c-lbcst -n ingress-nginx

describe 是一個(gè)用于查看 k8s 對(duì)象詳細(xì)信息的命令。

在剛才那份 yaml 文件中可以看到有幾個(gè)鏡像需要拉取,我們可以先在本地手動(dòng)拉取鏡像:

圖片圖片

docker pull registry.k8s.io/ingress-nginx/controller:v1.8.2

如果依然無法拉取,可以嘗試配置幾個(gè)國(guó)內(nèi)鏡像源鏡像拉?。?/p>

圖片圖片

我這里使用的 docker-desktop 自帶的 k8s,推薦讀者朋友也使用這個(gè)工具。

創(chuàng)建 Ingress

使用剛才的 yaml 安裝成功之后會(huì)在 ingress-nginx 命名空間下創(chuàng)建一個(gè) Pod,通過 get 命令查看狀態(tài)為 Running 即為安裝成功。

$ k get pod -n ingress-nginx
NAME                            READY   STATUS    RESTARTS      AGE
ingress-nginx-controller-7cdf   1/1     Running   2 (35h ago)   3d

Namespace 也是 k8s 內(nèi)置的一個(gè)對(duì)象,可以簡(jiǎn)單理解為對(duì)資源進(jìn)行分組管理,我們通??梢允褂盟鼇韰^(qū)分各個(gè)不同的環(huán)境,比如 dev/test/prod 等,不同命名空間下的資源不會(huì)互相干擾,且相互獨(dú)立。

之后便可以創(chuàng)建 Ingress 資源了:

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
  name: k8s-combat-ingress  
spec:  
  ingressClassName: nginx  
  rules:  
    - host: www.service1.io  
      http:  
        paths:  
          - backend:  
              service:  
                name: k8s-combat-service  
                port:  
                  number: 8081  
            path: /  
            pathType: Prefix  
    - host: www.service2.io  
      http:  
        paths:  
          - backend:  
              service:  
                name: k8s-combat-service-2  
                port:  
                  number: 8081  
            path: /  
            pathType: Prefix

看這個(gè)內(nèi)容也很容易理解,創(chuàng)建了一個(gè) Ingress 的對(duì)象,其中的重點(diǎn)就是這里的規(guī)則是如何定義的。

在 k8s 中今后還會(huì)接觸到各種不同的 Kind。

這里的 ingressClassName: nginx   也是在剛開始安裝的控制器里定義的名字,由這個(gè)資源定義。

apiVersion: networking.k8s.io/v1  
kind: IngressClass  
metadata:  
  labels:  
    app.kubernetes.io/component: controller  
    app.kubernetes.io/instance: ingress-nginx  
    app.kubernetes.io/name: ingress-nginx  
    app.kubernetes.io/part-of: ingress-nginx  
    app.kubernetes.io/version: 1.8.2  
  name: nginx

咱們這個(gè)規(guī)則很簡(jiǎn)單,就是將兩個(gè)不同的域名路由到兩個(gè)不同的 service。

這里為了方便測(cè)試又創(chuàng)建了一個(gè) k8s-combat-service-2 的 service,和 k8s-combat-service 是一樣的,只是改了個(gè)名字而已。

測(cè)試

也是為了方便測(cè)試,我在應(yīng)用鏡像中新增了一個(gè)接口,用于返回當(dāng)前 Pod 的 hostname。

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {  
   name, _ := os.Hostname()  
   fmt.Fprint(w, name)  
})

由于我實(shí)際并沒有 www.service1.io/www.service2.io 這兩個(gè)域名,所以只能在本地配置 host 進(jìn)行模擬。

10.0.0.37 www.service1.io
10.0.0.37 www.service2.io

我測(cè)試所使用的 k8s 部署在我家里一臺(tái)限制的 Mac 上,所以這里的 IP 它的地址。

當(dāng)我們反復(fù)請(qǐng)求兩次這個(gè)接口,會(huì)拿到兩個(gè)不同的 hostname,也就是將我們的請(qǐng)求輪訓(xùn)負(fù)載到了這兩個(gè) service 所代理的兩個(gè) Pod 中。

? curl http://www.service1.io/
k8s-combat-service-79c5579587-b6nlj%
? curl http://www.service1.io/
k8s-combat-service-79c5579587-bk7nw%
? curl http://www.service2.io/
k8s-combat-service-2-7bbf56b4d9-dkj9b%
? curl http://www.service2.io/
k8s-combat-service-2-7bbf56b4d9-t5l4g

我們也可以直接使用 describe 查看我們的 ingress 定義以及路由規(guī)則:

圖片圖片

$ k describe ingress k8s-combat-ingress
Name:             k8s-combat-ingress
Labels:           <none>
Namespace:        default
Address:          localhost
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host             Path  Backends
  ----             ----  --------
  www.service1.io
                   /   k8s-combat-service:8081 (10.1.0.65:8081,10.1.0.67:8081)
  www.service2.io
                   /   k8s-combat-service-2:8081 (10.1.0.63:8081,10.1.0.64:8081)
Annotations:       <none>
Events:            <none>

如果我們手動(dòng)新增一個(gè)域名解析:

10.0.0.37 www.service3.io
? curl http://www.service3.io/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

會(huì)直接 404,這是因?yàn)闆]有找到這個(gè)域名的規(guī)則。

訪問原理

圖片圖片

整個(gè)的請(qǐng)求路徑如上圖所示,其實(shí)我們的 Ingress 本質(zhì)上也是一個(gè) service(所以它也可以啟動(dòng)多個(gè)副本來進(jìn)行負(fù)載),只是他的類型是 LoadBalancer,通常這種類型的 service 會(huì)由云廠商綁定一個(gè)外部 IP,這樣就可以通過這個(gè)外部 IP 訪問 Ingress 了。

而我們應(yīng)用的 service 是 ClusterIP,只能在應(yīng)用內(nèi)部訪問。

圖片圖片

通過 service 的信息也可以看到,我們 ingress 的 service 綁定的外部 IP 是 localhost(本地的原因)。

總結(jié)

Ingress 通常是充當(dāng)網(wǎng)關(guān)的作用,后續(xù)我們?cè)谑褂?Istio 時(shí),也可以使用 Istio 所提供的控制器來替換掉 Ingress-nginx,可以更方便的管理內(nèi)外網(wǎng)流量。

本文的所有源碼在這里可以訪問:https://github.com/crossoverJie/k8s-combat

責(zé)任編輯:武曉燕 來源: crossoverJie
相關(guān)推薦

2023-11-27 13:54:00

kubernetes高可用

2023-11-15 13:44:00

k8s-域名日志

2020-02-19 19:26:27

K8S開源平臺(tái)容器技術(shù)

2023-09-27 08:09:22

2023-11-30 08:08:30

k8s優(yōu)雅停機(jī)

2023-09-21 11:28:28

Kubernetes云原生

2023-09-18 15:49:40

Ingress云原生Kubernetes

2021-03-12 08:20:24

架構(gòu)網(wǎng)絡(luò)模型

2023-09-27 22:33:40

KubernetesK8S

2023-12-25 08:05:35

2023-09-24 22:47:42

Kubernetes親和性

2024-01-29 13:03:02

2021-08-10 07:57:57

k8s Nginx IngrNginx

2023-09-06 08:12:04

k8s云原生

2009-11-16 10:53:30

Oracle Hint

2024-12-11 07:00:00

面向?qū)ο?/a>代碼

2025-03-13 06:22:59

2017-09-27 11:00:50

LinuxBash使用技巧

2020-06-16 08:47:53

磁盤

2024-01-12 08:03:29

k8s配置持久化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)