网站首页 > 技术文章 正文
Kubernetes系列(四)Ingress
本文主要介绍 Ingress 的入门使用。
Ingress 概述
Kubernetes 对外暴露服务(Service)主要有两种方式:NodePort,LoadBalance,此外 externalIps 也可以使各类 service 对外提供服务,但是当集群服务很多的时候,NodePort方式最大的缺点是会占用很多集群机器的端口;LB方式最大的缺点则是每个Service一个LB又有点浪费和麻烦,并且需要K8s之外的支持;而 Ingress 则只需要一个 NodePort或者一个LB就可以满足所有 Service 对外服务的需求。工作机制大致如下图:
Ingress 安装
Minikube 中自带了 Ingress 插件
- ? 安装 Ingress
PS C:\Users\yueyong> minikube addons enable ingress
? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.1
? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
Verifying ingress addon...
启动 'ingress' 插件
- ? 检查 Ingress 服务
PS C:\Users\yueyong> kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.104.16.77 <none> 80:31598/TCP,443:30962/TCP 4m39s
ingress-nginx-controller-admission ClusterIP 10.98.43.189 <none> 443/TCP 4m39s
PS C:\Users\yueyong> kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-rsdhz 0/1 Completed 0 4m49s
ingress-nginx-admission-patch-r2xt2 0/1 Completed 1 4m49s
ingress-nginx-controller-647bbc75dd-x2wld 1/1 Running 0 4m49s
- ? 查看 minikube 插件清单信息
PS C:\Users\yueyong> minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
| ADDON NAME | PROFILE | STATUS | MAINTAINER |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador | minikube | disabled | 3rd party (Ambassador) |
| auto-pause | minikube | disabled | Google |
| csi-hostpath-driver | minikube | disabled | Kubernetes |
| dashboard | minikube | disabled | Kubernetes |
| default-storageclass | minikube | enabled ? | Kubernetes |
| efk | minikube | disabled | 3rd party (Elastic) |
| freshpod | minikube | disabled | Google |
| gcp-auth | minikube | disabled | Google |
| gvisor | minikube | disabled | Google |
| headlamp | minikube | disabled | kinvolk.io |
| helm-tiller | minikube | disabled | 3rd party (Helm) |
| inaccel | minikube | disabled | InAccel <info@inaccel.com> |
| ingress | minikube | enabled ? | 3rd party (unknown) |
| ingress-dns | minikube | disabled | Google |
| istio | minikube | disabled | 3rd party (Istio) |
| istio-provisioner | minikube | disabled | 3rd party (Istio) |
| kong | minikube | disabled | 3rd party (Kong HQ) |
| kubevirt | minikube | disabled | 3rd party (KubeVirt) |
| logviewer | minikube | disabled | 3rd party (unknown) |
| metallb | minikube | disabled | 3rd party (MetalLB) |
| metrics-server | minikube | disabled | Kubernetes |
| nvidia-driver-installer | minikube | disabled | Google |
| nvidia-gpu-device-plugin | minikube | disabled | 3rd party (Nvidia) |
| olm | minikube | disabled | 3rd party (Operator Framework) |
| pod-security-policy | minikube | disabled | 3rd party (unknown) |
| portainer | minikube | disabled | Portainer.io |
| registry | minikube | disabled | Google |
| registry-aliases | minikube | disabled | 3rd party (unknown) |
| registry-creds | minikube | disabled | 3rd party (UPMC Enterprises) |
| storage-provisioner | minikube | enabled ? | Google |
| storage-provisioner-gluster | minikube | disabled | 3rd party (unknown) |
| volumesnapshots | minikube | disabled | Kubernetes |
|-----------------------------|----------|--------------|--------------------------------|
部署 ingress 资源
参考上一篇,将 deployment 部署的 service 通过 ingress 暴露。
- ? 创建 ingress.yaml
# 创建名为 ingress-test 的命名空间
# 版本号
apiVersion: v1
# 表明创建的种类为命名空间
kind: Namespace
# 定义资源的元数据信息,比如资源的名称、namespace、标签等信息
metadata:
#定义命名空间的名称
name: ingress-test
---
# 创建 service (一组pod 对外访问的包装)
# 版本号
apiVersion: v1
# 表明创建资源的种类为service
kind: Service
metadata:
# 定义service的名称,在同一namespace中必须是唯一的
name: nginx-svc
# 定义资源属于哪一个命名空间
namespace: ingress-test
# 定义service所需要的参数属性
spec:
ports:
- port: 80
protocol: TCP
# 需要转发到后端的端口,nginx默认端口为80
targetPort: 80
selector:
# 如何确定需要代理哪一个服务,通过标签,设置后会自动匹配同一命名空间下标签为nignx的pod代理
app: nginx
# service的类型,指定service的访问方式,默认ClusterIP
type: ClusterIP
#ClusterIP:虚拟的服务ip地址,用于k8s集群内部的pod访问,在Node上kube-porxy通过设置的iptables规则进行转发
#NodePort:使用宿主机端口,能够访问各Node的外部客户端通过Node的IP和端口就能访问服务器
#LoadBalancer:使用外部负载均衡器完成到服务器的负载分发,
---
# 版本号
apiVersion: apps/v1
# 类型
kind: Deployment
metadata:
# 名字
name: nginx
# 属于的命名空间
namespace: ingress-test
labels:
# 给自己打个标签
app: nginx
spec:
# 副本数量,为2,稍后会创建两个pod
replicas: 2
selector:
matchLabels:
# 这里设置将要匹配的标签
app: nginx
template:
metadata:
labels:
# 设置创建pod后将要给它打上的标签
app: nginx
spec:
containers:
# 资源名,创建时会自动加后缀,防止名称重复
- name: nginx
# 创建资源的镜像,这里选择的是之前上传到harbor仓库的镜像
image: harbor.k8s.info.com/yueyong/centos-nginx:1.22.0
# 拉取策略,这里的意思是如果本地没有就从远程仓库拉取
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 #容器对外开放的端口
---
# 版本号
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-svc-ingress
namespace: ingress-test
spec:
rules:
# 定义一个虚拟的 host,到时候通过它来访问服务
- host: centos-nginx.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
# service name
name: nginx-svc
port:
# service port
number: 80
- ? 执行 ingress.yaml
PS D:\workspace\docker\demo3> kubectl apply -f .\ingress.yaml
namespace/ingress-test unchanged
service/nginx-svc unchanged
deployment.apps/nginx configured
ingress.networking.k8s.io/nginx-svc-ingress unchanged
PS D:\workspace\docker\demo3>
- ? 检查资源
PS D:\workspace\docker\demo3> kubectl get -f .\ingress.yaml
NAME STATUS AGE
namespace/ingress-test Active 2m50s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-svc ClusterIP 10.102.98.154 <none> 80/TCP 2m50s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx 2/2 2 2 2m50s
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/nginx-svc-ingress nginx centos-nginx.com 172.20.1.120 80 2m50s
- ? 访问 配置 hosts : 172.20.1.120 centos-nginx.com (参考上一步获取的 ingress 信息) 获取 ingress nodeport 类型service 对外访问的端口信息:
PS D:\workspace\docker\demo3> kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.104.16.77 <none> 80:31598/TCP,443:30962/TCP 39m
ingress-nginx-controller-admission ClusterIP 10.98.43.189 <none> 443/TCP 39m
PS D:\workspace\docker\demo3>
可以看到,NodePort 类型的 service,80 端口转发到了 31598 ,443 端口转发到了 30962,本例未使用https,所以通过 http://centos-nginx.com:31598 访问即可:
上一篇
欢迎关注我的公众号“云原生拓展”,原创技术文章第一时间推送。
猜你喜欢
- 2024-10-26 kubernetes1.25对接DELL分布式存储ISILON 9.4.0.14
- 2024-10-26 OpenShift 平台企业版 OCP 4.11.9 部署(基于KVM,CentOS, CoreOS)
- 2024-10-26 寻找 k3OS 替代方案?为边缘 K8s 选择容器操作系统
- 2024-10-26 Jenkins 基于 Kubernetes 的动态和静态节点
- 2024-10-26 开源容器镜像仓库工具-Harbor(开源镜像文件是什么)
- 2024-10-26 连载3の充分利用VSCODE编辑器(vscode作为文本编辑器)
- 2024-10-26 Kubernetes 集成 KubeEdge 需要注意的问题汇总
- 2024-10-26 Openshift 4.4 静态 IP 离线安装系列:准备离线资源
- 2024-10-26 教你将已越狱的iPhone还原至干净状态
- 2024-10-26 手把手教你如何把已越狱iphone还原至刚刚越狱后的纯净系统
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)