Installing Ambassador Edge Stack 3

以前AES2.Xのインストールにトライしたが断念。

k8s clusterを作り直したので、AES3.Xのインストールにリトライ。

今回は下記バージョンのインストールを試してみる。

helm search repo edge-stack
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
datawire/edge-stack     8.5.1           3.5.1           A Helm chart for Ambassador Edge Stack

AES-CRDS適用

AESインストールする前に、getambassador.io/v3alpha1, getambassador.io/v2用CRDSを適用する。

kubectl apply -f https://app.getambassador.io/yaml/edge-stack/3.5.1/aes-crds.yaml

これを適用すると、emissary-systemというnamespace, emissary-apiextというdeploymentが作成される。

namespace/emissary-system created
serviceaccount/emissary-apiext created
clusterrole.rbac.authorization.k8s.io/emissary-apiext created
clusterrolebinding.rbac.authorization.k8s.io/emissary-apiext created
role.rbac.authorization.k8s.io/emissary-apiext created
rolebinding.rbac.authorization.k8s.io/emissary-apiext created
service/emissary-apiext created
deployment.apps/emissary-apiext created

これは、getambassador.io/v3alpha1とgetambassador.io/v2間のAmbassador Edge Stack CRDの変換をサポートするAPIサーバー拡張で、常に起動しておく必要がある。

kubectl -n emissary-system  get all                                                                                                                 ✘ 1
NAME                                   READY   STATUS    RESTARTS   AGE
pod/emissary-apiext-5fd5ff7d5b-8hzt9   1/1     Running   0          52s
pod/emissary-apiext-5fd5ff7d5b-jf27q   1/1     Running   0          52s
pod/emissary-apiext-5fd5ff7d5b-llsbt   1/1     Running   0          52s

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/emissary-apiext   ClusterIP   10.245.201.63   <none>        443/TCP   53s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/emissary-apiext   3/3     3            3           53s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/emissary-apiext-5fd5ff7d5b   3         3         3       53s

Install Ambasador Edge Stack

helmでAESをインストール

helm install edge-stack datawire/edge-stack -n ambassador --create-namespace -f ambassador-values.yaml
# Resource requests/limits
resources:
  limits:
    cpu: 1000m
    memory: 600Mi
  requests:
    cpu: 200m
    memory: 200Mi

状態確認

kubectl get all -n ambassador

こんな感じで出力される。

kubectl -n ambassador get all                                                                                                                                         ✘ 130
NAME                                    READY   STATUS    RESTARTS   AGE
pod/edge-stack-85d8669ff5-484dl         1/1     Running   0          7d7h
pod/edge-stack-85d8669ff5-7dvz2         1/1     Running   0          7d7h
pod/edge-stack-85d8669ff5-xkrcj         1/1     Running   0          7d7h
pod/edge-stack-agent-7679947fc9-mb2hj   1/1     Running   0          7d7h
pod/edge-stack-redis-6b85454bd6-55w5c   1/1     Running   0          7d7h

NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                      AGE
service/edge-stack         LoadBalancer   10.245.177.249   188.166.204.136   80:32406/TCP,443:32484/TCP   14d
service/edge-stack-admin   ClusterIP      10.245.167.147   <none>            8877/TCP,8005/TCP            14d
service/edge-stack-agent   ClusterIP      10.245.65.59     <none>            80/TCP                       14d
service/edge-stack-redis   ClusterIP      10.245.100.123   <none>            6379/TCP                     14d

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/edge-stack         3/3     3            3           14d
deployment.apps/edge-stack-agent   1/1     1            1           14d
deployment.apps/edge-stack-redis   1/1     1            1           14d

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/edge-stack-85d8669ff5         3         3         3       7d7h
replicaset.apps/edge-stack-agent-7679947fc9   1         1         1       7d7h
replicaset.apps/edge-stack-redis-6b85454bd6   1         1         1       7d7h

ステータス確認

Helm

helm ls -n ambassador
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
edge-stack      ambassador      1               2023-03-23 10:52:33.18849 +0900 JST     deployed        edge-stack-8.5.1        3.5.1

doctl

doctl compute load-balancer list --format IP,ID,Name,Status
IP               ID                                      Name                                Status
163.47.10.103    f9ab559d-9999-9999-9999-9999999999999    ac5573ab1ff154b648ac1c4d9cccf475    active

k8s svc

kubectl -n ambassador get svc                                                                                                                       ✘ 1
NAME               TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
edge-stack         LoadBalancer   10.245.221.238   163.47.10.103   80:30033/TCP,443:32622/TCP   2m52s
edge-stack-admin   ClusterIP      10.245.61.110    <none>          8877/TCP,8005/TCP            2m52s
edge-stack-agent   ClusterIP      10.245.208.39    <none>          80/TCP                       2m52s
edge-stack-redis   ClusterIP      10.245.111.224   <none>          6379/TCP                     2m52s

