一 手动部署-官网版
1.1 获取资源
[root@master01 ~]# mkdir ingress
[root@master01 ~]# cd ingress/
[root@master01 ingress]# git clone https://github.com/nginxinc/kubernetes-ingress/
[root@master01 ingress]# cd kubernetes-ingress/deployments
[root@master01 ingress]# git checkout v1.7.0
1.2 安装RBAC
[root@master01 deployments]# kubectl apply -f common/ns-and-sa.yaml #部署namespace及ServiceAccount
[root@master01 deployments]# kubectl apply -f rbac/rbac.yaml #部署RBAC角色及权限等
1.3 安装基础资源
[root@master01 deployments]# kubectl apply -f common/default-server-secret.yaml
说明:
创建TLS证书和NGINX中默认服务器的secret。默认服务器返回Not Found页面,其中包含404状态代码,用于未定义的所有访问规则请求的返回值。默认包含了一个自签名的证书和生成的密钥。
[root@master01 deployments]# kubectl apply -f common/nginx-config.yaml
[root@master01 deployments]# kubectl apply -f common/vs-definition.yaml
[root@master01 deployments]# kubectl apply -f common/vsr-definition.yaml
[root@master01 deployments]# kubectl apply -f common/ts-definition.yaml #创建虚拟主机
[root@master01 deployments]# kubectl apply -f common/gc-definition.yaml
[root@master01 deployments]# kubectl apply -f common/global-configuration.yaml
1.4 安装ingress controllers
[root@master01 deployments]# vi daemon-set/nginx-ingress.yaml
1 …… 2 - -global-configuration=$(POD_NAMESPACE)/nginx-configuration 3 ……
[root@master01 deployments]# kubectl apply -f daemon-set/nginx-ingress.yaml
[root@master01 deployments]# kubectl get pods --namespace=nginx-ingress
NAME READY STATUS RESTARTS AGE
nginx-ingress-cqv2m 1/1 Running 0 43s
nginx-ingress-fpmbv 1/1 Running 0 43s
nginx-ingress-kdl9p 1/1 Running 0 43s
nginx-ingress-lggw9 1/1 Running 0 43s
nginx-ingress-lnw28 1/1 Running 0 43s
nginx-ingress-z8rn8 1/1 Running 0 43s
1.5 创建ingress controllers service
[root@master01 deployments]# vi service/nodeport.yaml
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: nginx-ingress 5 namespace: nginx-ingress 6 spec: 7 type: NodePort 8 ports: 9 - port: 80 10 targetPort: 80 11 protocol: TCP 12 name: http 13 nodePort: 30011 14 - port: 443 15 targetPort: 443 16 protocol: TCP 17 name: https 18 nodePort: 30012 19 selector: 20 app: nginx-ingress
[root@master01 deployments]# kubectl create -f service/nodeport.yaml
[root@master01 deployments]# kubectl get svc nginx-ingress --namespace=nginx-ingress
[root@master01 deployments]# kubectl describe svc nginx-ingress --namespace=nginx-ingress
参考文档:https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/。
二 手动部署-github社区版(推荐)
2.1 获取资源
[root@master01 ~]# mkdir ingress
[root@master01 ~]# cd ingress/
[root@master01 ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml
[root@master01 ingress]# vi deploy.yaml
1 …… 2 apiVersion: apps/v1 3 kind: Deployment 4 …… 5 spec: 6 replicas: 3 7 …… 8 - --default-backend-service=$(POD_NAMESPACE)/default-http-backend 9 …… 10 apiVersion: v1 11 kind: Service 12 …… 13 name: ingress-nginx-controller 14 …… 15 spec: 16 type: NodePort 17 externalTrafficPolicy: Local 18 ports: 19 - name: http 20 port: 80 21 protocol: TCP 22 targetPort: http 23 nodePort: 80 24 - name: https 25 port: 443 26 protocol: TCP 27 targetPort: https 28 nodePort: 443 29 ……
[root@master01 ingress]# kubectl create -f deploy.yaml
提示:添加默认backend需要等待default-backend创建完成controllers才能成功部署。
2.2 创建default backend
[root@master01 ingress]# vi default-backend.yaml
1 --- 2 apiVersion: apps/v1 3 kind: Deployment 4 metadata: 5 name: default-http-backend 6 labels: 7 app.kubernetes.io/name: default-http-backend 8 app.kubernetes.io/part-of: ingress-nginx 9 namespace: ingress-nginx 10 spec: 11 replicas: 1 12 selector: 13 matchLabels: 14 app.kubernetes.io/name: default-http-backend 15 app.kubernetes.io/part-of: ingress-nginx 16 template: 17 metadata: 18 labels: 19 app.kubernetes.io/name: default-http-backend 20 app.kubernetes.io/part-of: ingress-nginx 21 spec: 22 terminationGracePeriodSeconds: 60 23 containers: 24 - name: default-http-backend 25 # Any image is permissible as long as: 26 # 1. It serves a 404 page at / 27 # 2. It serves 200 on a /healthz endpoint 28 image: k8s.gcr.io/defaultbackend-amd64:1.5 29 livenessProbe: 30 httpGet: 31 path: /healthz 32 port: 8080 33 scheme: HTTP 34 initialDelaySeconds: 30 35 timeoutSeconds: 5 36 ports: 37 - containerPort: 8080 38 resources: 39 limits: 40 cpu: 10m 41 memory: 20Mi 42 requests: 43 cpu: 10m 44 memory: 20Mi 45 46 --- 47 apiVersion: v1 48 kind: Service 49 metadata: 50 name: default-http-backend 51 namespace: ingress-nginx 52 labels: 53 app.kubernetes.io/name: default-http-backend 54 app.kubernetes.io/part-of: ingress-nginx 55 spec: 56 ports: 57 - port: 80 58 targetPort: 8080 59 selector: 60 app.kubernetes.io/name: default-http-backend 61 app.kubernetes.io/part-of: ingress-nginx 62 ---
[root@master01 ingress]# kubectl create -f default-backend.yaml
2.3 确认验证
[root@master01 ingress]# kubectl get pods -n ingress-nginx
[root@master01 ingress]# kubectl get svc -n ingress-nginx
参考文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md。
三 ingress使用
3.1 创建demo环境
[root@master01 ingress]# vi deploy-demo01.yaml #创建第一个用于测试的svc和pod
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: mydemo01svc 5 namespace: default 6 spec: 7 selector: 8 app: mydemo01 9 ports: 10 - name: http 11 port: 80 12 targetPort: 80 13 --- 14 apiVersion: apps/v1 15 kind: Deployment 16 metadata: 17 name: mydemo01pod 18 spec: 19 replicas: 3 20 selector: 21 matchLabels: 22 app: mydemo01 23 template: 24 metadata: 25 labels: 26 app: mydemo01 27 spec: 28 containers: 29 - name: myapp 30 image: ikubernetes/myapp:v2 31 ports: 32 - name: httpd 33 containerPort: 80
[root@master01 ingress]# echo 'Hello world!
' > index.html #创建Tomcat测试页面
[root@master01 ingress]# scp index.html root@worker01:/etc/kubernetes/
[root@master01 ingress]# scp index.html root@worker02:/etc/kubernetes/
[root@master01 ingress]# scp index.html root@worker02:/etc/kubernetes/
[root@master01 ingress]# vi deploy-demo02.yaml #创建第二个用于测试的svc和pod
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: mydemo02svc 5 namespace: default 6 spec: 7 selector: 8 app: mydemo02 9 ports: 10 - name: httpd 11 port: 8080 12 targetPort: 8080 13 14 --- 15 apiVersion: apps/v1 16 kind: Deployment 17 metadata: 18 name: mydemo02pod 19 spec: 20 replicas: 3 21 selector: 22 matchLabels: 23 app: mydemo02 24 template: 25 metadata: 26 labels: 27 app: mydemo02 28 spec: 29 containers: 30 - name: mytomcat 31 image: tomcat:9 32 ports: 33 - name: httpd 34 containerPort: 8080 35 volumeMounts: 36 - mountPath: "/usr/local/tomcat/webapps/ROOT/index.html" 37 name: sample-volume 38 readOnly: true 39 volumes: 40 - name: sample-volume 41 hostPath: 42 type: File 43 path: /etc/kubernetes/index.html
[root@master01 ingress]# kubectl apply -f deploy-demo01.yaml
[root@master01 ingress]# kubectl apply -f deploy-demo02.yaml
[root@master01 ingress]# kubectl get pods -o wide
[root@master01 ingress]# kubectl get svc -o wide
3.2 创建ingress策略
[root@master01 ingress]# vi deploy-demo-ingress-http.yaml
1 apiVersion: networking.k8s.io/v1beta1 2 kind: Ingress 3 metadata: 4 name: ingress-mydemo 5 namespace: default 6 annotations: 7 kubernetes.io/ingress.class: "nginx" 8 spec: 9 rules: 10 - host: demo01.linuxsb.com 11 http: 12 paths: 13 - path: 14 backend: 15 serviceName: mydemo01svc 16 servicePort: 80 17 - host: demo02.linuxsb.com 18 http: 19 paths: 20 - path: 21 backend: 22 serviceName: mydemo02svc 23 servicePort: 8080
[root@master01 ingress]# kubectl apply -f deploy-demo-ingress-http.yaml
[root@master01 ingress]# kubectl get pods -o wide
[root@master01 ingress]# kubectl get svc -o wide
[root@master01 ingress]# kubectl get ingress -o wide
3.3 确认验证
添加demo01.odocker.com和demo02.odocker.com的解析。分别访问两个地址:
参考:https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/
四 ingress https使用
4.1 创建证书
使用自签名证书,证书创建参考《附008.Kubernetes TLS证书介绍及创建》。
4.2 创建secret
[root@master01 ingress]# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout demo02.key -out demo02.crt -subj "/CN=demo02.odocker.com"
[root@master01 ingress]# kubectl create secret generic demo02-tls --from-file=demo02.crt --from-file=demo02.key -n default
[root@master01 ingress]# kubectl get secret demo02-tls
NAME TYPE DATA AGE
demo02-tls Opaque 2 27s
4.3 创建TLS ingress策略
[root@master01 ingress]# vi deploy-demo-ingress-https.yaml
1 apiVersion: networking.k8s.io/v1beta1 2 kind: Ingress 3 metadata: 4 name: ingress-mydemo02-https 5 namespace: default 6 annotations: 7 kubernets.io/ingress.class: "nginx" 8 spec: 9 tls: 10 - hosts: 11 - demo02.odocker.com 12 secretName: demo02-tls 13 rules: 14 - host: demo02.odocker.com 15 http: 16 paths: 17 - path: 18 backend: 19 serviceName: mydemo02svc 20 servicePort: 8080
[root@master01 ingress]# kubectl apply -f deploy-demo-ingress-https.yaml
4.4 确认验证
浏览器访问:https://demo02.odocker.com/。