一、 Ingress 配置

介绍
kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,负责统一管理外部对k8s cluster中service的请求。通过定义Ingress Resoucre(Ingress,Ingress Controller,Ingress Service)等实现。常用的Ingress Controller 是ingress-nginx。

工作的原理是:

Ingress Contronler 通过与 Kubernetes API 交互,Ingress Controller 会动态感知集群中的Ingress的规则变化,然后读取,动态生成Nginx的配置文件,最后注入到运行 Nginx-ingress-control的pod的中,这个 Ingress Contronler 的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后会自动reload,配置生效。

对比:
用kubernetes Ingress 是由于它是7层调度,可以直接卸载https会话,代理的后端的pod可以直接使用明文的http协议。

而Service NodePort得类型,是4层得调度,做不到这点,然而现在https是一种趋势,所以在kubernetes 对外暴露服务得时候我们还是要选择Ingress。

部署

官方地址:https://github.com/kubernetes/ingress-nginx

下载部署文件:

kubernetes ingress配置 kubernetes ingress controller_github


这里下载的是ingress-nginx 0.24.1版

# mandatory.yaml为ingress所有资源yml文件的集合
#若是单独部署,需要分别下载configmap.yaml、namespace.yaml、rbac.yaml、service-nodeport.yaml、with-rbac.yaml
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml

# service-nodeport.yaml为ingress通过nodeport对外提供服务,注意默认nodeport暴露端口为随机,可以编辑该文件自定义端口
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/baremetal/service-nodeport.yaml

若是单独部署,需要分别下载configmap.yaml、namespace.yaml、rbac.yaml、service-nodeport.yaml、with-rbac.yaml,也可以使用git克隆整个仓库到本地。

[root@master ingress]# for file in namespace.yaml configmap.yaml rbac.yaml with-rbac.yaml;do wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/$file;done

创建ingress资源

[root@master ingress]# kubectl apply -f mandatory.yaml
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created

因为使用的是裸机部署,要想要引入外部流量,还需要创建service-nodeport这一个service资源。没有这个文件,是无法通过外部访问的。这个文件主要是为ingress controller创建了一个Nodeport类型的service。

创建service-nodeport这个service资源

[root@master ingress]# kubectl apply -f service-nodeport.yaml
service/ingress-nginx created

访问测试,显示404,说明调度器已经正常工作了,只是后端pod的规则还没有定义。

kubernetes ingress配置 kubernetes ingress controller_bc_02

创建svc及后端deployment

[root@master kube_manifest]# vim test-ingress-deploy.yaml 

apiVersion: v1
kind: Service
metadata:
  name: myapp-ingress-svc
  namespace: default
spec:
  selector:
    app: myapp
    env: test
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-test-ingress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      env: test
  template:
    metadata:
      labels:
        app: myapp
        env: test
    spec:
      containers:
      - name: myapp
        image: nginx:1.14-alpine
        ports:
        - name: http
          containerPort: 80
[root@master kube_manifest]# kubectl apply -f test-ingress-deploy.yaml 
service/myapp-ingress-svc created
deployment.apps/myapp-test-ingress created

查看pod部署情况

[root@master kube_manifest]# kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
myapp-test-ingress-554b88bc89-9ng78   1/1     Running   0          31s
myapp-test-ingress-554b88bc89-n296x   1/1     Running   0          31s
myapp-test-ingress-554b88bc89-ndt9z   1/1     Running   0          31s

查看Service

[root@master kube_manifest]# kubectl get svc | grep myapp-ingress
myapp-ingress-svc   ClusterIP   10.99.110.120   <none>        80/TCP         5m52s

创建ingress规则

在ingress规则中,要指定需要指定后端deploy的service名称。

[root@master ingress]# vim ingress-myapp.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myapp
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx" ##注解,指明要用到的ingress controller是nginx,这样才能转换成对应的规则
spec:
  rules:
  - host: www.cwj.com
    http:
      paths:
      - path:
        backend:
          serviceName: myapp-ingress-svc
          servicePort: 80
[root@master ingress]# kubectl apply -f ingress-myapp.yaml 
ingress.extensions/ingress-myapp created
[root@master ingress]# kubectl get ingress
NAME            CLASS    HOSTS         ADDRESS   PORTS   AGE
ingress-myapp   <none>   www.cwj.com             80      25s
[root@master ingress]# kubectl describe ingress ingress-myapp
Name:             ingress-myapp
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host         Path  Backends
  ----         ----  --------
  www.cwj.com  
                  myapp-ingress-svc:80 (10.244.1.34:80,10.244.2.26:80,10.244.2.27:80)
Annotations:   kubernetes.io/ingress.class: nginx
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  60s   nginx-ingress-controller  Ingress default/ingress-myapp

在本地主机配置hosts域名解析,这里使用的是windows主机。
编辑hosts文件,windows\system32\drivers\etc\hosts。

192.168.147.132     www.cwj.com
192.168.147.133     www.cwj.com
192.168.147.134     www.cwj.com

然后主机浏览器访问,这里访问时需要加上svc映射到主机时指定的nodePort端口号。

kubernetes ingress配置 kubernetes ingress controller_bc_03


总结:

1、创建一个deployment资源用于运行nginx,pod副本为3个;

2、为后端的nginx pod创建service服务,名称为myapp-ingress-svc

3、创建ingress规则,通过ingress把后端的pod暴露出去

注意:这里对于为nginx创建的svc服务,并没有起到调度作用,只是收集pod资源,用于分类。因为实际调度过程中,流量是直接通过ingress规则调度到后端的pod,而没有经过svc服务,svc只是提供一个收集pod的作用。