AWS运维部署实践--内外网Ingress配置验证实践
# 前言
EKS集群拉起之后,事情并没有结束,因为想要集群内的服务被外部访问,势必需要Ingress的配置,上文中已经讲了ingress-controller的安装,那么本文将通过一些实际例子,来介绍内外网ingress的配置用法。
# 公有 ingress
# 准备工作
首先需要对公有子网进行打标,关于打标,可见此文档:子网自动发现 (opens new window)。
当然前边部署的时候已经介绍过此事项,如果已经配置过,则可略过。
# 如果是公有子网,则打标:
kubernetes.io/role/elb=1
# 如果是私有子网,则打标:
kubernetes.io/role/internal-elb=1
2
3
4
5
# 部署服务
准备yaml。
原文件地址为:点我查看 (opens new window),我这里稍微调整内容如下,
2048_full.yaml
:--- apiVersion: v1 kind: Namespace metadata: name: ops --- apiVersion: apps/v1 kind: Deployment metadata: namespace: ops name: deployment-2048 spec: selector: matchLabels: app.kubernetes.io/name: app-2048 replicas: 2 template: metadata: labels: app.kubernetes.io/name: app-2048 spec: containers: - image: public.ecr.aws/l6m2t8p7/docker-2048:latest imagePullPolicy: Always name: app-2048 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: namespace: ops name: service-2048 spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app.kubernetes.io/name: app-2048 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: ops name: ingress-2048 annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: service-2048 port: number: 80
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部署服务
$ kubectl apply -f 2048_full.yaml
1查看服务,正常拉起之后,可以看到 ingress 的监听:
$ k get ingress -n ops NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 alb * k8s-ops-ingress2-3d319b8e28-734433292.ap-southeast-1.elb.amazonaws.com 80 2m24s
1
2
3
有了监听之后,可直接访问返回的地址,此地址如果访问不通,可能是拉起的 lb 关联的安全组需要加下规则。
此时访问 k8s-ops-ingress2-3d319b8e28-734433292.ap-southeast-1.elb.amazonaws.com (opens new window) 就可以看到对应的 2048 的页面。
# 添加域名
上边的示例是启动一个示例服务,并且通过aws提供的一个访问入口进行请求,实际生产业务中,我们会把自定义域名指向自己集群内的服务,现在来介绍一下配置方式。
废话不多说,这里直接进入正题。
# 先将证书导入到aws证书管理器
这里以eryajf.net
域名举例。
AWS支持完善的域名托管能力,支持自动续期,当然也支持你将已经申请好的证书导入进来,这里我演示一下导入证书的用法。
先下载好域名证书,在AWS中,可以通过控制台,或者命令行两种形式把证书导入。
# 控制台导入
来到Certificate Manager
,然后点击导入证书,需要注意,通常我们下载的证书是NGINX格式的,那么证书的正文只需要导入pem文件的第一段,而非完整内容,否则会在导入的时候,提示无法导入:
导入成功之后,会自动识别,然后可以拿到证书的arn。
# 命令行导入
第二种方式,可通过命令行导入:
$ aws acm import-certificate --certificate fileb://eryajf.net_bundle.crt --private-key fileb://eryajf.net.key
需要注意:此处的crt文件仍然也是只能保留第一段内容。命令执行完毕之后,会返回该证书的arn信息。
# 演示2048自定义域名
此处先演示上边2048游戏的自定义域名。
配置如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: ops
name: ingress
annotations:
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-southeast-1:AWS_ACCOUNT_ID:certificate/SSL_CERT_ID # https证书,就是上面创建的证书的arn
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' # 监听端口
alb.ingress.kubernetes.io/scheme: internet-facing # 开放外网访问
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb # 指定ingressclass类型,k8s-1.18及以后的版本推荐这种配置方式,旧版本需要在注释中加入 kubernetes.io/ingress.class: alb
rules:
- host: 2048.eryajf.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-2048
port:
number: 80
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
然后创建这个ingress:
k apply -f 2048.yaml
查看这个ingress:
$ k get ingress -n ops
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress alb 2048.eryajf.net k8s-ops-ingress-c5612bc56a-346058994.ap-southeast-1.elb.amazonaws.com 80 3h53m
2
3
4
5
然后给域名添加解析,此时访问 2048.eryajf.net
就可以访问到这个服务了。
# 配置一个go服务
whoami (opens new window)是一个验证服务访问的工具,我们通过如下方式将其部署起来:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: ops
name: ingress
annotations:
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-southeast-1:AWS_ACCOUNT_ID:certificate/SSL_CERT_ID # https证书,就是上面创建的证书的arn
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' # 监听端口
alb.ingress.kubernetes.io/scheme: internet-facing # 开放外网访问
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb # 指定ingressclass类型,k8s-1.18及以后的版本推荐这种配置方式,旧版本需要在注释中加入 kubernetes.io/ingress.class: alb
rules:
- host: 2048.eryajf.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-2048
port:
number: 80
- host: gotest.eryajf.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-whoami-service
port:
number: 80
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
然后执行apply,之后增加对应域名解析。
$ curl https://gotest.eryajf.net
Hostname: go-whoami-87f8586ff-g7w7v
IP: 127.0.0.1
IP: ::1
IP: 10.172.3.122
IP: fe80::2c3d:22ff:fe45:aecb
RemoteAddr: 10.172.103.161:22154
GET / HTTP/1.1
Host: gotest.eryajf.net
User-Agent: curl/7.79.1
Accept: */*
X-Amzn-Trace-Id: Root=1-6688faf8-6cf2c60c4b2dd36b25007ea0
X-Forwarded-For: 183.129.165.114
X-Forwarded-Port: 443
X-Forwarded-Proto: https
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置多个证书
用逗号可以分割多个证书的arn
,yaml示例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: ops
name: ingress
annotations:
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-southeast-1:AWS_ACCOUNT_ID:certificate/SSL_CERT_ID_1,arn:aws:acm:ap-southeast-1:AWS_ACCOUNT_ID:certificate/SSL_CERT_ID_2 # https证书,就是上面创建的证书的arn
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' # 监听端口
alb.ingress.kubernetes.io/scheme: internet-facing # 开放外网访问
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb # 指定ingressclass类型,k8s-1.18及以后的版本推荐这种配置方式,旧版本需要在注释中加入 kubernetes.io/ingress.class: alb
rules:
- host: gotest.eryajf.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-whoami-service
port:
number: 80
- host: gotest.erzong.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-whoami-service
port:
number: 80
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
将域名证书的arn
通过逗号进行分割,然后下边配置规则中直接配置即可,alb会自动匹配对应后缀的域名证书。
# 私有 ingress
上边介绍的例子都是公有ingress,接下来介绍一下私有的ingress怎么配置。
在注解中的 alb.ingress.kubernetes.io/scheme
用于标识lb的类型为公网或内网。
所以只需要简单调整为下:
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: ops
name: ingress-internal
annotations:
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-southeast-1:AWS_ACCOUNT_ID:certificate/SSL_CERT_ID_1,arn:aws:acm:ap-southeast-1:AWS_ACCOUNT_ID:certificate/SSL_CERT_ID_2 # https证书,就是上面创建的证书的arn
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' # 监听端口
alb.ingress.kubernetes.io/scheme: internal # 开放内网访问
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb # 指定ingressclass类型,k8s-1.18及以后的版本推荐这种配置方式,旧版本需要在注释中加入 kubernetes.io/ingress.class: alb
rules:
- host: gotest2.eryajf.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-whoami-service
port:
number: 80
- host: gotest2.erzong.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-whoami-service
port:
number: 80
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
然后再进行加载,此时可以看到负载均衡控制台创建了一台私有lb,添加域名解析之后,就只能在局域网内部访问了。
# 最后
你可以根据自己实际业务需求进行配置,证书建议尽量使用aws托管证书,这样能够保障自动续期,其他的就是正常使用即可。