kubernetes系列之Ingress-nginx

本文介绍了在Kubernetes环境中,如何使用Ingress和Nginx来解决多个应用对外服务时的端口占用问题。通过Helm安装Ingress-Nginx,然后分别部署Nginx和Tomcat应用,设置不同的域名访问规则,最后通过Ingress路由实现对这两个应用的域名访问。这种方法优化了资源利用,简化了服务暴露。
摘要由CSDN通过智能技术生成

kubernetes系列之Ingress-nginx

为什么需要ingress?
在kubernetes中,我们知道,如果需要实现在外部对k8s集群内部署的应用进行访问,那么就可以暴露一个类型为 NodePortservice,而 NodePort 是需要占用集群中每台机器的一个端口,如果 service 数量太多的话,那么就需要占用大量的端口。Ingress提供了只使用一个 service (NodePort),通过不同域名实现对不同应用的访问,本文主要主要是介绍基于 nginx 的实现。

大纲介绍
1、使用 heml 安装 ingress-nginx
2、部署 nginx
3、部署 tomcat
4、实现通过 tomcat.comnginx.com 两个不同域名对以上部署的两个应用进行访问。

安装 Ingress-nginx

  • 使用 heml 进行安装
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace

环境准备

  • 创建名称空间
 kubectl create ns test-ingress

部署Nginx

操作步骤
部署nginx、tomcat和部署常规应用没有太多区别,大致可以访问以下几步
1、编写 yaml,使用 kubectl apply -f <yaml文件>yaml 进行应用
2、查看 Pod 的运行状态(是否启动成功)
3、测试访问

  • 创建配置文件 nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  test-nginx
  namespace: test-ingress
  labels:
    app:  test-nginx
spec:
  selector:
    matchLabels:
      app: test-nginx
  template:
    metadata:
      labels:
        app:  test-nginx
    spec:
      containers:
      - name:  test-nginx
        image:  nginx
        ports:
        - containerPort:  80
          name:  test-nginx
        volumeMounts:
        - name: localtime
          mountPath: /etc/localtime
      volumes:
        - name: localtime
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
      restartPolicy: Always
  • 创建 Pod
[root@k8s-master ~]# kubectl apply -f nginx.yaml 
deployment.apps/test-nginx created
  • 查看 Pod 的运行状态,Running 表示已成功启动
[root@k8s-master ~]# kubectl get pods -n test-ingress  
NAME                          READY   STATUS    RESTARTS   AGE
test-nginx-84c44d9487-jnbfb   1/1     Running   0          3m9s
  • 使用命令行创建 service
 kubectl expose deployment test-nginx \
 -n test-ingress \
 --name test-nginx \
 --port=80 \
 --target-port=80

部署Tomcat

  • 创建配置文件 tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  test-tomcat
  namespace: test-ingress
  labels:
    app:  test-tomcat
spec:
  selector:
    matchLabels:
      app: test-tomcat
  template:
    metadata:
      labels:
        app:  test-tomcat
    spec:
      containers:
      - name:  test-tomcat
        image:  tomcat:8.5.82
        ports:
        - containerPort:  8080
          name:  test-tomcat
        volumeMounts:
        - name: localtime
          mountPath: /etc/localtime
      volumes:
        - name: localtime
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
      restartPolicy: Always
  • 创建 Pod
[root@k8s-master ~]# kubectl apply -f tomcat.yaml 
deployment.apps/test-tomcat created
  • 查看 Pod 的运行状态,Running 表示已成功启动
[root@k8s-master ~]# kubectl get pods -n test-ingress 
NAME                           READY   STATUS    RESTARTS   AGE
test-nginx-84c44d9487-jnbfb    1/1     Running   0          13m
test-tomcat-55fbd7d79d-kzpzf   1/1     Running   0          16s
  • 使用 yaml 创建 service
apiVersion: v1
kind: Service
metadata:
  labels:
    app: test-tomcat
  name: test-tomcat
  namespace: test-ingress
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: test-tomcat

通过Ingress对Nginx、Tomcat的访问

  • 准备 nginx 测试访问页面
kubectl exec -it -n test-ingress test-nginx-84c44d9487-jnbfb \
-- bash -c "echo 'Hello Nginx' > /usr/share/nginx/html/index.html"
  • 准备 Tomcat 测试访问页面
kubectl exec -it -n test-ingress test-tomcat-55fbd7d79d-kzpzf \
-- bash -c "mkdir /usr/local/tomcat/webapps/ROOT && echo 'Hello Tomcat' > /usr/local/tomcat/webapps/ROOT/index.html"
  • 创建 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tomcat-nginx-ingress
  namespace: test-ingress
spec:
  ingressClassName: nginx
  rules:
  # 如果访问的域名为tomcat.com,则将请求转发到名称为test-tomcat的service的8080端口
  - host: tomcat.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: test-tomcat
            port:
              number: 8080
  # 如果访问的域名为nginx.com,则将请求转发到名称为test-nginx的service的80端口
  - host: nginx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: test-nginx
            port:
              number: 80
  • 配置本地 hosts文件(/ect/hosts),需根据实际情况修改为机器的 IP地址
192.168.49.150 tomcat.com
192.168.49.150 nginx.com
  • 通过命令行可以查看 service 的端口为 31972
[root@k8s-master ~]# kubectl get  service -n ingress-nginx 
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.96.92.121   <pending>     80:31972/TCP,443:31028/TCP   14h
ingress-nginx-controller-admission   ClusterIP      10.96.45.68    <none>        443/TCP                      14h
  • 测试通过域名进行访问
[root@k8s-master ~]# curl nginx.com:31972
Hello Nginx
[root@k8s-master ~]# curl tomcat.com:31972
Hello Tomcat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值