K8S 集群对外暴露服务的方式目前只有三种:
ingress 由两部分组成:
其中 ingress controller 目前主要有两种:基于 nginx 服务的 ingress controller 和基于 traefik 的 ingress controller。而其中 traefik 的 ingress controller 目前支持 http 和 https 协议。由于对 nginx 比较熟悉,而且需要使用 TCP 负载,所以在此我们选择的是基于 nginx 服务的 ingress controller。
但是基于 nginx 服务的 ingress controller 根据不同的开发公司,又分为 k8s 社区的 ingress-nginx 和 nginx 公司的 nginx-ingress。根据 github 上的活跃度和关注人数,我们选择的是 k8s 社区的 ingress-nginx。
ingress 的工作原理:
1️⃣ ingress contronler 通过与 k8s 的 api 进行交互,动态的去感知 k8s 集群中 ingress 服务规则的变化,然后读取它,并按照定义的 ingress 规则,转发到 k8s 集群中对应的 service。
2️⃣ 而这个 ingress 规则写明了哪个域名对应 k8s 集群中的哪个 service,然后再根据 ingress-controller 中的 nginx 配置模板,生成一段对应的 nginx 配置。
3️⃣ 然后再把该配置动态的写到 ingress-controller 的 pod 里,该 ingress-controller 的 pod 里面运行着一个 nginx 服务,控制器会把生成的 nginx 配置写入到 nginx 的配置文件中,然后 reload 一下,使其配置生效,以此来达到域名分配置及动态更新的效果。

ingress 的用处:
这里采用 yaml 安装的方式,其他还有 helm 安装的方式。
步骤
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/cloud/deploy.yaml
- 注释 externalTrafficPolicy: Local
- 修改 controller/deploy 的 image:
image: registry.cn-hangzhou.aliyuncs.com/chenby/controller:v1.1.3- 修改 ingress-nginx-admission-create 的 image:
image: registry.cn-hangzhou.aliyuncs.com/chenby/kube-webhook-certgen:v1.1.1- 修改 ingress-nginx-admisson-patch 的 image:
image: registry.cn-hangzhou.aliyuncs.com/chenby/kube-webhook-certgen:v1.1.1
PS:直接下载可能下不下来,这里我提供一个下载,内容已经修改过。
wget http://49.232.8.65/yaml/deploy.yaml
[root@master ~]#wget http://49.232.8.65/yaml/deploy.yaml
......
[root@master ~]#kubectl apply -f deploy.yaml
......
[root@master ~]#kubectl get deploy -n ingress-nginx
NAME READY UP-TO-DATE AVAILABLE AGE
ingress-nginx-controller 1/1 1 1 3m18s
[root@master ~]#kubectl get pods,svc -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/ingress-nginx-admission-create--1-5wf5l 0/1 Completed 0 3m28s 10.42.1.11 node01 <none> <none>
pod/ingress-nginx-admission-patch--1-hv9pp 0/1 Completed 0 3m28s 10.42.2.9 node02 <none> <none>
pod/ingress-nginx-controller-7cb84487bd-xldfz 1/1 Running 0 3m28s 10.42.2.10 node02 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/ingress-nginx-controller LoadBalancer 10.43.70.205 <pending> 80:31387/TCP,443:30580/TCP 3m28s app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
service/ingress-nginx-controller-admission ClusterIP 10.43.222.253 <none> 443/TCP 3m28s app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
[root@master ~]#wget http://49.232.8.65/yaml/backend.yaml
......
[root@master ~]#kubectl apply -f backend.yaml
deployment.apps/default-http-backend created
service/default-http-backend created
[root@master ~]#wget http://49.232.8.65/yaml/ingress-demo-app.yaml
......
[root@master ~]#kubectl apply -f ingress-demo-app.yaml
deployment.apps/hello-server created
deployment.apps/nginx-demo created
service/nginx-demo created
service/hello-server created
ingress.networking.k8s.io/ingress-host-bar created
[root@master ~]#kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-host-bar nginx hello.chenby.cn,demo.chenby.cn 80 8s
[root@master ~]#kubectl get svc -A | grep ingress
ingress-nginx ingress-nginx-controller-admission ClusterIP 10.43.63.85 <none> 443/TCP 18m
ingress-nginx ingress-nginx-controller NodePort 10.43.186.87 <none> 80:31039/TCP,443:30343/TCP 18m
Ingress-nginx v-0.29.0
k8s 之服务暴露 — traefix 控制器
k8s 之 nginx-ingress