zoukankan      html  css  js  c++  java
  • k8s的域名访问

    https://www.bilibili.com/video/av66617940?p=36

    一、域名访问设置

    1)获取ingress的pod。添加的路由规则都记录在里面

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
    [root@master ~]# kubectl get pod -n ingress-nginx
    NAME                                        READY   STATUS    RESTARTS   AGE
    nginx-ingress-controller-5694ccb578-78ldg   1/1     Running   5          23d
    [root@master ~]# kubectl exec nginx-ingress-controller-5694ccb578-78ldg -n ingress-nginx -it /bin/bash
    www-data@nginx-ingress-controller-5694ccb578-78ldg:/etc/nginx$ ls nginx.conf
    nginx.conf

     2)获取访问nginx的代理端口

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
    [root@master ~]# kubectl get svc -n ingress-nginx
    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx   NodePort   10.97.138.34   <none>        80:32116/TCP,443:30338/TCP   12s

    默认的执行的配置文件,协议端口随机变化

    apiVersion: v1
    kind: Service
    metadata:
      name: ingress-nginx
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      type: NodePort
      ports:
        - name: http
          port: 80
          targetPort: 80
          protocol: TCP
        - name: https
          port: 443
          targetPort: 443
          protocol: TCP
      selector:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    
    ---

    如果后面生成的域名访问方法

    curl www1.test.com:32116
    curl www2.test.com:32116

    二、域名访问具体示例

    1)例如设置访问域名 www1.test.com

    1.1)创建pod和service

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: deployment1
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            name: nginx
        spec:
          containers:
            - name: nginx
              image: wangyanglinux/myapp:v1
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-1
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      selector:
        name: nginx
    pod_service1.yaml

    1.2)设置访问的域名

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress1
    spec:
      rules:
        - host: www1.test.com
          http:
            paths:
            - path: /
              backend:
                serviceName: svc-1
                servicePort: 80
    ingress1.yaml

    访问

    [root@master test1]# curl www1.test.com:32116
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

    2)设置访问域名 www2.test.com

    2.1)创建pod和service

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: deployment2
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            name: nginx2
        spec:
          containers:
            - name: nginx2
              image: wangyanglinux/myapp:v2
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-2
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      selector:
        name: nginx2
    pod_service2.yaml

    2.2)设置访问的域名

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress2
    spec:
      rules:
        - host: www2.test.com
          http:
            paths:
            - path: /
              backend:
                serviceName: svc-2
                servicePort: 80
    ingress2.yaml

    2.3)查看 ingress

    [root@master ~]# kubectl get ingress
    NAME       HOSTS           ADDRESS   PORTS   AGE
    ingress1   www1.test.com             80      19m
    ingress2   www2.test.com             80      19m

    访问

    [root@master ~]# curl www1.test.com:32116
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    [root@master ~]# curl www2.test.com:32116
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

     三、使用加密的方式 https://www3.test.com进行访问

    1)创建证书 tls-secret 

    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/0=nginxsvc"
    kubectl create secret tls tls-secret --key tls.key --cert tls.crt

    2)创建pod和service

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: deployment3
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            name: nginx3
        spec:
          containers:
            - name: nginx3
              image: wangyanglinux/myapp:v3
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-3
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      selector:
        name: nginx3
    pod_service3.yaml

    3)设置的访问的域名,加载证书的方式

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress3
    spec:
      tls:
        - hosts:
          - www3.test.com
          secretName: tls-secret
      rules:
        - host: www3.test.com
          http:
            paths:
            - path: /
              backend:
                serviceName: svc-3
                servicePort: 80
    ingress3.yaml

    此时访问 已经 不是 http 服务了,需使用 443 端口 对应的端口

    4)访问服务

    [root@master https]# kubectl get svc -n ingress-nginx
    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx   NodePort   10.97.138.34   <none>        80:32116/TCP,443:30338/TCP   142m

     https://www3.test.com:30338 

     四、访问认证

    1) 设置 访问的认证 用户名 和密码

    [root@master ~]# yum install httpd -y
    [root@master ~]# mkdir -p basic-auth
    [root@master basic-auth]# htpasswd -c auth foo
    New password: 
    Re-type new password: 
    Adding password for user foo
    [root@master basic-auth]# ll
    total 4
    -rw-r--r-- 1 root root 42 Nov 11 01:34 auth

    2)创建  secret 引入 认证方式

    [root@master basic-auth]# kubectl create secret generic basic-auth --from-file=auth
    secret/basic-auth created

    3)添加 域名 引入 auth 认证

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress4
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
        nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
    spec:
      rules:
        - host: auth.test.com
          http:
            paths:
            - path: /
              backend:
                serviceName: svc-2
                servicePort: 80
    auth_ingress.yaml

    此时 访问 网站内容 ,需输入 用户名,密码

     用户名:foo

    密码:xxxxxxx

     五、地址跳转

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-test
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: https://www3.test.com:30338
    spec:
      rules:
      - host: re.test.com
        http:
          paths:
          - path: /
            backend:
              serviceName: svc-2
              servicePort: 80

    访问  re.test.com:32116 跳转到 https://www3.test.com:30338

    六、问题。代理的访问端口存在不确定性

    [root@master ~]# kubectl get svc -n ingress-nginx
    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx   NodePort   10.97.138.34   <none>        80:32116/TCP,443:30338/TCP   3h7m
    [root@master ~]# kubectl delete -f service-nodeport.yaml
    service "ingress-nginx" deleted
    
    [root@master ~]# kubectl apply -f service-nodeport.yaml 
    service/ingress-nginx created
    [root@master ~]# kubectl get svc -n ingress-nginx
    NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx   NodePort   10.106.225.226   <none>        80:31813/TCP,443:32425/TCP   1s

    重启了  service-nodeport.yaml 服务, 访问 的端口 将发生变化。

    6.1)修改配置文件,固定端口测试

    apiVersion: v1
    kind: Service
    metadata:
      name: ingress-nginx
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      type: NodePort
      ports:
        - name: http
          port: 80
          targetPort: 80
          nodePort: 30080
          protocol: TCP
        - name: https
          port: 443
          targetPort: 443
          nodePort: 30443
          protocol: TCP
      selector:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    
    ---

     测试

    [root@k8s-master01 ~]# kubectl get svc -n ingress-nginx
    NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx   NodePort   10.107.188.157   <none>        80:30080/TCP,443:30443/TCP   2s

     通用域名

    [root@nginx-internal0001 conf.d]# cat apaas.conf 
    upstream apaas-infra-http {
            server  apaas-master0001.eniot.io:80;
            server  apaas-master0002.eniot.io:80;
            server  apaas-master0003.eniot.io:80;
            check interval=3000 rise=2 fall=5 timeout=1000 default_down=false type=http port=1936;
            check_http_send "GET /healthz HTTP/1.0\r\n\r\n";
            check_http_expect_alive http_2xx http_3xx;
    }
    upstream apaas-infra-https {
            server  apaas-master0001.eniot.io:443;
            server  apaas-master0002.eniot.io:443;
            server  apaas-master0003.eniot.io:443;
            check interval=3000 rise=2 fall=5 timeout=1000 default_down=false type=http port=1936;
            check_http_send "GET /healthz HTTP/1.0\r\n\r\n";
            check_http_expect_alive http_2xx http_3xx;
    }
    server {
    listen 80;
        server_name *.apaas-gf1.eniot.io;
        underscores_in_headers on;
        client_max_body_size 100m;
        location / {
                proxy_pass  http://apaas-infra-http;
                proxy_set_header      Host    $host;
                proxy_set_header   X-Real-IP   $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_connect_timeout           3;
                proxy_send_timeout              9000;
                proxy_read_timeout              9000;
        }
      }
    server {
        listen 443 ssl;
        server_name *.apaas-gf1.eniot.io;
        ssl_certificate /etc/nginx/ssl/Server_wildcard_eniot_io_20180308.cer;
        ssl_certificate_key /etc/nginx/ssl/Server_wildcard_eniot_io_20180308.key;
        underscores_in_headers on;
        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto https;
                proxy_set_header X-Real-IP   $remote_addr;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_redirect off;
                proxy_ssl_verify off;
                proxy_ssl_session_reuse on;
                proxy_http_version 1.1;
                proxy_pass https://apaas-infra-https;
                proxy_connect_timeout           3;
                proxy_send_timeout              9000;
                proxy_read_timeout              9000;
        }
    }
    匹配域名

     *.apaas-ptt1.eniot.io       10.65.54.56 10.65.54.57

    新增域名                            私有云dns指向                  其它环境dns指向    其它环境
    apaas-ptt1.eniot.io         10.65.54.56 10.65.54.57    10.10.1.42     AWS中国、办公网
    *.apaas-ptt1.eniot.io       10.65.54.56 10.65.54.57    10.10.1.42     AWS中国、办公网
    apaas-internal.eniot.io    10.65.54.56 10.65.54.57
    harbor-cn2.eniot.io         52.80.242.65
    falcon-ptt1.eniot.io         10.10.1.42                         10.10.1.42     AWS中国、办公网
    notice.eniot.io                 10.10.1.42
    
    其中:10.65.54.56  10.65.54.57 nginx机器
    View Code
  • 相关阅读:
    springMVC源码学习地址
    JVM架构和GC垃圾回收机制详解
    String StringBuffer和StringBuilder区别及性能
    java reflect反射获取方法变量参数
    springMVC数据模型model,modelmap,map,@ModelAttribute的相互关系
    java abstract构造函数调用
    springMVC源码学习之addFlashAttribute源码分析
    LeetCode 404. Sum of Left Leaves
    利用JavaFX访问MySQL数据库
    LeetCode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/linu/p/11832560.html
Copyright © 2011-2022 走看看