# kubernetesクラスタにCISを用いて連携

# 概要
bigipとkubernetesを,CISを用いて連携する手順。
これを実施する事で、BIGIPを介してIngressを使用し、ホスト名でアクセスできるようになる。

## 環境
OS：AlmaLinux9
kubernetes：v1.27
ランタイム（cri-o）：1.26.0-0
AS3：3.45
CIS： 2.13.1
bigip：ver.16.0

# 手順

bigipにSSHでログインし、下記のコマンドを実行する。
```
touch /var/config/rest/iapps/enable
```

以下のURLから、AS3のファイルをダウンロードする。
https://github.com/F5Networks/f5-appsvcs-extension/releases/download/v3.45.0/f5-appsvcs-3.45.0-5.noarch.rpm

その後GUIにログインし、`iApps/ PackagemanagementLX` から、importを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/efb7c0e1-5f44-be89-ac69-6e53cbd040ba.png)

その後、ダウンロードしたファイルを選択し、Uploadを押す。
少し待つと、ファイルが二つになるのを確認できる

## partition userの作成
bigip-ctlr が操作する領域を作るためにパーティション(CISはPartition Commonに対応していない)とユーザを作成する。

`System->Users->PartitionList`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/2df358cd-bab1-b828-a43c-91227c7fe8d2.png)

右側のCreateを押す。
その後Partitionnameに任意の名前を入れ、finishedを押す

`System->Users->UserList`から右側Createで、ユーザを作成する。
ユーザネーム、パスワードは任意に作成していいが、後程ノード上でSecretを作成するときにひつようになるため、
作成したパスワードの中に、!数字や、> など、linux上で実行すると別の意味としてとらえられる文字がない事を確認すること。後のSecret作成コマンドにて不整合が起こる場合がある。

Partision Acccessの中は、

- Role
    - Administrator
- Partition
    - ALLである。
- TerminalAccess
    - tmsh
を選択する。

その後finishedを押す

# ノード側での作業

ノードにSSHした後、Secretを作成する。
userとpasswordは、先ほどbigipで作成したもの
```
sudo kubectl create secret generic bigip-login -n kube-system --from-literal=username=<user> --from-literal=password=<password>
```

以下のコマンドで、secretが作成できている事を確認する。
```
sudo kubectl get secret -n kube-system | grep bigip
```

# CISのインストール
公式サイトでは、yamlを作成して適応させる方法もあるらしいが、helmを用いてインストールした方が楽であるため、helmを用いる

以下コマンドで、取得先をリポジトリに追加
```
helm repo add f5-stable https://f5networks.github.io/charts/stable
```

その後、CISに設定するパラメータ等を指定するyamlファイルであるvalues.yamlを作成する
bigip_login_secret:

Secretの作成にて設定したシークレット名に変更する

bigip_url:

先ほどユーザ、パーティションを作成した際に使用したBIGIPのIPアドレスを指定する。
- bigip_partition:
    - パーティションの作成にて設定したパーティション名を指定する。
- bigip_url：
    - bigipのIPアドレス
- default_ingress_ip
    - イングレスに払い出すIPアドレス
- insecure: true　コメントアウトする
    - これを設定する事で、SSL証明書エラーを無視する事ができる。curl -kと一緒
- version: latest　インデントを無くす
    - imageのインデントの外に出さないとversionを指定できない。
    - バージョンが指定できないとエラーが起こる。リンク先の67行目を参照
https://github.com/F5Networks/charts/blob/master/src/stable/f5-bigip-ctlr/templates/f5-bigip-ctlr-deploy.yaml#L67

以下コマンドで作成
```
vi bigip-values.yaml
```
```:編集内容
bigip_login_secret: 先ほど作ったシークレットの名前
rbac:
  create: true
serviceAccount:

  create: true
  name:
ingressClass:
  create: true
  ingressClassName: f5
  defaultController: true
namespace: kube-system
args:
  bigip_url: x.x.x.x
  bigip_partition: 先ほど作ったもの
  insecure: true
  default_ingress_ip: y.y.y.y

image:
  # Use the tag to target a specific version of the Controller
  user: f5networks
  repo: k8s-bigip-ctlr
  pullPolicy: IfNotPresent
version: 2.13.1
```
以下コマンドを用いて、CISをインストールする。
```
helm install -f bigip-values.yaml f5-bigip-ctlr f5-stable/f5-bigip-ctlr
```

