美文网首页大数据&云计算
kubernetes通过Ingress-Controller卸载

kubernetes通过Ingress-Controller卸载

作者: 请叫我飘哥 | 来源:发表于2019-07-15 21:26 被阅读4次
  • 需求分析说明
    大家知道kubernetes中service是通过iptables或者ipvs生产的虚拟IP地址,由于iptables和ipvs是工作在4层的,而这一层是没有办法对第7层的https进协议进行解析,如有kubernetes要提供https的服务,那需要在后端提供服务的pod上配置ssl证书,这样一来在kubernetes内部也是通过https进行访问,这样不仅影响整体访问性能,并且管理大量的证书也将成为问题。那么有什么办法来解决这个问题呢? 答案就是通过Ingress-Control来卸载https,使得内部通信使用http协议,外部通信任然使用https,那为什么ingress-Control能卸载https呢?因为它本来就是一个运行在kubernetes上的一个pod。
  • 设计架构图


    访问流量设计
    • 定义Ingress资源,配置自动注入Ingress-Controller中
    • 客户端发起请求流量首先通过https协议到达提供Web服务的Service
    • Service将流量调度至关联的Ingress-Contorller
    • Ingress-Controller通过定义好的Ingress资源配置将流量调度到后端的pod上
  • Ingress-Controller安装
    官方文档路径
    可参考:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
该安装步骤花费时间比较长,主要是镜像较大下载比较慢,请耐心等待,大家可以提前下载镜像,
镜像地址 pull image  quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0   
也可以直接运行以下命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml


针对于自己搭建的kubernetes,需要通过nodeport的方式将服务发布至集群外部
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml

添加nodeProt:30080、30443这两个固定端口,前提是所有worknode都没有使用这两个端口。
vim service-nodeport.yaml
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
      nodePort: 30443

检查
[root@master ~]# kubectl  get pods -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-7995bd9c47-wjqch   1/1     Running   0          2d1h
[root@master ~]# kubectl  get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.111.39.187   <none>        80:30080/TCP,443:30443/TCP   47h
[root@master ~]# 

创建后台pod提供web服务,并通过service来管理pod节点
[root@master ingress-nginx]# vim ingress-myapp.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myingress
  namespace: default
spec:
  selector:
    app: myingress
    release: canary
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myingress-deploy
  namespace: default
spec:
  replicas: 5
  selector:
    matchLabels:
      app: myingress
      release: canary
  template:
    metadata:
      labels:
        app: myingress
        release: canary
    spec:
      containers:
      - name: myingress
        image: ikubernetes/myapp:v2
        ports:
        - name: http
          containerPort: 80
查看关联:myingress关联管理后端的pod
[root@master ingress-nginx]# kubectl  describe svc myingress
Name:              myingress
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"myingress","namespace":"default"},"spec":{"ports":[{"name":"http"...
Selector:          app=myingress,release=canary
Type:              ClusterIP
IP:                10.106.109.93
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.38:80,10.244.1.39:80,10.244.2.39:80 + 2 more...
Session Affinity:  None
Events:            <none>
[root@master ingress-nginx]# 

创建自签证书
[root@master ingress-nginx] openssl genrsa -out tls.kye 2048
[root@master ingress-nginx] openssl req -new -x509 -key tls.key -out tls.crt

创建证书资源
[root@master ingress-nginx] kubectl  create secret tls nginx-secret --cert=tls.crt --key=tls.key 
[root@master ingress-nginx]# kubectl  get secret nginx-secret
NAME           TYPE                DATA   AGE
nginx-secret   kubernetes.io/tls   2      47h

编辑ingress资源yaml文件
[root@master ingress-nginx]# vim nginx-ssl-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ssl
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - hosts:
    - nginx.peaoguo.com  #server's hostname必须与证书中保持一致
    secretName: nginx-secret  #kubernetes证书资源名称
  rules:
  - host: nginx.peaoguo.com  #自签证书中的Common Name即server's hostname
    http:
      paths:
      - path:
        backend:
          serviceName: myingress    #关联后端pod的service名称
          servicePort: 80              #后端pod web服务端口
创建ingress资源并注入ingress-Controller中
[root@master ingress-nginx]# kubectl  apppy -f nginx-ssl-ingress.yaml 

查看ingress-Contorller中配置是否生效
[root@master ingress-nginx]# kubectl  exec -it nginx-ingress-controller-7995bd9c47-wjqch -n ingress-nginx -- /bin/sh
$ cat nginx.conf

server {
        server_name nginx.peaoguo.com ;
        
        listen 80;
        
        set $proxy_upstream_name "-";
        set $pass_access_scheme $scheme;
        set $pass_server_port $server_port;
        set $best_http_host $http_host;
        set $pass_port $pass_server_port;
        
        listen 443  ssl http2;
        
        # PEM sha: 4d98ac3d91d0649fb02c4d19c5b2e353a7fb031f
        ssl_certificate                         /etc/ingress-controller/ssl/default-fake-certificate.pem;
        ssl_certificate_key                     /etc/ingress-controller/ssl/default-fake-certificate.pem;
        
        ssl_certificate_by_lua_block {
            certificate.call()
        }
        
        location / {
            
            set $namespace      "default";
            set $ingress_name   "nginx-ssl";
            set $service_name   "myingress";
            set $service_port   "80";
            set $location_path  "/";
            
            rewrite_by_lua_block {
                lua_ingress.rewrite({
                    force_ssl_redirect = true,
                    use_port_in_redirects = false,
                })
                balancer.rewrite()
                plugins.run()
            }
                   
  • 集群内部访问测试
[root@master ingress-nginx]# while true ; do curl -k https://nginx.peaoguo.com:443/hostname.html ;sleep 1 ; done
myingress-deploy-96d96877d-9rckx
myingress-deploy-96d96877d-j6d9d
myingress-deploy-96d96877d-j6d9d
myingress-deploy-96d96877d-9rckx
myingress-deploy-96d96877d-lw7tx
myingress-deploy-96d96877d-lw7tx
myingress-deploy-96d96877d-j6d9d
myingress-deploy-96d96877d-gxgwr
myingress-deploy-96d96877d-lw7tx
myingress-deploy-96d96877d-gxgwr
myingress-deploy-96d96877d-gxgwr
myingress-deploy-96d96877d-qt7c9
myingress-deploy-96d96877d-9rckx
  • 集群外部访问


    nginx.peaoguo.com
    nginx.peaoguo.com/hostname.html

相关文章

网友评论

    本文标题:kubernetes通过Ingress-Controller卸载

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