kubernetes(k8s) ingress及ingress docker-controller


什么是Ingress? --- HTTP 7層路由機制。將集群外部的HTTP和HTTPS路由暴露給集群中的服務, 流量路由由Ingress資源上定義的規則控制

    internet
        |
   [ Ingress ]
   --|-----|--
   [ Services ]

  

利用Ingress實現對外部訪問(以nginx為例)

1. 創建后端pod及service, 這里的service僅起到識別后端pod組的功能,不對外提供服務

使用deploy創建service和pod,下面是deploy yaml文件內容:

apiVersion: v1 kind: Service metadata: name: svc
-app namespace: develop # 這里是service需要工作的namespace spec: selector: app: nginx-test release: v0.2 ports: - name: http targetPort: 80 port: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: deploy-demo namespace: develop # 這里是自定義的后端pod需要工作的namespace spec: replicas: 3 selector: matchLabels: app: nginx-test release: v0.2 template: metadata: labels: app: nginx-test release: v0.2 spec: containers: - name: deploy-ngx image: nginx ports: - name: http containerPort: 80  # pod中的容器服務工作端口

執行命令創建后端服務:
# kubectl apply -f deploy-demo.yaml
 

 2. 創建Ingress-nginx Controller服務

# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
這里我使用的是通用的安裝方法,如果需要定制,可以參考: https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

 3. 自定義Ingress策略(通過Ingress發布app)

Ingress 策略yaml文件:

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-app namespace: develop  # 需要代理的后端Pod工作的namespace annotations: kubernetes.io/ingress.class: "nginx" # 這里必須要使用annotations說明Ingress的類型使用的是nginx spec: rules: - host: myapp.k8s.com # 這里是用虛擬主機來訪問(自己本地測試需要修改主機/etc/hosts的域名解析,把這個host添加進去),也可以使用path解析 http: paths: - path: backend: serviceName: svc-app  # 后端Pod的service name,通過service來生成nginx的upstrem servicePort: 80

執行以下命令創建:
# kubectl apply -f ingress-app.yaml
本機host文件添加域名解析

 

 4.  創建service-nodeport服務,這一步很重要,目的是為了ingress controller能接入外部流量

# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/baremetal/service-nodeport.yaml  #下載源配置文件
修改文件內容如下
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
   selector:  # 這里需要注意selector標簽必須和Ingress controller中的label匹配
       app.kubernetes.io/name: ingress-nginx
       app.kubernetes.io/part-of: ingress-nginx
   type: NodePort
   ports:
   - name: http
     port: 80
     targetPort: 80
     protocol: TCP
     nodePort: 30080  # 從pod映射到Node上的服務端口
   - name: https
     port: 443
     targetPort: 443
     protocol: TCP
     nodePort: 30443
 
        

 5. 然后就可以本機瀏覽器訪問 myapp.k8s.com

由於我是用的AWS EC2,沒有持有myapp.k8s.com這個域名解析,使用的本地解析,所以只能在機器上使用curl命令測試,測試結果如下:

 

 HTTPS特別說明:

如果需要支持https訪問,需要創建證書。以自建證書部署tomcat為例:

1. 沿用之前的Ingress Controller和service-nodeport不變

2. 創建后端tomcat pod及service:

root@k8s-master:/home/ubuntu/manifests/basic/ingress# cat deploy-tomcat.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
  namespace: develop
spec:
   selector:
       app: tomcat
       release: v1
   ports:
   - name: https
     targetPort: 8080
     port: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: tomcat-deploy
    namespace: develop
spec:
    replicas: 2
    selector:
        matchLabels:
            app: tomcat
            release: v1
    template:
        metadata:
            labels:
                app: tomcat
                release: v1
        spec:
            containers:
            - name: tomcat
              image: tomcat
              ports:
              - name: https
                containerPort: 8080  # tomcat工作端口

# kubectl apply -f
deploy-tomcat.yaml
 
        

 3. 自建SSL證書並通過ingress完成tomcat對外暴露:

# openssl genrsa -out tls.key 2048
# openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Chengdu/L=Chengdu/O=DevOps/CN=tomcat.k8s.com

# kubectl create secret tls tomcat
-ingress-secret --cert=tls.crt --key=tls.key
  

 

修改Ingress yaml策略:
root@k8s-master:/home/ubuntu/manifests/basic/ingress# cat ingress-tomcat.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tomcat namespace: develop  annotations: kubernetes.io/ingress.class: "nginx" # 這里必須要使用annotations說明Ingress的類型使用的是nginx spec:
tls:  # 必須添加證書獲取方式這一塊
- hosts:
- tomcat.k8s.com
secretName: tomcat-ingress-secret rules: - host: tomcat.k8s.com http: paths: - path: backend: serviceName: tomcat-svc  # tomcat后端pod service name servicePort: 443

執行以下命令創建:
# kubectl apply -f ingress-app.yaml

然后就可以通過瀏覽器訪問 https://tomcat.k8s.com:30443 # 由於是自建證書,瀏覽器不信任,但是依舊可以通過https方式打開
使用curl命令訪問需要 curl --insecure https://tomcat.k8s.com:30443 # 自建證書瀏覽器不識別可能依舊是不安全的,所以不再校驗。 --insecure表示忽略校驗步驟 -k和--insecure 等價

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM