K8s之ingress使用

158 阅读3分钟

我正在参加「掘金·启航计划」

作者按:

相信大家对于使用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 versionk8s supported versionAlpine VersionNginx Version
v1.3.11.24, 1.23, 1.22, 1.21, 1.203.16.21.19.10†
v1.3.01.24, 1.23, 1.22, 1.21, 1.203.16.01.19.10†
v1.2.11.23, 1.22, 1.21, 1.20, 1.193.14.61.19.10†
v1.1.31.23, 1.22, 1.21, 1.20, 1.193.14.41.19.10†
v1.1.21.23, 1.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.1.11.23, 1.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.1.01.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.0.51.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.0.41.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.0.31.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.0.21.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.0.11.22, 1.21, 1.20, 1.193.14.21.19.9†
v1.0.01.22, 1.21, 1.20, 1.193.13.51.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

image.png

(6)查看ingress-controller服务

[root@k8s-master1 ~]# kubectl get svc -n ingress-nginx

image.png

(7)访问

image.png

看到这个说明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页面

image.png

好了,到此为止,大概知道如何使用ingress控制器暴露服务了吧,祝学习顺利!