什么是Ingress
- 1、Ingress概念
- 2、Ingress安装
- 3、Ingress简单使用
- 4、多域名使用
1、Ingress概念
- 通俗来讲,ingress和之前提到的Service、Deployment,也是一个k8s的资源类型,Ingress用于实现用域名的方式访问k8s内部应用。
- Ingress为Kubernetes集群中的服务提供了入口,可以提供负载均衡、SSL终止和基于名称的虚拟主机,在生产环境中常用的Ingress有Treafik、Nginx、HAProxy、Istio等。
- 基本概念
- 在Kubernetesv 1.1版中添加的Ingress用于从集群外部到集群内部Service的HTTP和HTTPS路由,流量从Internet到Ingress再到Services最后到Pod上,通常情况下,Ingress部署在所有的Node节点上。
- Ingress可以配置提供服务外部访问的URL、负载均衡、终止SSL,并提供基于域名的虚拟主机。但Ingress不会暴露任意端口或协议。
2、Ingress安装
- 首先安装helm管理工具:
- Helm下载地址:https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz
- Helm安装
#解压缩
[root@k8s-master helm]# tar -zxvf helm-v3.8.2-linux-amd64.tar.gz
[root@k8s-master helm]# mv linux-amd64/helm /usr/local/bin/helm
#查看版本
[root@k8s-master helm]# helm version
version.BuildInfo{Version:"v3.8.2", GitCommit:"6e3701edea09e5d55a8ca2aae03a68917630e91b", GitTreeState:"clean", GoVersion:"go1.17.5"}
- 添加ingress-nginx 仓库
[root@k8s-master helm]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
#查看
[root@k8s-master helm]# helm repo list
NAME URL
ingress-nginx https://kubernetes.github.io/ingress-nginx
[root@k8s-master ~]# helm search repo ingress-nginx
NAME CHART VERSION APP VERSION DESCRIPTION
ingress-nginx/ingress-nginx 4.1.1 1.2.0 Ingress controller for Kubernetes using NGINX a...
- 下载 ingress-nginx配置文件
[root@k8s-master ~]# cd /home/
[root@k8s-master home]# mkdir ingress-nginx
[root@k8s-master home]# cd ingress-nginx/
[root@k8s-master ingress-nginx]# helm pull ingress-nginx/ingress-nginx
[root@k8s-master ingress-nginx]# ls
ingress-nginx-4.1.1.tgz
#解压
[root@k8s-master ingress-nginx]# tar zxvf ingress-nginx-4.1.1.tgz
[root@k8s-master ingress-nginx]# cd ingress-nginx
[root@k8s-master ingress-nginx]# ls
CHANGELOG.md Chart.yaml ci OWNERS README.md README.md.gotmpl templates values.yaml
#修改配置文件
[root@k8s-master ingress-nginx]# vim values.yaml
#修改镜像仓库
#1
controller:
name: controller
image:
## Keep false as default for now!
chroot: false
registry: registry.cn-shanghai.aliyuncs.com
image: wanfei/ingress-nginx-controller
tag: "v1.1.2"
#digest: sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
#2
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
#3
kind: DaemonSet
#4
terminationGracePeriodSeconds: 300
# -- Node labels for controller pod assignment
## Ref: https://kubernetes.io/docs/user-guide/node-selection/
##
nodeSelector:
kubernetes.io/os: linux
ingress: "true"
#5
#type: LoadBalancer改为
type: ClusterIP
#6
patch:
enabled: true
image:
registry: registry.cn-shanghai.aliyuncs.com
image: wanfei/kube-webhook-certgen
tag: v1.1.1
#digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
pullPolicy: IfNotPresent
- 安装
#创建namespace
[root@k8s-master ingress-nginx]# kubectl create ns ingress-nginx
namespace/ingress-nginx created
#给节点打标签
[root@k8s-master ingress-nginx]# kubectl label node k8s-master ingress=true
node/k8s-master labeled
[root@k8s-master ingress-nginx]# helm install ingress-nginx -n ingress-nginx .
#安装完毕
[root@k8s-master ingress-nginx]# kubectl get po -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-dxfbz 1/1 Running 0 2m56s
- 添加节点
[root@k8s-master ingress-nginx]# kubectl label node k8s-node01 ingress=true
node/k8s-node01 labeled
[root@k8s-master ingress-nginx]# kubectl get po -n ingress-nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-controller-89pxh 0/1 ContainerCreating 0 50s 172.16.55.221 k8s-node01
ingress-nginx-controller-dxfbz 1/1 Running 0 78m 172.16.55.220 k8s-master
- 删除节点
[root@k8s-master ingress-nginx]# kubectl label node k8s-node01 ingress-
node/k8s-node01 labeled
[root@k8s-master ingress-nginx]# kubectl get po -n ingress-nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-controller-dxfbz 1/1 Running 0 81m 172.16.55.220 k8s-master
3、Ingress简单使用
- 新建ingress.yaml
[root@k8s-master ~]# vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
name: example
spec:
rules: #一个ingress 可以配置多个rules
- host: foo.bar.com #域名配置 ,可以不写,匹配*,可以正则表达 *.bar.com
http:
paths: #相当于nginx的location配置,同个host可以配置多个path/ /abc
- path: /
pathType: Prefix
backend:
service:
name: nginx-test-svc #表示代理到哪个service
port:
number: 80 #表示代理到哪个service 端口号
- 创建 ingress
[root@k8s-master ~]# kubectl create -f ingress.yaml
[root@k8s-master ~]# kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
example foo.bar.com 10.102.228.152 80 6m24s
#设置 host ingress安装的服务器IP foo.bar.com
#通过浏览器 访问 foo.bar.com
4、多域名使用
- 修改yaml
[root@k8s-master ~]# cp ingress.yaml ingress-dulDomain.yaml
#查看可以绑定的svc
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 13d
nginx-externalname ExternalName www.baidu.com 23h
nginx-svc-external ClusterIP 10.96.196.165 80/TCP 24h
nginx-test-svc NodePort 10.99.39.37 80:31000/TCP 27h
#修改yaml
[root@k8s-master ~]# vim ingress-dulDomain.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
name: example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-test-svc
port:
number: 80
- host: foo2.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-test-svc
port:
number: 80
#重新发布
[root@k8s-master ~]# kubectl replace -f ingress-dulDomain.yaml
ingress.networking.k8s.io/example replaced
[root@k8s-master ~]# kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
example foo.bar.com,foo3.bar.com 10.102.228.152 80 48m