为什么80%的码农都做不了架构师?>>>
ingress安装
获取安装所需配置文件位置
https://github.com/kubernetes/ingress-nginx/tree/master/deploy
注意选择tag对应的版本,我们这里选择0.20.0
ingress安装所需得文件:mandatory.yaml是其他文件的合集。
部署ingress
准备镜像,从这里mandatory.yaml查看需要哪些镜像
镜像名称 | 版本 | 下载地址 |
---|---|---|
k8s.gcr.io/defaultbackend-amd64 | 1.5 | registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64 |
quay.io/kubernetes-ingress-controller/nginx-ingress-controller | 0.20.0 | registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller |
更新mandatory.yaml中的镜像地址
替换 mandatory.yaml 中 defaultbackend-amd64 和 nginx-ingress-controller 镜像地址
部署nginx-ingress-controller
kubectl apply -f mandatory.yaml
查看ingress-nginx组件状态
[root@dev app]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
default-http-backend-7db7c45b69-cw5nl 1/1 Running 0 1h
nginx-ingress-controller-579fc9dd76-f468v 1/1 Running 0 1h
[root@dev app]# kubectl get service -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-http-backend ClusterIP 10.106.131.113 80/TCP 1h
[root@dev app]# curl 10.106.131.113
default backend - 404
[root@dev app]#
# 返回default backend - 404说明部署成功
创建NodePort类型得Service,接入外部流量
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
nodePort: 30080 #添加了这行,固定下外部访问的端口
- name: https
port: 443
targetPort: 443
protocol: TCP
nodePort: 30443 #添加了这行
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
测试
创建Deployment和对应的ClusterIP类型Service
apiVersion: v1
kind: Service
metadata:
name: business-demo
labels:
app: business-demo
spec:
ports:
- port: 20000
targetPort: 20000
#nodePort: 31001
protocol: TCP
type: ClusterIP
selector:
app: business-demo
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: business-demo
labels:
app: business-demo
spec:
replicas: 3
strategy:
rollingUpdate: ##由于replicas为3,则整个升级,pod个数在2-4个之间
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
template:
metadata:
labels:
app: business-demo
spec:
containers:
- image: dev.server:5000/woqu/business-demo:dev-0.0.1-SNAPSHOT
name: business-demo
volumeMounts:
- mountPath: "/home/project/dockerdemo/target"
name: business-demo
ports:
- containerPort: 20000
name: business-demo
readinessProbe:
httpGet:
path: /ready
port: 20000
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
imagePullSecrets:
- name: docker-rep
volumes:
- name: business-demo
hostPath:
path: "/opt/data/logs/business-demo"
创建Ingress
apiVersion: extensions/v1beta1 # kubectl api的版本
kind: Ingress # kubernetes的资源类型 这里是Ingress
metadata:
name: business-demo # 路由的名称
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: dev.master # 域名
http:
paths:
- path: /bdemo # 匹配路径
backend:
serviceName: business-demo # 转发的服务名
servicePort: 20000 # 转发到服务的哪个端口 对应上文的service port
配置说明
1-4行:跟Kubernetes的其他配置一样,ingress的配置也需要apiVersion,kind和metadata字段。配置文件的详细说明请查看部署应用, 配置容器和 使用resources.
5-6行: Nginx-Ingress-Controller的注解 配置。Nginx-Ingress-Controller的注解可以在这里查询 传送门
7-10行: Ingress spec 中包含配置一个loadbalancer或proxy server的所有信息。最重要的是,它包含了一个匹配所有入站请求的规则列表。目前ingress只支持http规则。
11-12行:每条http规则包含以下信息:一个host配置项(比如for.bar.com,在这个例子中默认是dev.master),path列表(比如:/bdemo),每个path都关联一个backend(比如test:80)。在loadbalancer将流量转发到backend之前,所有的入站请求都要先匹配host和path。
13-15行:正如 services doc中描述的那样,backend是一个service:port的组合。Ingress的流量被转发到它所匹配的backend。
Nginx-Ingress-Controller的注解可以在这里查询 传送门
查看部署情况
[root@dev app]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
business-demo dev.master 80 53m
## 请求应用,返回正常
[root@dev app]# curl http://dev.master:30080/bdemo/ready
true
[root@dev app]#
查看nginx配置
[root@dev app]# kubectl exec -n ingress-nginx -it nginx-ingress-controller-579fc9dd76-f468v -- /bin/bash
www-data@nginx-ingress-controller-579fc9dd76-f468v:/etc/nginx$ ls
fastcgi.conf mime.types scgi_params
fastcgi.conf.default mime.types.default scgi_params.default
fastcgi_params modsecurity template
fastcgi_params.default modules uwsgi_params
geoip nginx.conf uwsgi_params.default
koi-utf nginx.conf.default win-utf
koi-win opentracing.json
lua owasp-modsecurity-crs
www-data@nginx-ingress-controller-579fc9dd76-f468v:/etc/nginx$ more nginx.conf
TLS
你可以通过指定包含TLS私钥和证书的secret来加密Ingress。 目前,Ingress仅支持单个TLS端口443,并假定TLS termination。 如果Ingress中的TLS配置部分指定了不同的主机,则它们将根据通过SNI TLS扩展指定的主机名(假如Ingress controller支持SNI)在多个相同端口上进行复用。 TLS secret中必须包含名为tls.crt和tls.key的密钥,这里面包含了用于TLS的证书和私钥,例如:
apiVersion: v1
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
kind: Secret
metadata:
name: testsecret
namespace: default
type: Opaque
在Ingress中引用这个secret将通知Ingress controller使用TLS加密从将客户端到loadbalancer的channel:
piVersion: extensions/v1beta1
kind: Ingress
metadata:
name: no-rules-map
spec:
tls: #添加了tls这一段
- hosts:
- dev.master
secretName: testsecret #这里结束
backend:
serviceName: business-demo
servicePort: 20000
更新Ingress
kubectl edit ing business-demo
这会弹出一个包含已有的yaml文件的编辑器,修改它,保存它会更新API server中的资源,这会触发ingress controller重新配置loadbalancer。
当然,修改ingress yaml文件上用kubectl replace -f命令一样可以达到同样的效果。