我正在参加「掘金·启航计划」
作者按:
相信大家对于使用k8s的便利都是深有体会,对于应用服务暴露的几种方式都有自己的深刻理解,这里就来研究一下基于七层负载的ingress控制器暴露应用服务的方式,相信定会有所收获。
1、ingress介绍
k8s集群中的pod和服务的ip地址只能在集群网络内部使用,如果集群外想访问怎么办,目前k8s提供了:
(1)NodePort: 根据集群某一个节点开放某一个端口暴露服务,但是暴露多了也不好管理也不安全
(2)LoadBalancer:各种云服务商提供负载均衡ip,由负载均衡转发至应用
(3)ingress: 就是今天所介绍的,用过ingress控制器和k8s的api交互,这个控制器里运行着一个nginx服务,动态感知集群ingress规则变化,按照自定义规则,生成对应的nginx配置写入容器中/etc/nginx.conf,并热加载,达到通过域名配置变化动态更新服务。
(4)官网地址:ingress-nginx/README.md at main · kubernetes/ingress-nginx · GitHub
(5)版本支持
| Ingress-NGINX version | k8s supported version | Alpine Version | Nginx Version |
|---|---|---|---|
| v1.3.1 | 1.24, 1.23, 1.22, 1.21, 1.20 | 3.16.2 | 1.19.10† |
| v1.3.0 | 1.24, 1.23, 1.22, 1.21, 1.20 | 3.16.0 | 1.19.10† |
| v1.2.1 | 1.23, 1.22, 1.21, 1.20, 1.19 | 3.14.6 | 1.19.10† |
| v1.1.3 | 1.23, 1.22, 1.21, 1.20, 1.19 | 3.14.4 | 1.19.10† |
| v1.1.2 | 1.23, 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.1.1 | 1.23, 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.1.0 | 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.0.5 | 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.0.4 | 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.0.3 | 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.0.2 | 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.0.1 | 1.22, 1.21, 1.20, 1.19 | 3.14.2 | 1.19.9† |
| v1.0.0 | 1.22, 1.21, 1.20, 1.19 | 3.13.5 | 1.20.1 |
2、环境准备
Linux:centos 7.9
k8s:1.22.9
ingress-nginx 1.1.1
安装方式:yaml文件
镜像:dockerhub
3、安装
(1) 安装 有两种,通过helm包管理器安装和yaml文件安装,我们介绍yaml类,因为一般都用yaml用习惯了。
官方网址: wget 下载部署文件raw.githubusercontent.com/kubernetes/…
(2)注意
官方文件里面有两个镜像一般国内没法下载,需要自己想办法,当然我提供的地址必然能顺利使用,不会改的,我已经改好的可以找我发消息索要,把以下这俩地址 k8s.gcr.io/ingress-nginx/controller:v1.1.1
k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
改成docker镜像仓库即可:
cilliandevops/ingress-nginx-controller:v1.1.1
cilliandevops/kube-webhook-certgen:v1.1.1
即可
还要修改yaml中默认的暴露服务方式LoadBalancer,可以改为nodeport方式或者hostport方式,我这直接自改暴露机器80端口
(4) 部署这个yaml
[root@master01 ~]# kubectl apply -f deploy.yaml
(5)查看部署的pod状态
kubectl get pod -n ingress-nginx
(6)查看ingress-controller服务
[root@k8s-master1 ~]# kubectl get svc -n ingress-nginx
(7)访问
看到这个说明ingress控制器是安装好了的
4、部署一个ingress服务
(1)vi webapp.yaml
# webapp-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 1
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: tomcat:latest
ports:
- containerPort: 8080
# webapp-service.yaml
---
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: webapp
---
# ingress-webapp.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mywebsite-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/enable-cors: "true"
spec:
rules:
- host: haha.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp
port:
number: 8080
(2)查看服务
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
webapp-655c47bdd6-jjc8l 1/1 Running 1 (115m ago) 43d
[root@k8s-master1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 54d
webapp ClusterIP 10.233.61.129 <none> 8080/TCP 43d
(3)访问一下,记得修改hosts映射配置在C:\Windows\System32\drivers\etc里
(4)web页面
好了,到此为止,大概知道如何使用ingress控制器暴露服务了吧,祝学习顺利!