Kubernetes安装nginx-controller作为统一网关

news2025/2/24 8:13:32

nginx-controller是什么呢?

  • 它是一个能调度nginx的一个kubernetes operator,它能监听用户创建,更新,删除NginxConf对象,来调度本地的nginx实现配置的动态更新。如添加新的代理(http,https,tcp,udp),缓存(浏览器缓存,本地缓存),ssl证书(配置本身,ConfigMap,Secret),更新,删除等
  • 它使用nginx本身的配置文件(如nginx.conf)来作为配置参数,使nginx配置更透明,易于维护

安装之前准备

  • 你得有一个k8s环境
  • 创建crd
    如果你的版本是1.29以下的版本,请删掉crd里面所有有关x-kubernetes-validations的部分
    crd.yaml
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: nginxconfs.stable.lhstack.com
    spec:
      names:
        kind: NginxConf
        plural: nginxconfs
        singular: nginxconf
        listKind: NginxConfList
        shortNames:
          - ncf
      group: stable.lhstack.com
      scope: Namespaced
      versions:
        - name: v1
          served: true
          storage: true
          schema:
            openAPIV3Schema:
              type: object
              description: "nginx 对应http/stream组中include哪一项引入的配置"
              x-kubernetes-validations:
                - rule: "has(self.spec) && has(self.spec.config)"
                  message: "spec.config参数为必填项"
                - rule: "(self.spec.configType == 'custom' && size(self.spec.customConfigPath) > 0) || (has(self.spec.configType) && self.spec.configType != 'custom') || !has(self.spec.configType)"
                  message: "spec.configType是custom时,spec.customConfigPath参数为必填项"
              properties:
                spec:
                  type: object
                  required:
                    - config
                  properties:
                    additions:
                      type: object
                      description: "附加ConfigMap,Secret,文本内容到指定路径文件中,使用场景: 如tls证书"
                      properties:
                        values:
                          type: array
                          description: "将items.value中的内容输出到容器指定路径"
                          items:
                            type: object
                            x-kubernetes-validations:
                              - rule: "size(self.value) != 0 && size(self.path) != 0"
                                message: "values.value,values.value参数为必填项"
                            properties:
                              value:
                                type: string
                                description: "要输出到文件的内容"
                              path:
                                type: string
                                description: "输出目标路径"
                        secrets:
                          type: array
                          description: "将secret中的内容输出到容器指定路径"
                          items:
                            type: object
                            x-kubernetes-validations:
                              - rule: "(has(self.name) && has(self.path)) || (has(self.name) && has(self.items))"
                                message: "(secrets.path,secrets.name)或者(secrets.items,secrets.name)参数为必填项"
                              - rule: "(has(self.path) && !has(self.items)) || (!has(self.path) && has(self.items))"
                                message: "secrets.path和secrets.items参数不能并存,只能二选一"
                            properties:
                              path:
                                type: string
                                description: "输出目标路径,同items参数不能并存,此路径必须是一个目录,不存在即创建目录(多级目录会同时创建)"
                              name:
                                type: string
                                description: "secret名称"
                              namespace:
                                type: string
                                description: "secret所在命名空间"
                              items:
                                type: array
                                description: "secret中每一项,同path参数不能并存"
                                items:
                                  type: object
                                  x-kubernetes-validations:
                                    - rule: "size(self.key) != 0 && size(self.path) != 0"
                                      message: "items.key和items.path不能为空"
                                  properties:
                                    key:
                                      type: string
                                      description: "secret项中的key"
                                    path:
                                      type: string
                                      description: "secret中key的value值需要输出到的目标文件路径,此路径必须是一个文件地址,不存在即创建文件(多级目录会同时创建目录)"
                        configMaps:
                          type: array
                          description: "将configMap中的内容输出到容器指定路径"
                          items:
                            type: object
                            x-kubernetes-validations:
                              - rule: "(has(self.name) && has(self.path)) || (has(self.name) && has(self.items))"
                                message: "(configMaps.path,configMaps.name)或者(configMaps.items,configMaps.name)参数为必填项"
                              - rule: "(has(self.path) && !has(self.items)) || (!has(self.path) && has(self.items))"
                                message: "configMaps.path和configMaps.items参数不能并存,只能二选一"
                            properties:
                              path:
                                type: string
                                description: "输出目标路径,同items参数不能并存,此路径必须是一个目录,不存在即创建目录(多级目录会同时创建)"
                              name:
                                type: string
                                description: "configMap名称"
                              namespace:
                                type: string
                                description: "configMap所在命名空间"
                              items:
                                type: array
                                description: "configMap中每一项,同path参数不能并存"
                                items:
                                  type: object
                                  x-kubernetes-validations:
                                    - rule: "size(self.key) != 0 && size(self.path) != 0"
                                      message: "items.key和items.path不能为空"
                                  properties:
                                    key:
                                      type: string
                                      description: "configMap项中的key"
                                    path:
                                      type: string
                                      description: "configMap中key的value值需要输出到的目标文件路径,此路径必须是一个文件地址,不存在即创建文件(多级目录会同时创建目录)"
                    customConfigPath:
                      type: string
                      description: "当configType=custom时才生效,定义配置写入到指定目录下面"
                    configType:
                      description: "配置类型,可选值 http,stream,custom,default: http"
                      enum:
                        - http
                        - stream
                        - custom
                      type: string
                    config:
                      type: string
                      description: |
                        配置内容:
                        server {
                            listen       80;
                            listen  [::]:80;
                            server_name  localhost;
                            #access_log  /var/log/nginx/host.access.log  main;
                            location / {
                                root   /usr/share/nginx/html;
                                index  index.html index.htm;
                            }
                            #error_page  404              /404.html;
                            # redirect server error pages to the static page /50x.html
                            #
                            error_page   500 502 503 504  /50x.html;
                            location = /50x.html {
                                root   /usr/share/nginx/html;
                            }
                            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
                            #
                            #location ~ \.php$ {
                            #    proxy_pass   http://127.0.0.1;
                            #}
                            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
                            #
                            #location ~ \.php$ {
                            #    root           html;
                            #    fastcgi_pass   127.0.0.1:9000;
                            #    fastcgi_index  index.php;
                            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                            #    include        fastcgi_params;
                            #}
                            # deny access to .htaccess files, if Apache's document root
                            # concurs with nginx's one
                            #
                            #location ~ /\.ht {
                            #    deny  all;
                            #}
                        }
    ---
    
  • 执行命令,创建crd
    kubectl apply -f crd.yaml
    然后就可以使用 kubectl explain NginxConf查看对应的文档了,如:
    在这里插入图片描述
    在这里插入图片描述

