基于CentOS7.6搭建K8S-Ingress篇

在Dashboard篇中,UI界面已经存在,现在加上Ingress

Ingress

Ingress的主要作用是可以利用nginx,haproxy,envoy,traefik等负载均衡器来暴露集群内部服务。

包含两个组件

  • Ingress
    将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可
  • Ingress Controller
    将新加入的Ingress转化成Nginx的配置文件并使之生效

导入镜像

1
2
3
4
5
6
7
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
cat mandatory.yaml|grep image
docker pull image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1
# 分发给其他机器
docker sava -o ingress.tar 0439eb3e11f1
docker load -i ingress.tar
docker tag 0439eb3e11f1 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
# 强制命令
kubectl apply -f mandatory.yaml
# 编辑mandatory.yaml,在containers上添加
vi mandatory.yaml
spec:
hostNetwork: true
serviceAccountName: nginx-ingress-serviceaccount
containers:
# 基于Bare-metal安装
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
kubectl apply -f service-nodeport.yaml
# 验证安装
kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# mandatory.yaml装的是Ingress Controller
# service-nodeport装的是服务
# 自己编写一个Ingress的yaml文件,如下
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx # 与service的命名空间一致
spec:
rules:
- host: node01 # host可以自定义
http:
paths:
- path: / # 自定义
backend:
serviceName: ingress-nginx # 服务名
servicePort: 10254 # service的内部端口(内部端口:宿主机端口)
# 测试一下,IP地址是Ingress Controller所在节点IP
curl -v http://192.168.17.131 -H 'host: node01'

附加测试-ingress-tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 首先创建Service和Deployment(默认default命名空间)
vi tomcat-deploy.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: http
targetPort: 8080
port: 8080
- name: ajp
targetPort: 8009
port: 8009
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
release: canary
template:
metadata:
labels:
app: tomcat
release: canary
spec:
containers:
- name: tomcat
image: tomcat
ports:
- name: http
containerPort: 8080

kubectl apply -f tomcat-deploy.yaml

# 创建Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: www.tomcat.com
http:
paths:
- path:
backend:
serviceName: tomcat
servicePort: 8080

kubectl apply -f ingress-tomcat.yaml

# 修改hosts
IP(Ingress Controller所在IP) www.tomcat.com
# 访问
http://www.tomcat.com/

启用Https

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 生成私钥 tls.key, 密钥位数是 2048
openssl genrsa -out tls.key 2048
# 使用 tls.key 生成自签证书
openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=GuangDong/L=Guangzhou/O=DevOps/CN=www.tomcat.com
kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
kubectl get secret
kubectl describe secret tomcat-ingress-secret

# 创建Ingress
vi ingress-tomcat-tls.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat-tls
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- www.tomcat.com
secretName: tomcat-ingress-secret
rules:
- host: www.tomcat.com
http:
paths:
- path:
backend:
serviceName: tomcat
servicePort: 8080

kubectl apply -f ingress-tomcat-tls.yaml
kubectl get ingress
kubectl describe ingress ingress-tomcat-tls

# 访问
https://www.tomcat.com/