# 前言

EKS集群拉起之后,事情并没有结束,因为想要集群内的服务被外部访问,势必需要Ingress的配置,上文中已经讲了ingress-controller的安装,那么本文将通过一些实际例子,来介绍内外网ingress的配置用法。

# 公有 ingress

# 准备工作

首先需要对公有子网进行打标,关于打标,可见此文档:子网自动发现 (opens new window)

当然前边部署的时候已经介绍过此事项,如果已经配置过,则可略过。

# 如果是公有子网,则打标:
kubernetes.io/role/elb=1

# 如果是私有子网,则打标:
kubernetes.io/role/internal-elb=1

1
2
3
4
5

# 部署服务

  1. 准备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

  2. 部署服务

    $ kubectl apply -f 2048_full.yaml
    

    1

  3. 查看服务,正常拉起之后,可以看到 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 的页面。

申明

原创文章eryajf,未经授权,严禁转载,侵权必究!此乃文中随机水印,敬请读者谅解。

# 添加域名

上边的示例是启动一个示例服务,并且通过aws提供的一个访问入口进行请求,实际生产业务中,我们会把自定义域名指向自己集群内的服务,现在来介绍一下配置方式。

废话不多说,这里直接进入正题。

# 先将证书导入到aws证书管理器

这里以eryajf.net域名举例。

AWS支持完善的域名托管能力,支持自动续期,当然也支持你将已经申请好的证书导入进来,这里我演示一下导入证书的用法。

先下载好域名证书,在AWS中,可以通过控制台,或者命令行两种形式把证书导入。

# 控制台导入

来到Certificate Manager,然后点击导入证书,需要注意,通常我们下载的证书是NGINX格式的,那么证书的正文只需要导入pem文件的第一段,而非完整内容,否则会在导入的时候,提示无法导入:

image-20240706135432097

导入成功之后,会自动识别,然后可以拿到证书的arn。

image-20240706140219038

# 命令行导入

第二种方式,可通过命令行导入:

$ aws acm import-certificate --certificate fileb://eryajf.net_bundle.crt --private-key  fileb://eryajf.net.key

1

需要注意:此处的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

1
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

1

查看这个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

1
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

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

然后执行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

1
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

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

将域名证书的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

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

然后再进行加载,此时可以看到负载均衡控制台创建了一台私有lb,添加域名解析之后,就只能在局域网内部访问了。

# 最后

你可以根据自己实际业务需求进行配置,证书建议尽量使用aws托管证书,这样能够保障自动续期,其他的就是正常使用即可。