K8S下 ingress 应用

为什么80%的码农都做不了架构师?>>>   hot3.png

ingress安装

获取安装所需配置文件位置

https://github.com/kubernetes/ingress-nginx/tree/master/deploy

K8S下 ingress 应用_第1张图片

注意选择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命令一样可以达到同样的效果。

转载于:https://my.oschina.net/orrin/blog/2990845

你可能感兴趣的:(K8S下 ingress 应用)