欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

K8S下 ingress 应用

程序员文章站 2022-05-04 08:04:11
...

ingress安装

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

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

K8S下 ingress 应用

注意选择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组件状态

[aaa@qq.com 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

[aaa@qq.com app]# kubectl get service -n ingress-nginx
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
default-http-backend   ClusterIP   10.106.131.113   <none>        80/TCP                       1h

[aaa@qq.com app]# curl 10.106.131.113
default backend - 404
[aaa@qq.com 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的注解可以在这里查询 传送门

查看部署情况

[aaa@qq.com app]# kubectl get ingress
NAME            HOSTS        ADDRESS   PORTS     AGE
business-demo   dev.master             80        53m

## 请求应用,返回正常
[aaa@qq.com app]# curl http://dev.master:30080/bdemo/ready
true
[aaa@qq.com app]#

查看nginx配置

[aaa@qq.com app]# kubectl exec -n ingress-nginx -it nginx-ingress-controller-579fc9dd76-f468v -- /bin/bash


aaa@qq.com:/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
aaa@qq.com:/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