安装nginx-controller

这里我使用deployment来部署nginx-controller
deployment.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: ingress
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx-controller
  namespace: ingress
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nginx-controller
  namespace: ingress
subjects:
  - kind: ServiceAccount
    name: nginx-controller
    namespace: ingress
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-controller
  namespace: ingress
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ingress
  template:
    metadata:
      labels:
        app: ingress
    spec:
      serviceAccountName: nginx-controller
      containers:
        - name: controller
          image: lhstack/nginx-controller:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: "http"
              protocol: "TCP"
            - containerPort: 443
              name: "https"
              protocol: "TCP"
          readinessProbe:
            httpGet:
              port: 9099
              path: /readyz
            successThreshold: 1
            failureThreshold: 3
            timeoutSeconds: 3 #请求超时
            periodSeconds: 30 #每隔30秒检查一次
            initialDelaySeconds: 5 #5秒之后开始检测
          livenessProbe:
            httpGet:
              port: 9099
              path: /healthz
            successThreshold: 1
            failureThreshold: 3
            timeoutSeconds: 3 #请求超时
            periodSeconds: 60 #每隔60秒检查一次
            initialDelaySeconds: 5 #5秒之后开始检测
          env:
            - name: KUBE_NAMESPACE
              value: "ingress" # 这里用命名空间隔离配置,意味着只有ingress命名空间下的NginxConf才会生效,如果不设置或者为空,就会监听所有命名空间下的配置
          resources:
            requests:
              memory: 32Mi
              cpu: 10m
            limits:
              memory: 64Mi
              cpu: 10m
---
apiVersion: v1
kind: Service
metadata:
  name: ingress
  namespace: ingress
spec:
  selector:
    app: ingress
  type: NodePort
  clusterIP: 10.43.80.80 #这里固定一下ip,方便使用dns指向指定ip,前提是需要安装dns服务
  ports:
    - port: 80
      name: http
      protocol: TCP
      nodePort: 30080
    - port: 443
      name: https
      protocol: TCP
      nodePort: 30443

