kubernetes系列之Ingress-nginx

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

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
### Kubernetes DaemonSet 和 ingress-nginx 的配置与使用 #### 什么是 DaemonSet? DaemonSet 是一种控制器,用于确保集群中的每个节点运行一个 Pod 副本。如果向集群中添加新节点,则该节点也会获得 Pod 实例[^3]。 #### 使用 DaemonSet 部署 ingress-nginx 通过 DaemonSet 方式部署 ingress-nginx 可以使每个节点都拥有一个 ingress-nginx 控制器实例,从而提高高可用性和负载均衡能力。以下是具体操作: 1. **下载官方的 deploy 文件** 下载适用于云环境的标准部署文件并调整为适合本地使用的版本: ```bash wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/baremetal/deploy.yaml ``` 2. **修改命名空间** 如果需要自定义命名空间,可以先创建一个新的命名空间: ```bash kubectl create namespace ingress-nginx ``` 然后编辑 `deploy.yaml` 文件,将所有涉及默认命名空间的部分替换为新的命名空间名称。 3. **应用配置** 应用 YAML 文件来启动 ingress-nginx: ```bash kubectl apply -f deploy.yaml ``` 4. **ConfigMap 自定义配置** ConfigMap 提供了灵活的方式来定制 Nginx 行为。可以通过以下命令查看当前存在的 ConfigMap: ```bash kubectl get cm -n ingress-nginx ``` 结果可能类似于以下内容: ``` NAME DATA AGE ingress-controller-leader-nginx 0 7d2h kube-root-ca.crt 1 7d2h nginx-configuration 0 7d2h tcp-services 0 7d2h udp-services 0 7d2h ``` 用户可以根据需求修改 `nginx-configuration` 中的内容。例如增加超时时间或其他高级设置[^1]。 5. **验证 Deployment 是否成功** 检查 Pods 运行状态以及 Service 是否正常工作: ```bash kubectl get pods,svc -n ingress-nginx ``` #### 示例:创建 Ingress 资源 假设已经有一个名为 `my-service` 的服务,并希望为其暴露外部访问路径 `/app`,则可编写如下 Ingress 定义: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: mydomain.example.com http: paths: - path: /app pathType: Prefix backend: service: name: my-service port: number: 80 ``` 执行以下命令将其应用于集群: ```bash kubectl apply -f ingress-example.yaml ``` #### Helm Chart 方法快速部署 除了手动方式外,还可以利用 Helm 工具简化部署流程。首先初始化 Helm 并添加仓库地址: ```bash helm repo add nginx-stable https://helm.nginx.com/stable helm repo update ``` 接着安装 ingress-nginx 到指定命名空间: ```bash helm install nginx-ingress nginx-stable/nginx-ingress --namespace nginx-ingress --create-namespace ``` --- ### 总结 以上介绍了如何借助 DaemonSet 来实现 ingress-nginx 的高可用部署方案及其基本配置方法[^3]。无论是采用原生 YAML 文件还是现代化工具如 Helm,都可以满足不同场景下的实际需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值