第十章 Ingress
一、資料信息
自定義域名能夠指向某個services。
Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx
Ingress-Nginx 官方網站:https://kubernetes.github.io/ingress-nginx/
二、部署 Ingress-Nginx
https://kubernetes.github.io/ingress-nginx/deploy/#docker-for-mac
#cd /usr/local/install-k8s/plugin/ #mkdir ingress #cd ingress #wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/cloud/deploy.yaml #cat deploy.yaml | grep image
#docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0 #其他node機器也需要執行
#docker save -o ingress.contr.tar quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0 #可以保存 #tar -zcvf ingress.contr.tar.gz ingress.contr.tar #tar -zxvf ingress.contr.tar.gz #docker load -i ingress.contr.tar
#kubectl apply -f deploy.yaml
#kubectl get pod -n ingress-nginx
https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal
#wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml #kubectl apply -f deploy.yaml.1 #文件存在會自動增加文件后綴
#kubectl get svc -n ingress-nginx
Ingress HTTP 代理訪問
deployment、Service、Ingress Yaml 文件
#cd ~
#vim ingress.http.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-dm spec: replicas: 2 template: metadata: labels: name: nginx spec: containers: - name: nginx image: hub.atguigu.com/library/nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx
#kubectl apply -f ingress.http.yaml
#kubectl get svc
#kubectl get deployment
#kubectl get pod
#cd - #vim ingress1.yaml apiVersion: extensions/v1beta1 kind: Ingress #其實Ingress是Service metadata: name: nginx-test spec: rules: - host: www1.atguigu.com #主機名 http: paths: - path: / backend: serviceName: nginx-svc #服務名 servicePort: 80
#kubectl create -f ingress1.yaml
#kubectl get svc -n ingress-nginx #通過svc命令訪問Service,-n 表示使用命名空間
#kubectl get ingress #通過ingress命令訪問ingress
設置host文件,192.168.4.86 www1.atguigu.com
瀏覽器訪問:http://www1.atguigu.com:31107/
根據不同的域名指向不同的svc,實現上圖的yaml文件如下:
#vim deployment1.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: deployment1 spec: replicas: 2 template: metadata: labels: name: nginx spec: containers: - name: nginx image: hub.atguigu.com/library/nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: svc-1 spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx #kubectl apply -f deployment1.yaml #kubectl get svc #curl svc-2的ipadress #cp -a deployment1.yaml deployment2.yaml #vim deployment2.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: deployment2 spec: replicas: 2 template: metadata: labels: name: nginx2 spec: containers: - name: nginx2 image: hub.atguigu.com/library/nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: svc-2 spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx2 #kubectl apply -f deployment2.yaml #kubectl get svc #curl svc-1的ipadress #vim ingressrule.yaml #根據域名指向不同的svc apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress1 spec: rules: - host: www1.atguigu.com #www1指向svc-1 http: paths: - path: / backend: serviceName: svc-1 servicePort: 80 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress2 spec: rules: - host: www2.atguigu.com #www2指向svc-2 http: paths: - path: / backend: serviceName: svc-2 servicePort: 80 #kubectl apply -f ingressrule.yaml #kubectl get pod -n ingress-nginx #kubectl exec nginx-ingress-controller-*****-*** -n ingress-nginx -it -- /bin/bash #進入nginx容器的pod里面 #cat nginx.conf #在nginx容器看nginx的配置文件
#exit #退出容器
#kubectl get svc -c ingress-nginx #查看service的端口
#kubectl get ingress
設置host文件,192.168.4.86 www2.atguigu.com
瀏覽器訪問:http://www1.atguigu.com:31107/
瀏覽器訪問:http://www2.atguigu.com:31107/
三、Ingress HTTPS 代理訪問
創建證書,以及 cert 存儲方式
#cd ~ #mkdir https #cd https
#創建證書 #openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj"/CN=nginxsvc/O=nginxsvc" #kubectl create secret tls tls-secret --key tls.key --cert tls.crt #vim deployment3.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: deployment3 spec: replicas: 2 template: metadata: labels: name: nginx3 spec: containers: - name: nginx3 image: hub.atguigu.com/library/nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: svc-3 spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx #kubectl apply -f deployment3.yaml #vim https.ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: https spec: tls: - hosts: - www3.atguigu.com #www3綁定證書 secretName: tls-secret #指定證書名稱 rules: - host: www3.atguigu.com #www3指向svc-3 http: paths: - path: / backend: serviceName: svc-3 servicePort: 80 #kubectl apply -f https.ingress.yaml #kubectl get svc -n ingress-nginx #查看https的端口
設置host文件,192.168.4.86 www3.atguigu.com
瀏覽器訪問:https://www3.atguigu.com:32135/
四、Nginx 進行 BasicAuth
給nginx加一個基礎認證
https://kubernetes.github.io/ingress-nginx/examples/auth/basic/#basic-authentication
#yum -y install httpd
#cd ~
#mkdir basic-auth
#cd basic-auth #htpasswd -c auth foo #文件名為auth,用戶名為foo #kubectl create secret generic basic-auth --from-file=auth
#vim auth.ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name:ingress-with-auth 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.atguigu.com http: paths: - path: / backend: serviceName: svc-1 servicePort: 80 #kubectl apply -f auth.ingress.yaml
設置host文件,192.168.4.86 auth.atguigu.com
瀏覽器訪問:http://auth.atguigu.com:31107/
輸入用戶名和密碼
五、Nginx 進行重寫
#vim redirect.ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-test annotations: nginx.ingress.kubernetes.io/rewrite-target: https://www3.atguigu.com:32135/hostname.html spec: rules: - host: re.bar.com #訪問re跳轉www3 http: paths: - path: / backend: serviceName: svc-1 #可以不寫 servicePort: 80 #kubectl apply -f redirect.ingress.yaml
設置host文件,192.168.4.86 re.atguigu.com
瀏覽器訪問:http://re.atguigu.com:31107/