然后就可以通过命令看到启动了两个容器
在这里插入图片描述
由于我本地的环境和默认的不太一样,所以ip,type可能不相同,但是影响不大,我相信你们也能理解
在这里插入图片描述

添加一个http代理

这里代理百度试试,由于我已经安装了dns服务,就可以通过域名直接访问
baidu-nginx-conf.yaml

apiVersion: stable.lhstack.com/v1
kind: NginxConf
metadata:
  name: baidu-web
  namespace: default #我本地配置监听的是default命名空间
spec:
  config: |
    server {
        server_name baidu.lhstack.com;
        listen 80;
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_min_length 1000;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_vary on;
        location / {
          proxy_pass https://www.baidu.com;
          proxy_http_version 1.1;
        }
    }

可以看到创建成功了,日志也已经检测到了
在这里插入图片描述
在这里插入图片描述
现在访问浏览器试试
在这里插入图片描述

在这里插入图片描述

增加tls证书支持

生成证书

这里我使用cfssl+cfssljson生成证书

编写ca-config.json

{
    "signing": {
        "default": {
            "expiry": "876000h"
        },
        "profiles": {
            "lhstack": {
                "expiry": "876000h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

编写ca-csr.json

{
    "CN": "lhstack",
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "CN",
            "ST": "ChengDu",
            "L": "ChengDu",
            "O":"nginxConf",
            "OU":"lhstack"
        }
    ]
}

生成ca证书

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

编写server-crs.json配置

{
    "CN": "lhstack.com",
    "hosts":[
        "*.lhstack.com"
    ],
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "CN",
            "ST": "ChengDu",
            "L": "ChengDu",
            "O":"nginxConf",
            "OU":"lhstack"
        }
    ]
}

生成服务端证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=lhstack server-csr.json | cfssljson -bare server

浏览器导入ca证书

Google浏览器 设置->隐私和安全->安全->管理证书->受信任的根证书颁发机构->导入->浏览->将文件类型选择为所有类型->选择ca.pem->导入即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为代理服务添加证书

使用Value输出证书

编写配置
apiVersion: stable.lhstack.com/v1
kind: NginxConf
metadata:
  name: baidu-web
  namespace: default #我本地配置监听的是default命名空间
spec:
  additions:
    values:
      - path: /opt/tls/baidu/tls.key
        value: | #复制server-key.pem的内容
          -----BEGIN EC PRIVATE KEY-----
          MHcCAQEEIAT5gX3jgIEZS/ummtkAbNuazXZVjpm1g2huYRe1AAGeoAoGCCqGSM49
          AwEHoUQDQgAEqOSRM0QVMX/yT1WY6iDp1mTEqKncfDPN2hWLR8wtK8UrfsZdteC4
          tVq5qheqXpADlnXblDx8E88II/1L7mcgmg==
          -----END EC PRIVATE KEY-----
      - path: /opt/tls/baidu/tls.crt
        value: | #复制server.pem的内容
          -----BEGIN CERTIFICATE-----
          MIICdjCCAhugAwIBAgIUbrgeVdgOzILZ0gBxHyWnApsTWn4wCgYIKoZIzj0EAwIw
          aTELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0NoZW5nRHUxEDAOBgNVBAcTB0NoZW5n
          RHUxEjAQBgNVBAoTCW5naW54Q29uZjEQMA4GA1UECxMHbGhzdGFjazEQMA4GA1UE
          AxMHbGhzdGFjazAgFw0yNDAyMTkwNjE0MDBaGA8yMTI0MDEyNjA2MTQwMFowbTEL
          MAkGA1UEBhMCQ04xEDAOBgNVBAgTB0NoZW5nRHUxEDAOBgNVBAcTB0NoZW5nRHUx
          EjAQBgNVBAoTCW5naW54Q29uZjEQMA4GA1UECxMHbGhzdGFjazEUMBIGA1UEAxML
          bGhzdGFjay5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo5JEzRBUxf/JP
          VZjqIOnWZMSoqdx8M83aFYtHzC0rxSt+xl214Li1WrmqF6pekAOWdduUPHwTzwgj
          /UvuZyCao4GaMIGXMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcD
          AQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUnxNd1Vf52CFI4Jnf
          mJdWJINRfkgwHwYDVR0jBBgwFoAUwt+oneC6wLTC+iMEYnhbxLrH7OAwGAYDVR0R
          BBEwD4INKi5saHN0YWNrLmNvbTAKBggqhkjOPQQDAgNJADBGAiEAhBQbWHu/9F6d
          6E7s48ltk2Gv4Jhvfk27QPV1+e7GBdoCIQCyRc8+IgO7ejlpZIfIOoKkdFgSZ5CZ
          HUCQbhbgFgl0Bg==
          -----END CERTIFICATE-----
  config: |
    server {
        listen 80;
        #配置80端口永久重定向443
        server_name baidu.lhstack.com;
        rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    server {
        server_name baidu.lhstack.com;
        listen 443 ssl http2;
        client_max_body_size 50m;
        ssl_certificate     /opt/tls/baidu/tls.crt;
        ssl_certificate_key  /opt/tls/baidu/tls.key;
        ssl_session_timeout  5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_min_length 1000;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_vary on;
        location / {
          proxy_pass https://www.baidu.com;
          proxy_http_version 1.1;
        }
    }
更新配置

kubectl apply -f baidu-nginx-conf.yaml
可以看到,更新成功了
在这里插入图片描述
浏览器访问,可以看到,这里就变成https了
在这里插入图片描述

使用ConfigMap输出证书

删除之前的配置

kubectl delete -f baidu-nginx-conf.yaml

在这里插入图片描述
浏览器也不可访问,变成了我默认的服务
在这里插入图片描述
证书文件也清理干净了
在这里插入图片描述

编写配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: baidu-nginx-conf
  namespace: kube-system
data:
  tls.key: |
    -----BEGIN EC PRIVATE KEY-----
    MHcCAQEEIAT5gX3jgIEZS/ummtkAbNuazXZVjpm1g2huYRe1AAGeoAoGCCqGSM49
    AwEHoUQDQgAEqOSRM0QVMX/yT1WY6iDp1mTEqKncfDPN2hWLR8wtK8UrfsZdteC4
    tVq5qheqXpADlnXblDx8E88II/1L7mcgmg==
    -----END EC PRIVATE KEY-----
  tls.crt: |
    -----BEGIN CERTIFICATE-----
    MIICdjCCAhugAwIBAgIUbrgeVdgOzILZ0gBxHyWnApsTWn4wCgYIKoZIzj0EAwIw
    aTELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0NoZW5nRHUxEDAOBgNVBAcTB0NoZW5n
    RHUxEjAQBgNVBAoTCW5naW54Q29uZjEQMA4GA1UECxMHbGhzdGFjazEQMA4GA1UE
    AxMHbGhzdGFjazAgFw0yNDAyMTkwNjE0MDBaGA8yMTI0MDEyNjA2MTQwMFowbTEL
    MAkGA1UEBhMCQ04xEDAOBgNVBAgTB0NoZW5nRHUxEDAOBgNVBAcTB0NoZW5nRHUx
    EjAQBgNVBAoTCW5naW54Q29uZjEQMA4GA1UECxMHbGhzdGFjazEUMBIGA1UEAxML
    bGhzdGFjay5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo5JEzRBUxf/JP
    VZjqIOnWZMSoqdx8M83aFYtHzC0rxSt+xl214Li1WrmqF6pekAOWdduUPHwTzwgj
    /UvuZyCao4GaMIGXMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcD
    AQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUnxNd1Vf52CFI4Jnf
    mJdWJINRfkgwHwYDVR0jBBgwFoAUwt+oneC6wLTC+iMEYnhbxLrH7OAwGAYDVR0R
    BBEwD4INKi5saHN0YWNrLmNvbTAKBggqhkjOPQQDAgNJADBGAiEAhBQbWHu/9F6d
    6E7s48ltk2Gv4Jhvfk27QPV1+e7GBdoCIQCyRc8+IgO7ejlpZIfIOoKkdFgSZ5CZ
    HUCQbhbgFgl0Bg==
    -----END CERTIFICATE-----
---
apiVersion: stable.lhstack.com/v1
kind: NginxConf
metadata:
  name: baidu-web
  namespace: default #我本地配置监听的是default命名空间
spec:
  additions:
    configMaps:
      - name: baidu-nginx-conf
        namespace: kube-system #不填默认使用default作为命名空间
        path: /opt/tls/baidu
  config: |
    server {
        listen 80;
        #配置80端口永久重定向443
        server_name baidu.lhstack.com;
        rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    server {
        server_name baidu.lhstack.com;
        listen 443 ssl http2;
        client_max_body_size 50m;
        ssl_certificate     /opt/tls/baidu/tls.crt;
        ssl_certificate_key  /opt/tls/baidu/tls.key;
        ssl_session_timeout  5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_min_length 1000;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_vary on;
        location / {
          proxy_pass https://www.baidu.com;
          proxy_http_version 1.1;
        }
    }

在这里插入图片描述

更新配置

kubectl apply -f baidu-nginx-conf.yaml
在这里插入图片描述
浏览器也可以访问了
在这里插入图片描述

使用Secret输出证书

删除之前的配置

kubectl delete -f baidu-nginx-conf.yaml
在这里插入图片描述
证书文件也被清理干净
在这里插入图片描述

编写配置
apiVersion: v1
kind: Secret
metadata:
  name: baidu-nginx-conf
  namespace: kube-system
type: kubernetes/tls #data要求为base64格式
data:
  tls.key: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUFUNWdYM2pnSUVaUy91bW10a0FiTnVhelhaVmpwbTFnMmh1WVJlMUFBR2VvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFcU9TUk0wUVZNWC95VDFXWTZpRHAxbVRFcUtuY2ZEUE4yaFdMUjh3dEs4VXJmc1pkdGVDNAp0VnE1cWhlcVhwQURsblhibER4OEU4OElJLzFMN21jZ21nPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQ==
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNkakNDQWh1Z0F3SUJBZ0lVYnJnZVZkZ096SUxaMGdCeEh5V25BcHNUV240d0NnWUlLb1pJemowRUF3SXcKYVRFTE1Ba0dBMVVFQmhNQ1EwNHhFREFPQmdOVkJBZ1RCME5vWlc1blJIVXhFREFPQmdOVkJBY1RCME5vWlc1bgpSSFV4RWpBUUJnTlZCQW9UQ1c1bmFXNTRRMjl1WmpFUU1BNEdBMVVFQ3hNSGJHaHpkR0ZqYXpFUU1BNEdBMVVFCkF4TUhiR2h6ZEdGamF6QWdGdzB5TkRBeU1Ua3dOakUwTURCYUdBOHlNVEkwTURFeU5qQTJNVFF3TUZvd2JURUwKTUFrR0ExVUVCaE1DUTA0eEVEQU9CZ05WQkFnVEIwTm9aVzVuUkhVeEVEQU9CZ05WQkFjVEIwTm9aVzVuUkhVeApFakFRQmdOVkJBb1RDVzVuYVc1NFEyOXVaakVRTUE0R0ExVUVDeE1IYkdoemRHRmphekVVTUJJR0ExVUVBeE1MCmJHaHpkR0ZqYXk1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU281SkV6UkJVeGYvSlAKVlpqcUlPbldaTVNvcWR4OE04M2FGWXRIekMwcnhTdCt4bDIxNExpMVdybXFGNnBla0FPV2RkdVVQSHdUendnagovVXZ1WnlDYW80R2FNSUdYTUE0R0ExVWREd0VCL3dRRUF3SUZvREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNECkFRWUlLd1lCQlFVSEF3SXdEQVlEVlIwVEFRSC9CQUl3QURBZEJnTlZIUTRFRmdRVW54TmQxVmY1MkNGSTRKbmYKbUpkV0pJTlJma2d3SHdZRFZSMGpCQmd3Rm9BVXd0K29uZUM2d0xUQytpTUVZbmhieExySDdPQXdHQVlEVlIwUgpCQkV3RDRJTktpNXNhSE4wWVdOckxtTnZiVEFLQmdncWhrak9QUVFEQWdOSkFEQkdBaUVBaEJRYldIdS85RjZkCjZFN3M0OGx0azJHdjRKaHZmazI3UVBWMStlN0dCZG9DSVFDeVJjOCtJZ083ZWpscFpJZklPb0trZEZnU1o1Q1oKSFVDUWJoYmdGZ2wwQmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
---
apiVersion: stable.lhstack.com/v1
kind: NginxConf
metadata:
  name: baidu-web
  namespace: default #我本地配置监听的是default命名空间
spec:
  additions:
    secrets:
      - name: baidu-nginx-conf
        namespace: kube-system #不填默认使用default作为命名空间
        path: /opt/tls/baidu
  config: | 
    server {
        listen 80;
        #配置80端口永久重定向443
        server_name baidu.lhstack.com;
        rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    server {
        server_name baidu.lhstack.com;
        listen 443 ssl http2;
        client_max_body_size 50m;
        ssl_certificate     /opt/tls/baidu/tls.crt;
        ssl_certificate_key  /opt/tls/baidu/tls.key;
        ssl_session_timeout  5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_min_length 1000;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_vary on;
        location / {
          proxy_pass https://www.baidu.com;
          proxy_http_version 1.1;
        }
    }

在这里插入图片描述

更新配置

kubectl apply -f baidu-nginx-conf.yaml
在这里插入图片描述
浏览器也能正常访问
在这里插入图片描述

如果证书过期了,需要更新证书内容怎么办?

如果使用的ConfigMap,Secret保存的证书,那么就需要手动更新ConfigMap,Secret,然后使用以下命令:

  • 触发所有NginxConf更新事件
    这个指令会触发所有NginxConf事件,然后走更新流程,就会拉取最新的ConfigMap,Secret内容输出到指定路径
    kubectl annotate NginxConf --all -A --overwrite updated=$(date +%s)
  • 触发一个NginxConf更新事件
    如果已知需要更新的NginxConf配置,则使用此命令触发更新事件即可
    kubectl annotate -n {命名空间} NginxConf {NginxConf的名称} --overwrite update=$(date +%s)

如果使用的Value输出,则不需要,因为value本身是NginxConf对象中的某一个参数,当发生修改时,kubernetes会判定为NginxConf发生了改变,自然而然就会触发更新事件

由于部分图片违规,所以对域名做了遮掩处理,相关域名通过配置可查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1465790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Js的 Promise的 then catch 笔记240222

Js的 Promise的 then catch 笔记240222 基本用法 new Promise(f>{setTimeout(ev>{f("一秒后输出控制台");},1000); }).then(f的参数>{console.log(f的参数); }); // 控制台输出: 一秒后输出控制台上面代码中, f 的标准名叫做 resolve , 所以应该写成 new …

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本(通常命名content.js),在后台脚本(通常命名background.js或service-worker.js)中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台,执行如下步骤: 访问…

【Python笔记-设计模式】原型模式

一、说明 原型模式是一种创建型设计模式, 用于创建重复的对象,同时又能保证性能。 使一个原型实例指定了要创建的对象的种类,并且通过拷贝这个原型来创建新的对象。 (一) 解决问题 主要解决了对象的创建与复制过程中的性能问题。主要针对…

有哪些适合程序员的副业?

如果你经常玩知乎、看公众号(软件、工具、互联网这几类的)你就会发现,好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如:天涯神贴,基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下,迅雷…

QT_day4

1.思维导图 2. 输入闹钟时间格式是小时:分钟 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);id startTimer(1000);flag1;speecher new QTextT…

基础数据结构和算法《》

递归 1.递归应该一种比较常见的实现一些特殊代码逻辑时需要做的,但常常也是最绕的一种方式,在解释递归 之前,我们用循环和递归来做个比较1.1.如果你打开一扇门后,同样发现前方也有一扇们,紧接着你又打开下一扇门...直…

应用回归分析:泊松回归

泊松回归是一种广泛用于计数数据的回归分析方法。它适用于响应变量是非负整数的情况,特别是当这些计数呈现出明显的离散分布时。泊松回归通过泊松分布的概率分布函数来建模计数数据,使其成为处理计数数据的自然选择。本文将介绍泊松回归的基本概念、应用…

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状:石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下: A > B;B > C;C > A;">"左边一个字母,表示相对优…

进程线程通信-day6

1、将信号和消息队列的课堂代码敲一遍 //发送端 #include<myhead.h>//定义一个消息结构类型 struct msgbuf {long mtype;char mtext[1024]; }; //定义一个宏&#xff0c;表示消息正文大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const…

PBM模型学习

本专栏着重讲解PBM学习所得&#xff0c;学习笔记、心得&#xff0c;并附有视频素材资料&#xff0c;视频详细目录如下&#xff1a; PBM相关参数解释1 PBM相关参数解释2 PBM相关案例实践1 PBM相关案例实践2 PBM相关案例实践2 PBM相关案例实践3 PBM多相流中次相界面设置1 PBM多相…

Kotlin 进阶 学习 委托

1.接口委托 package com.jmj.jetpackcomposecompositionlocal.byStudy/*** 接口委托*/ interface HomeDao{fun getAllData():List<String> }interface ADao{fun getById(id:Int):String }class HomeDaoImpl:HomeDao{override fun getAllData(): List<String> {ret…

MATLAB中的稀疏矩阵和密集矩阵

在MATLAB中&#xff0c;矩阵可以表示为密集或稀疏格式。通常&#xff0c;矩阵默认以密集格式存储&#xff0c;这意味着每个元素都明确地存储在内存中&#xff0c;无论它的值是多少。然而&#xff0c;当矩阵含有大量的零元素时&#xff0c;这种存储方式就会变得非常低效。为了更…

iOS整理 - 关于直播 - 搭建服务端

前言 其实本人一直都想自己简单做一套直播&#xff08;包括移动端和服务端&#xff09;的开发测试&#xff0c;但是之前一直做得比较迷茫。最近偶然间在来了灵感&#xff0c;瞬间解除了我很多疑惑。我会分享出来&#xff0c;希望大家一起研究下。稍后&#xff0c;我完整做好了…

ZS Associates致盛咨询是什么公司?排名怎么样?

随着商业化时代的加速演进&#xff0c;咨询公司在企业发展中的“智囊团”角色愈发突显。对于医药企业来说&#xff0c;一个优秀的咨询团队不仅可以帮助推动整体战略转型及内部改革&#xff0c;还对药品研发、营销起到优化促进作用。 那什么样的咨询企业可称之为优秀的咨询企业…

关于msvcr120.dll丢失怎样修复的详细解决步骤方法分享,msvcr120.dll文件的相关内容

在电脑使用过程中&#xff0c;我们经常遇到各种系统错误&#xff0c;其中msvcr120.dll丢失是一个常见问题。msvcr120.dll文件是Visual C Redistributable for Visual Studio 2015/2017的一个组件&#xff0c;主要用于支持某些应用程序的正常运行。当电脑出现msvcr120.dll丢失情…

SpringBoot项目启动报java.nio.charset.MalformedInputException Input length = 1解决方案

报错详情 SpringBoot启动报错java.nio.charset.MalformedInputException: Input length 1 报错原因 出现这个的原因&#xff0c;就是解析yml文件时&#xff0c;中文字符集不是utf-8的原因&#xff0c;这是maven在项目编译时&#xff0c;默认字符集编码是GBK。 解决方式 检…

多数pythoneer只知有列表list却不知道python也有array数组

数组和列表 Python中数组和列表是不同的&#xff0c;我敢断言大多数的pythoneer只知道有列表list&#xff0c;却不知道python也有array数组。列表是一个包含不同数据类型的元素集合&#xff0c;而数组是一个只能含相同数据类型的元素集合。 Python的array库是一个提供数组操作…

ORA-02062: distributed recovery received DBID 9ad10df5, expected 38cc1cd5

今晚做重启维护&#xff0c;发现节点二上报错如下 Fri Feb 23 21:47:43 2024 Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_reco_58540.trc: ORA-02062: distributed recovery received DBID 9ad10df5, expected 38cc1cd5 Errors in file /u01/app/oracl…

DTV的LCN功能介绍

文章目录 LCN简介LCN获取LCN Conflict LCN简介 Logical Channel Number&#xff08;LCN&#xff09;是数字电视系统中用于标识和组织频道的逻辑编号。LCN的目的是为了方便用户浏览和选择频道&#xff0c;使得数字电视接收设备能够根据这些逻辑编号对频道进行排序和显示。 LCN…

基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型质量非常高&#xff0c;运行效果完美。本模型为4机并联孤岛系统&#xff0c;在下垂控制的基础上加入二次控制&#xff0c;二次电压与频率协同控制策略利用事件触发的方法来减少控制器的更新次数。该方法…