AES Listener設定

Listener設定のマニフェストを適用する

kubectl apply -f ambassador_listener.yaml
---
apiVersion: getambassador.io/v3alpha1
kind: Listener
metadata:
  name: http-listener
spec:
  port: 8080
  protocol: HTTPS
  # protocolStack:
  # - PROXY
  # - HTTP
  # - TCP
  securityModel: XFP
  statsPrefix: http-listener
  hostBinding:
    namespace:
      from: ALL
---
apiVersion: getambassador.io/v3alpha1
kind: Listener
metadata:
  name: https-listener
spec:
  port: 8443
  protocol: HTTPS
  # protocolStack:
  # - PROXY
  # - TLS
  # - HTTP
  # - TCP
  securityModel: XFP
  statsPrefix: https-listener
  hostBinding:
    namespace:
      from: ALL

Listenerが作成される

kubectl get listeners.getambassador.io
NAME             PORT   PROTOCOL   STACK   STATSPREFIX      SECURITY   L7DEPTH
http-listener    8080   HTTPS              http-listener    XFP
https-listener   8443   HTTPS              https-listener   XFP

DNS登録

AES用にDNS登録する。

NAME               TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
edge-stack         LoadBalancer   10.245.221.238   163.47.10.103   80:30033/TCP,443:32622/TCP   2m52s

上の”EXTERNAL-IP”フィールドに表示されているIPアドレスをAレコードに設定する。

Hostリソース追加

kubectl apply -f amb-host.yaml
---
apiVersion: getambassador.io/v3alpha1
kind: Host
metadata:
  name: wp
  namespace: ambassador
spec:
  hostname: wp.dok8s.net
  acmeProvider:
    authority: https://acme-v02.api.letsencrypt.org/directory
    email: wp@dok8s.net
  tlsSecret:
    name: tls2-cert
  requestPolicy:
    insecure:
      action: Redirect
      additionalPort: 8080
kubectl -n ambassador get host wp
NAME   HOSTNAME       STATE   PHASE COMPLETED   PHASE PENDING   AGE
wp     wp.dok8s.net   Ready       

STATEがReadyになればOK

Mappingリソース追加

kubectl apply -f amb-map.yaml
---
apiVersion: getambassador.io/v3alpha1
kind: Mapping
metadata:
  name: wp
  namespace: ambassador
spec:
  prefix: /
  host: wp.dok8s.net
  service: http://wordpress.wp/
kubectl -n ambassador get mapping wp                                                                                                     ✘ 1
NAME   SOURCE HOST    SOURCE PREFIX   DEST SERVICE           STATE   REASON
wp     wp.dok8s.net   /               http://wordpress.wp/

Proxy Protocol有効化

DigitalOcean Load-BalancerのProxy Protocol設定を有効化する。

AES LoadBalancerにannotation追加

Chartファイルに下記を追加し、helm upgrade。

emissary-ingress:
  service:
    type: LoadBalancer
    annotations:
      # Enable http/2 Ports
      # service.beta.kubernetes.io/do-loadbalancer-http2-ports: "443,80"      
      # Enable proxy protocol
      service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "true"
      # Specify whether the DigitalOcean Load Balancer should pass encrypted data to backend droplets
      service.beta.kubernetes.io/do-loadbalancer-tls-passthrough: "true"
      # You can keep your existing LB when migrating to a new DOKS cluster, or when reinstalling AES
      kubernetes.digitalocean.com/load-balancer-id: "f9ab559d-9999-9999-9999-9999999999999"
      service.kubernetes.io/do-loadbalancer-disown: false
helm upgrade edge-stack datawire/edge-stack -n ambassador -f ambassador-values.yaml

AES Listener設定変更

---
apiVersion: getambassador.io/v3alpha1
kind: Listener
metadata:
  name: http-listener
spec:
  port: 8080
  # protocol: HTTPS
  protocolStack:
  - PROXY
  - HTTP
  - TCP
  securityModel: XFP
  statsPrefix: http-listener
  hostBinding:
    namespace:
      from: ALL
---
apiVersion: getambassador.io/v3alpha1
kind: Listener
metadata:
  name: https-listener
spec:
  port: 8443
  # protocol: HTTPS
  protocolStack:
  - PROXY
  - TLS
  - HTTP
  - TCP
  securityModel: XFP
  statsPrefix: https-listener
  hostBinding:
    namespace:
      from: ALL
kubectl apply -f ambassador_listener.yaml