Liberty InstantOn を Kubernetes で試してみた

前回の記事で、Open Liberty の InstantOn を Ubuntu 環境で試してみました。
今回は、前回作成した InstantOn 用のイメージを利用して、Kubernetes 環境で InstantOn を試してみます。

- 前回の記事：[Liberty InstantOn を Ubuntu で試してみた](https://qiita.com/splendormy/items/56f5efa66cbf7ef9460b)

## 利用した環境
利用した環境は、以下の通りです。
Podman でのイメージのビルドは、Ubuntu 22.04 で行いましたが、Kubernetes 用の Ubuntu は 20.04 のままです。ただし、無効化していた IP V6 を有効化しました。

- Ubuntu 20.04  (IP v6 有効化)
- Kubernetes v1.26.0
- containerd 1.6.21

## Open Liberty オペレーターのインストール
まずは、Open Liberty のオペレーターをインストールします。
下記 URL の手順を参考にしましたが、特に問題なく、インストールできました。
Open Liberty オペレーターは、ネームスペース liberty にインストールし、同じネームスペース内のカスタム・リソースをウォッチするようにしました。

- [OpenLiberty/open-liberty-operator/deploy/releases/1.2.1
/kubectl/](https://github.com/OpenLiberty/open-liberty-operator/tree/main/deploy/releases/1.2.1/kubectl)

<details>
<summary>Open Liberty オペレーターのインストール時のログ</summary>
<div>

```bash
root# kubectl apply --server-side -f https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/1.2.1/kubectl/openliberty-app-crd.yaml
customresourcedefinition.apiextensions.k8s.io/openlibertyapplications.apps.openliberty.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/openlibertydumps.apps.openliberty.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/openlibertytraces.apps.openliberty.io serverside-applied
root# OPERATOR_NAMESPACE=liberty
root# WATCH_NAMESPACE=liberty
root# curl -L https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/1.2.1/kubectl/openliberty-app-operator.yaml \
      | sed -e "s/OPEN_LIBERTY_WATCH_NAMESPACE/${WATCH_NAMESPACE}/" \
      | kubectl apply -n ${OPERATOR_NAMESPACE} -f -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6816  100  6816    0     0  19410      0 --:--:-- --:--:-- --:--:-- 19363
serviceaccount/olo-controller-manager created
role.rbac.authorization.k8s.io/olo-leader-election-role created
role.rbac.authorization.k8s.io/olo-manager-role created
rolebinding.rbac.authorization.k8s.io/olo-leader-election-rolebinding created
rolebinding.rbac.authorization.k8s.io/olo-manager-rolebinding created
deployment.apps/olo-controller-manager created
root# kubectl get pod
NAME                                      READY   STATUS    RESTARTS      AGE
olo-controller-manager-59f76fd48f-nr59z   1/1     Running   0             62s
root# 
```
</div>
</details>

## カスタム・リソースの作成
Open Liberty オペレーター用のカスタム・リソース instant-on.yaml を作成します。
(下に instant-on.yaml の全体を載せておきます。)

<details>
<summary>instant-on.yaml 全量</summary>
<div>

```yaml
apiVersion: apps.openliberty.io/v1
kind: OpenLibertyApplication
metadata:
  name: instant-on
  namespace: liberty
spec:
  applicationImage: registry.local/liberty-instant-on:v1.0.0
  pullPolicy: IfNotPresent
  replicas: 1
  env:
    - name: WLP_LOGGING_CONSOLE_FORMAT
      value: SIMPLE
  manageTLS: false
  service:
    port: 9080
  expose: true
  securityContext:
    runAsNonRoot: true
    privileged: false
    allowPrivilegeEscalation: true
    capabilities:
      add:
      - CHECKPOINT_RESTORE
      - SYS_PTRACE
      - SETPCAP
      drop:
      - ALL
  route:
    host: liberty.local
    pathType: Prefix
    path: /
    annotations:
      kubernetes.io/ingress.class: nginx
      nginx.ingress.kubernetes.io/affinity: cookie
      nginx.ingress.kubernetes.io/rewrite-target: /
      nginx.ingress.kubernetes.io/session-cookie-hash: sha1
      nginx.ingress.kubernetes.io/session-cookie-name: route
  monitoring:
    labels:
      release: kube-prometheus-stack
    endpoints:
      - port: 9080-tcp
        path: /metrics
        interval: 30s
```
</div>
</details>

instant-on.yaml では、前回 Podman で作成した、InstantOn 用のイメージを指定します。
InstantOn の恩恵を受け、Pod を短時間で起動することを考えると、pullPolicy には IfNotPresent を指定することになると思います。そのため、常に、最新のイメージを使用するには、イメージのビルド毎に異なるタグを使用することが必要になります。

```yaml
spec:
  ...
  applicationImage: registry.local/liberty-instant-on:v1.0.0
  pullPolicy: IfNotPresent
```

さらに、InstantOn を有効にするために、以下の定義を追加します。
追加したケーパビリティは、前回 Ubuntu&Podman 環境で InstantOn を試した時と同様に、以下の３つです。
- CHECKPOINT_RESTORE
- SYS_PTRACE
- SETPCAP

```yaml
spec:
  ....
  securityContext:
    runAsNonRoot: true
    privileged: false
    allowPrivilegeEscalation: true
    capabilities:
      add:
      - CHECKPOINT_RESTORE
      - SYS_PTRACE
      - SETPCAP
      drop:
      - ALL
```

# Pod のデプロイ
作成したカスタム・リソースを適用して、Open Liberty の Pod を起動します。

```bash
root# kubectl apply -f instant-on.yaml
openlibertyapplication.apps.openliberty.io/instant-on created
root# 
```

起動された Pod のコンソール出力を確認すると、InstantOn で起動されていることが確認できます。今回の起動時間は、`started in 0.113 seconds` となっていました。

```
root# kubectl get pod
NAME                                      READY   STATUS    RESTARTS       AGE
instant-on-798f4dfb9c-24hjn               1/1     Running   0              4s
olo-controller-manager-59f76fd48f-nr59z   1/1     Running   0              76m
root# kubectl logs instant-on-798f4dfb9c-24hjn

[7/13/23, 5:04:13:584 UTC] 00000036 com.ibm.ws.kernel.launch.internal.FrameworkManager           A Launching defaultServer (Open Liberty 23.0.0.7-beta/wlp-1.0.78.cl230620230612-1100) on Eclipse OpenJ9 VM, version 17.0.7+7 (en_US)
[7/13/23, 5:04:13:592 UTC] 00000036 com.ibm.ws.app.manager.AppMessageHelper                      A CWWKZ0001I: Application SimpleWebTest started in 0.087 seconds.
[7/13/23, 5:04:13:602 UTC] 00000036 com.ibm.ws.http.internal.VirtualHostImpl                     A CWWKT0016I: Web application available (default_host): http://instant-on-798f4dfb9c-24hjn:9080/SimpleWebTest/
[7/13/23, 5:04:13:612 UTC] 00000036 io.openliberty.checkpoint.internal.CheckpointImpl            A CWWKC0452I: The Liberty server process resumed operation from a checkpoint in 0.107 seconds.
[7/13/23, 5:04:13:612 UTC] 0000003c com.ibm.ws.security.token.ltpa.internal.LTPAKeyCreateTask    I CWWKS4105I: LTPA configuration is ready after 0.010 seconds.
[7/13/23, 5:04:13:613 UTC] 00000036 com.ibm.ws.tcpchannel.internal.TCPPort                       I CWWKO0219I: TCP Channel defaultHttpEndpoint has been started and is now listening for requests on host *  (IPv6) port 9080.
[7/13/23, 5:04:13:617 UTC] 00000036 com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0012I: The server installed the following features: [appSecurity-2.0, appSecurity-3.0, beanValidation-2.0, cdi-2.0, distributedMap-1.0, ejbLite-3.2, el-3.0, jaspic-1.1, jaxrs-2.1, jaxrsClient-2.1, jdbc-4.2, jndi-1.0, jpa-2.2, jpaContainer-2.2, jsf-2.3, jsonb-1.0, jsonp-1.1, jsp-2.3, managedBeans-1.0, servlet-4.0, ssl-1.0, transportSecurity-1.0, webProfile-8.0, websocket-1.1].
[7/13/23, 5:04:13:618 UTC] 00000036 com.ibm.ws.kernel.feature.internal.FeatureManager            I CWWKF0008I: Feature update completed in 0.113 seconds.
[7/13/23, 5:04:13:618 UTC] 00000036 com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0011I: The defaultServer server is ready to run a smarter planet. The defaultServer server started in 0.113 seconds.
[7/13/23, 5:04:13:672 UTC] 00000032 com.ibm.ws.ssl.config.WSKeyStore                             I Successfully loaded default keystore: /opt/ol/wlp/output/defaultServer/resources/security/key.p12 of type: PKCS12
[7/13/23, 5:04:13:682 UTC] 00000036 com.ibm.ws.tcpchannel.internal.TCPPort                       I CWWKO0219I: TCP Channel defaultHttpEndpoint-ssl has been started and is now listening for requests on host *  (IPv6) port 9443.
root#
```

## 終わりに
思ったよりも順調に、Kubernetes 環境で Open Liberty の InstantOn を試すことができました。
InstantOn を Azure Kubernetes Service で利用する例が以下の URL に記載されています。この記事でも、以下の URL の内容を参考にしました。

- [Liberty InstantOn on Azure Kubernetes Service](https://community.ibm.com/community/user/wasdevops/blogs/tam-dinh/2023/03/09/liberty-instanton-aks)