美文网首页K8s
ingress-nginx常见参考配置

ingress-nginx常见参考配置

作者: 行者深蓝 | 来源:发表于2021-06-16 17:27 被阅读0次

前置条件

  1. Kubernetes 1.13 或更高版本的集群
  2. kubectl 1.13 或者更高版本
  3. Helm v3 或更高版本

参考配置

1. 配置 ingress 支持 websocket 协议

cat > ingress-inner-test.yaml << EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx-inner
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header Upgrade "websocket";
      proxy_set_header Connection "Upgrade";
  labels:
    app: rancher
  name: rancher-inner-domain
  namespace: cattle-system
spec:
  rules:
  - host: racher.inner.admin.com
    http:
      paths:
      - backend:
          serviceName: rancher
          servicePort: 80
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - racher.inner.admin.com
    secretName: tls-rancher-ingress
EOF
kubectl  apply -f ingress-inner-test.yaml

验证ingress创建状态

kubectl get ingress -n cattle-system rancher-inner-domain
kubectl get svc -n ingress-inner

image
  1. 验证服务运行状态
  • 修改 /etc/hosts 添加 10.7.10.40 racher.inner.admin.com 解析记录,
  • curl https://racher.inner.admin.com -k
  • kubectl logs -f ingress-inner-ingress-nginx-inner-controller-57d46bb54b-nfszp -n ingress-inner 日志返回 HTTP 200 确认ingress配置正确,且可以正常请求后端服务
10.8.32.0 - - [18/Mar/2021:16:14:51 +0000] "GET / HTTP/1.1" 200 9421 "-" "curl/7.29.0" 86 0.003 [cattle-system-rancher-80] [] 10.8.147.24:80 9407 0.003 200 0d1f631906950ce9355486403c2d6f69

2. 配置 Ingress 支持 tcp/udp 转发

  1. 更改ingress-nginx的deployment启动参数

添加--tcp-services-configmap和--udp-services-configmap参数,开启tcp与udp的支持

containers:
- args:
  - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
  - --udp-services-configmap=$(POD_NAMESPACE)/udp-services

  1. 更改ingress-nginx的service,声明tcp和udp用的端口号
  ports:
  - name: proxied-tcp
    nodePort: 31800 
    port: 11800
    protocol: TCP
    targetPort: 11800
  - name: proxied-udp
    nodePort: 30091
    port: 9001
    protocol: UDP
    targetPort: 9001

  1. 新建一个名为tcp-services的configmap

格式为<ingress-controller-svc-port>:"<namespace>/<service-name>:<port>"

例如下面表示 将monitoring命名空间下的hetaoskywalking-oap服务的11800端口映射到ingress-controller service的5044 端口

cat > tcp-services.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-inner
data:
  11800: "monitoring/hetaoskywalking-oap:11800"
EOF
kubectl apply -f tcp-services.yaml

3. 配置 Ingress 绑定ULB 实现 http 跳转https功能

  1. 创建一个ingress,需要在annotations中定义nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  2. 本地测试修改 /etc/hosts 添加解析记录: ingress_lb_ip svc.domain
  3. curl http://svc.domain 确认服务是否正常
  4. 确认ingress服务正常,可以为svc.domain添加DNS解析记录

完整验证示例

  1. 准备SSL/TLS证书,这里使用的自签名证书
#!/bin/bash
openssl req -newkey rsa:2048       \
            -keyout ca.key         \
            -out ca.crt            \
            -days 3650             \
            -x509                  \
            -passout pass:ca_key_xxxxx \
            -subj '/C=CN/ST=beijing/L=BJ/O=RD/OU=RDTEAM/CN=admin.com'

for cert_name in nginx
do
   openssl genrsa -out ${cert_name}.key 2048             \
                  -passout pass:111111
   openssl req -new -key ${cert_name}.key                \
                    -out ${cert_name}.csr                \
                    -passin pass:111111                  \
                    -subj "/C=CN/ST=beijing/L=BJ/O=RD/OU=RDTEAM/CN=${cert_name}.admin.com"
   openssl x509 -req -sha256                             \
                 -extensions v3_req                      \
                 -days 3650                              \
                 -in ${cert_name}.csr                    \
                 -CAkey ca.key                           \
                 -CA ca.crt                              \
                 -CAcreateserial                         \
                 -passin pass:ca_key_xxxxx               \
                 -out ${cert_name}.crt
done

  1. 创建 nginx 需要的 configmap
cat > default.conf << EOF
server {

    listen 80 default_server;
    server_name _;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm; 
    }
}
server {
    listen       443 ssl;
    listen  [::]:443 ssl;
    server_name _;

    ssl_certificate /etc/nginx/ssl/tls.crt;
    ssl_certificate_key /etc/nginx/ssl/tls.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm; 
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
EOF
kubectl create ns nginx
kubectl delete configmap nginx-configmap -n nginx
kubectl create configmap nginx-configmap --from-file=default.conf -n nginx

  1. 创建 nginx 需要的 secret
kubectl create ns nginx
kubectl create secret tls nginx-secret --cert=nginx.crt --key=nginx.key -n nginx

  1. 创建 nginx 服务
cat > nginx-deploy-svc.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
    name: https
  - port: 80
    protocol: TCP
    targetPort: 80
    name: http
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx 
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
      - name: secret-volume
        secret:
           secretName: nginx-secret 
      - name: configmap-volume
        configMap:
          name: nginx-configmap 
      containers:
      - name: nginx
        image: uhub.service.ucloud.cn/ucloud/nginx:latest
        ports:
        - containerPort: 443
        - containerPort: 80
        volumeMounts:
        - mountPath: /etc/nginx/ssl
          name: secret-volume
        - mountPath: /etc/nginx/conf.d
          name: configmap-volume
EOF
kubectl apply -f nginx-deploy-svc.yaml  

  1. 创建 ingress 示例
cat > nginx-svc-ingress.yaml << EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-svc
  namespace: nginx
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - nginx.admin.com
    secretName: nginx-secret
  rules:
  - host: nginx.admin.com
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80
        path: /
EOF
kubectl apply -f nginx-svc-ingress.yaml

  1. 验证 ingress 服务

本地测试修改 /etc/hosts 添加解析记录: ingress_lb_ip svc.domain curl http://svc.domain 确认服务是否正常

参考文档

相关文章

网友评论

    本文标题:ingress-nginx常见参考配置

    本文链接:https://www.haomeiwen.com/subject/agrfyltx.html