網(wǎng)站首頁 編程語言 正文
Ingress概念:
通俗來講:Ingress和之前說的Service、Deployment一樣,也是一個k8s的資源類型;Ingress用于實現(xiàn)域名的方式訪問k8s的內(nèi)部應(yīng)用,Service可能更適于服務(wù)間訪問。
這東西我們使用的k8s官方維護的本版,另外nginx官方也有一個版本,怎么用看個人。
Ingress支持多種方案:包括 Nginx、Haproxy、Traefik、istio等;在實際中Ingress上面可能還有一層公司的硬件層代理。
大概的流程圖如下:
創(chuàng)建一個Ingress:
這個ingress使用Hlem方式創(chuàng)建,以后會寫一篇helm的使用,現(xiàn)在不用管原理。
所需資源準備:
Ingress-nginx使用的兩個容器鏡像下載地址:
鏡像地址:registry.cn-hangzhou.aliyuncs.com
鏡像:yyangs/ingress-nginx-controller;yyangs/ingress-nginx-kube-webhook-certgen
chart包:ingress-nginx-4.0.17
首先我們先創(chuàng)建一個Helm(因為要使用helm創(chuàng)建)
[root@k8s-master01 ~]# wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz [root@k8s-master01 ~]# tar xf helm-v3.8.0-linux-amd64.tar.gz [root@k8s-master01 ~]# mv linux-amd64/helm /usr/local/bin/helm
創(chuàng)建一個倉庫 ,方便安裝ingress:ingress的APP VERSION版本最好要大于0.35,查看其下可用的包
[root@k8s-master01 ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx "ingress-nginx" has been added to your repositories [root@k8s-master01 ~]# helm repo list NAME URL ingress-nginx https://kubernetes.github.io/ingress-nginx [root@k8s-master01 ~]# helm search repo ingress-nginx NAME CHART VERSION APP VERSION DESCRIPTION ingress-nginx/ingress-nginx 4.0.17 1.1.1 Ingress controller for Kubernetes using NGINX a...
下載ingress包,將包解壓到一個創(chuàng)建的目錄中方便修改配置
[root@k8s-master01 ~]# helm pull ingress-nginx/ingress-nginx ingress-nginx-4.0.17.tgz [root@k8s-master01 ~]# mkdir /temp [root@k8s-master01 ~]# mv ingress-nginx-4.0.17.tgz /temp/ [root@k8s-master01 ~]# cd /temp/ [root@k8s-master01 temp]# tar xf ingress-nginx-4.0.17.tgz # 進到ingress-nginx目錄 [root@k8s-master01 temp]# cd ingress-nginx/
修改values.yaml,基本每一行都代表一個位置
# 源位置 controller: name: controller image: registry: registry.cn-hangzhou.aliyuncs.com image: yyangs/ingress-nginx-controller ## digest: sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de # dns策略 dnsPolicy: ClusterFirstWithHostNet # 使用宿主機端口號,性能好 hostNetwork: true # 資源類型選擇DaemonSet,會在指定節(jié)點上部署 kind: DaemonSet # 在有標簽的node上部署 nodeSelector: kubernetes.io/os: linux ingress: "true" # 類型,本地環(huán)境使用 type: ClusterIP # 最后位置的另一處源位置 patch: enabled: true image: registry: registry.cn-hangzhou.aliyuncs.com image: yyangs/ingress-nginx-kube-webhook-certgen ## digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
對上面的修改做一些說明:
鏡像源:他默認源是國外的,我們訪問不到。所以我替換成了我的阿里源,如果做這個實驗的小伙伴可以用我的源;最后一處的源也一樣;注意把校驗注釋
使用hostNetwork: true創(chuàng)建,配合資源類型選擇DaemonSet性能更好
dns策略:如果使用hostNetwork,策略需要改成dnsPolicy: ClusterFirstWithHostNet
執(zhí)行yaml文件創(chuàng)建
# 創(chuàng)建一個命名空間 [root@k8s-master01 ingress-nginx]# kubectl create ns ingress-nginx namespace/ingress-nginx created # 因為要在指定node上創(chuàng)建,所以給一臺機器創(chuàng)建一個標簽 [root@k8s-master01 ingress-nginx]# kubectl label nodes k8s-master03 ingress=true node/k8s-master03 labeled # 執(zhí)行helm創(chuàng)建,那個名稱自定義,之前出了一點問題,所以換個名字。 [root@k8s-master01 ~]# cd /temp/ingress-nginx/ 您在 /var/spool/mail/root 中有新郵件 [root@k8s-master01 ingress-nginx]# helm install nginx-ingress -n ingress-nginx . [root@k8s-master01 temp]# kubectl get pod -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ingress-ingress-nginx-controller-lrs9s 1/1 Running 0 22h 192.168.10.4 k8s-master03
可以看到這個Pod已經(jīng)起來了,并且部署在master03節(jié)點上,也就是有ingress=ture
標簽的節(jié)點上,這樣對ingress進行擴容或縮容的時候就會方便很多。
比如當你想擴容的時候只需要在想擴容的節(jié)點打上對應(yīng)的標簽,就會自動部署一個新的Pod,就像下面這條命令。
kubectl label node k8s-master02 ingress=true
當我不想要這個Pod的時候,縮容也會比較簡單,去掉標簽就可以了,可以看出標簽的強大之處,減號等于刪除標簽的意思。
kubectl label node k8s-master02 ingress-
hostNetwork方式部署的ingress,會在宿主機啟動一個進程,我們?nèi)ゲ渴餚od的節(jié)點看一下,
[root@k8s-master03 ~]# ss -tpln | grep 80 LISTEN 0 16384 192.168.10.4:2380 *:* users:(("etcd",pid=1703,fd=7)) LISTEN 0 16384 *:80 *:* users:(("nginx",pid=106434,fd=19),("nginx",pid=106427,fd=19)) LISTEN 0 16384 *:80 *:* users:(("nginx",pid=106433,fd=11),("nginx",pid=106427,fd=11)) LISTEN 0 16384 [::]:80 [::]:* users:(("nginx",pid=106433,fd=12),("nginx",pid=106427,fd=12)) LISTEN 0 16384 [::]:80 [::]:* users:(("nginx",pid=106434,fd=20),("nginx",pid=106427,fd=20)) [root@k8s-master03 ~]# ps aux | grep nginx root 2622 0.0 0.1 8852 5456 ? Ss 01:12 0:00 nginx: master process nginx -g daemon off; 101 2759 0.0 0.0 9272 2456 ? S 01:12 0:00 nginx: worker process 101 2760 0.0 0.0 9272 2456 ? S 01:12 0:00 nginx: worker process root 25605 0.0 0.0 112840 2292 pts/0 S+ 15:19 0:00 grep --color=auto nginx 101 106347 0.0 0.0 208 4 ? Ss 09:08 0:00 /usr/bin/dumb-init -- /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key 101 106359 0.1 1.1 743048 44956 ? Ssl 09:08 0:25 /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key 101 106427 0.0 0.9 145100 36332 ? S 09:08 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf 101 106433 0.0 1.0 157128 40848 ? Sl 09:08 0:06 nginx: worker process 101 106434 0.0 1.0 157128 41000 ? Sl 09:08 0:07 nginx: worker process 101 106435 0.0 0.7 143072 29120 ? S 09:08 0:00 nginx: cache manager process
運行之后,接下來嘗試簡單的使用:
傳統(tǒng)架構(gòu)中發(fā)布服務(wù),需要配置修改nginx的配置文件;在k8s中ingress與其他資源類型一樣,通過yaml去聲明一個ingress的實例。
官方網(wǎng)址:ingress-controller官方文檔詳細內(nèi)容可以看這。
使用官網(wǎng)上一個例子先認識一下ingress
vim ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: name: example spec: ingressClassName: nginx rules: # 可以配置多個rules - host: foo.bar.com # 域名匹配 http: paths: # 相當于nginx的location配合,同一個host可以配置多個paths - path: / pathType: Prefix backend: service: name: nginx-svc # 代理的哪個svc port: number: 80
這里說一下上面這個實例的一些說明:
從rules開始向下是定義前后端連接的規(guī)則:
host
:代表基于域名訪問,客戶端通過這個域名訪問后端資源
http.paths
:相當于nginx的location中匹配規(guī)則
pathType:Prefix
:路徑類型,路徑由“/”符號分隔為一個個元素,匹配規(guī)則為逐個元素進行前綴匹配,默認ImplementationSpecific,還有一種是Exact。
backend
:定義后端
service
:下定義后端的地址,包括代理的svc和端口號
這里我遇到一個問題:
[root@k8s-master01 ~]# kubectl create -f ingress.yaml Error from server (InternalError): error when creating "ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": service "ingress-nginx-controller-admission" not found
創(chuàng)建的時候報錯:
yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes. io"
我查看了下網(wǎng)上說應(yīng)該是刪除之前創(chuàng)建的資源時沒刪干凈。
[root@k8s-master01 ~]# kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io NAME WEBHOOKS AGE ingress-nginx-admission 1 3d
然后查看下果然有個ingress-nginx-admission
,刪除后在創(chuàng)建就成功了
[root@k8s-master01 ~]# kubectl delete -A validatingwebhookconfigurations.admissionregistration.k8s.io ingress-nginx-admission validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted
執(zhí)行ingress.yaml文件,這次就創(chuàng)建成功了。
[root@k8s-master01 ~]# kubectl create -f ingress.yaml ingress.networking.k8s.io/exmple created [root@k8s-master01 ~]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE exmplefoo.bar.com 80 10m
ingress也是可以配置多域名的
就是增加一個host實例。
# 第一個域名 - host: foo.bar.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-svc port: number: 80 # 第二個域名 - host: foo2.bar.com http: paths: - path: /test pathType: Prefix backend: service: name: nginx-svc-2 port: number: 80
然后更新yaml文件就好了
[root@k8s-master01 ~]# kubectl replace -f ingress.yaml
原文鏈接:https://yyang.blog.csdn.net/article/details/122924796
相關(guān)推薦
- 2024-02-26 啟動zabbix服務(wù)報“./zabbix_agentd: cannot execute binary
- 2023-12-22 CSS濾鏡(filter)
- 2022-10-18 Qt基于TCP實現(xiàn)客戶端與服務(wù)端的連接_C 語言
- 2022-10-23 redis如何實現(xiàn)清空緩存_Redis
- 2022-03-17 分布式數(shù)據(jù)存儲系統(tǒng)的三要素_數(shù)據(jù)庫其它
- 2022-08-03 Django框架中表單的用法_python
- 2022-07-22 UC瀏覽器兼容問題
- 2024-03-10 @Controller、@Service和@Repository注解詳解
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支