# 動作確認

nginxのポッドを作成し、それがホスト別にブラウザで確認できるか＆BIGIP側のブラウザで表示されるかどうかを確認する。

以下のようなyamlを作成する。
この時、ingressでは、spec内にingressClassName: f5を指定しなければならない。
```
vi test-nginx-ingress.yaml
```
```:編集内容

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/allow-http: "false"
    ingress.kubernetes.io/ssl-redirect: "true"
    virtual-server.f5.com/health: |
      [
        {
          "path": "test-nginx.com/",
          "interval": 30,
          "protocol": "http",
          "send": "HTTP GET /health/test",
          "timeout": 120
        }
       ]
    virtual-server.f5.com/ip: 210.150.24.145
    virtual-server.f5.com/partition: kubernetes
    virtual-server.f5.com/balance: "round-robin"
  name: test-nginx
  namespace: default
spec:
  ingressClassName: f5
  rules:
  - host: test-nginx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: test-nginx
            port:
              number: 8080
status:
  loadBalancer:
    ingress:
    - ip: 210.150.24.145
```
適応させる
```
kubectl apply -f test-nginx-ingress.yaml
```
service,deploymentの作成

```
 vi test-nginx-service.yaml
```
```:編集内容
apiVersion: v1
kind: Service
metadata:
  labels:
    app: test-nginx
    cis.f5.com/as3-app: A1
    cis.f5.com/as3-pool: test-nginx_pool
    cis.f5.com/as3-tenant: AS3
  name: test-nginx
  namespace: default
spec:
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: test-nginx
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer: {}
```
適応させる
```
 kubectl apply -f test-nginx-service.yaml
```

```
 vi test-nginx-deployment.yaml
```
```:編集内容
apiVersion: apps/v1
kind: Deployment
metadata:
  # Deploymentの名前。Namespace内ではユニークである必要があります
  name: test-nginx
spec:
  selector:
    matchLabels:
      app: test-nginx
  replicas: 3
  # Podのテンプレート(PodTemplate)
  template:
    metadata:
      labels:
        # ラベル指定は必須
        app: test-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
```
```
 kubectl apply -f test-nginx-deployment.yaml
```

以下コマンドを実行し、Ingressを確認すると、公開用IPとホスト名が設定されているのを確認する

```
sudo kubectl get ingress
```
```:実行結果
[username@k8snode-1 ingress_nginx]$ kubectl get ingress
NAME         CLASS   HOSTS            ADDRESS          PORTS   AGE
test-httpd   f5      test-httpd.com   xxx.yyy.zzz.www   80      2m1s
```

ブラウザからBIGIPにアクセスしてみると新しくリソースが作成されているのが分かる。出てこない場合は、左上のパーティションが

- 今回作ったものか
- ALL

のどちらかに指定されている事を確認する。（VirtualServerが水色になっているのは、デフォルトのPoolをnginxのPoolかhttpdのPoolか指定していないため。動作確認は問題なく実行できるため、ここではそのまま続行する。）

以下のような記事になぞり、hostsファイルを編集し、ingress作成の時に設定したホスト名を追加する。これで、ローカルのみアクセスを通す事が可能になった。

https://applica.info/windows10-hosts

そして、先ほど設定したホスト名をブラウザでアクセスすると、ちゃんとnginxの画面が見えているのが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/7d7ec698-c83a-62ed-2e95-d3c190cc3f31.png)

# 参考サイト

https://clouddocs.f5.com/containers/latest/reference/release-notes.html

https://clouddocs.f5.com/containers/latest/userguide/kubernetes/#creating-vxlan-tunnels-kubernetes

https://github.com/F5Networks/k8s-bigip-ctlr/tree/master/docs/config_examples/

https://github.com/F5Networks/k8s-bigip-ctlr/tree/master/docs/config_examples/ingress/networkingV1

https://clouddocs.f5.com/containers/latest/

https://clouddocs.f5.com/containers/latest/userguide/ingress.html