如何用Windows下的Docker Desktop Kubernetes部署ForgeOps 7.2来实现本地开发
Published: 2023-05-25 12:32:05

# 前言
[ForgeRock官方](https://backstage.forgerock.com/docs/forgeops/7.2/start/start-here.html)提供了一个DevOps方案(`ForgeOps`)用于展示如何部署ForgeRock Identity Platform在Kubernetes里。

很遗憾的在官方CDK文档并没有教在Windows里的`Docker Desktop Kubernetes`或`minikube`部署ForgeOps。官方给的方案是运行一个Linux虚拟机，比如使用Hyper-V, VMWare Player 或 VMWare Workstation运行Ubuntu，然后在Linux虚拟机里使用`minikube`来部署ForgeOps。

我个人认为为了实现本地开发而运行一个虚拟机实在是费资源。既然ForgeOps是展示在Kurbenetes上运行的，原理上无论在什么操作系统，只要我能部署一个Kubernetes cluster，我就应该能部署ForgeOps给的配置。

这里我们就尝试在Windows下的Docker Desktop Kubernetes部署ForgeOps。

# 安装需要的软件

- [Docker Desktop](https://www.docker.com/get-started/#)
- [Git](https://git-scm.com/downloads)
- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl-windows/)
- [kustomize 5.0](https://github.com/kubernetes-sigs/kustomize/releases)
- [skaffold 2](https://skaffold.dev/docs/install/#standalone-binary)
- [helm 3.12](https://github.com/helm/helm/releases)
- [dos2unix](https://dos2unix.sourceforge.io/)

如果你比较熟悉Kubernetes，其他一些小工具比如`kubectx`和`kubens`可以选择性安装。这些小工具可以提高工作效率，在这个部署中不是必要工具。

# 安装Docker Desktop并开启Kubernetes功能

安装我想应该非常简单，就不必我一步步指吧。在安装过程中会有一个选项询问是否要开启Kubernetes功能，只需打勾就好了。
如何你在安装中错过了，或早已安装了Docker Desktop的，就去设置目录开启Kubernetes功能就好了。
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u77abf7ihnput0xvp6a3.jpg)

# 下载ForgeOps 7.2 Github源码

这里要注意每个版本的部署方式都有些许不同，这里我使用的是[`release/7.2.0`](https://github.com/ForgeRock/forgeops/tree/release/7.2.0)版本。但部署原理都是一样的，只要你掌握的原理，你就可以跟着不同版本的需要做些改动来完成部署。

如果你有用Github Desktop，只需在UI上点几个button就可以下载了。
这里我用git来下载源码：
```
git clone https://github.com/ForgeRock/forgeops.git
cd forgeops
```

# 处理sh文件EOL问题

我在创建docker image后发现所有的docker image都运行不了，原因是forgerock的base image是使用Linux核的，而`forgeops`的`.sh`源文件是使用`CRLF`的，我有点搞不明白为什么。

所以我们必须先吧所有的`.sh`源文件从`CRLF`转去Linux能解读的`LF`。当然一个一个文件去修改实在太耗时了，这里我们就需要用到`dos2unix`这个小工具来帮我们批量处理了。

我个人对`bash`比较熟悉，就使用`git-bash`来完成，如果你比较熟悉`PowerShell`，也可以用`PowerShell`来完成：
```
find . -name "*.sh" -type f -exec dos2unix {} \;
```

# 更改imagePullPolicy

我们将使用`forgeops`提供的skaffold yaml来进行部署，这个skaffold包括了创建custom docker image，并用custom docker image进行部署。

然而，`forgeops`提供的kubernetes部署yaml都是用`imagePullPolicy: Always`，如果你部署在本地的Kubernetes，它会一直尝试从互联网下载image，而导致`ErrImgPull` image不能被下载。

这里我们就需要把所有的`imagePullPolicy`从`Always`改去`IfNotPresent`或`Never`，这样本地Kubernetes就会优先从本地查找image。

批量更改的方法很多，你就用你最适应的方法去改吧。我的方法是使用`VS Code`打开`forgeops`文件夹，然后使用Search & Replace功能，把`imagePullPolicy: Always`批量replace成`imagePullPolicy: IfNotPresent`。

# 检查Kubernetes

源文件的准备工作到这里就好了，现在要检查你的Kubernetes和安装的CLI能否运行。

```
kubectl get nodes
```
运行以上这个command你应该会得到`docker-desktop`，然后status应该要是`Ready`

现在就可以创建新的namespace了，这个namespace主要是用来分开ForgeRock的应用以方便我们查看。
```
kubectl create ns forgerock
```

如果你有用`kubens`，也可以把`forgerock`设置成默认namespace：
```
kubens forgerock
```

然后检查所有所需的工具能正常运行
```
helm
skaffold
```

# 部署secret agent和cert manager

根据[官方CDK Architecture文档](https://backstage.forgerock.com/docs/forgeops/7.2/cdk/architecture.html)，ForgeRock Identity Platform还需要`secret agent`，`cert manager` 和 `DS operator`。

`DS Operator`我就不部署了，应该这个主要是用于backup和restore DS的资料，本地开发应该没用。如果你有需要也可以跟着`secret agent`或`cert manager`的部署方法。

## 部署secret agent

ForgeRock官方提供了secret agent的Kubernetes yaml部署文件，所以这一步非常简单。只需运行以下command就可以了：
```
kubectl apply -f https://github.com/ForgeRock/secret-agent/releases/download/v1.1.8/secret-agent.yaml
```

运行后就可以检查用`kubectl get ns` command检查`secret-agent-system` namespace是否已经创建。并检查`secret-agent-controller-manager`是 READY `1/1` 的状体:
```
kubectl get deployment -n secret-agent-system
```

# 部署cert manager

ForgeOps是用开源的[`cert-manager.io`](https://github.com/cert-manager/cert-manager)来管理证书。`forgeops`也提供一个bash script方便使用helm来部署`cert-manager`。

这里我们可以利用`git-bash`来运行这个bash script：
```
./bin/certmanager-deploy.sh
```

运行完成后也是检查下`cert-manager`的status：
```
kubectl get deployment -n cert-manager
```

# 创建secrets

ForgeRock Identity Platform里用到大量的secrets，如果要一个一个创建不但麻烦费时也很复杂。这里`forgeops`以提供的Kustomize部署文件利用secret agent来创建需要的secrets：
```
kubectl apply -k .\kustomize\base\secrets -n forgerock
```
部署完成后，用以下command检查是不是又一堆`ds-`，`am-`，`idm-`的secrets以创建。
```
kubectl get secrets -n forgerock
```

# 部署ForgeRock

现在我们可以开始部署ForgeRock Identity Platform了，这一步非常简单，只需运行：
```
skaffold dev
```

# 部署Ingress Controller

完成以上的部署，接下来就是要浏览`https://default.iam.example.com/am`了。但是应该怎样浏览呢？

这里我们就需要Ingress Controller了，我选择了Ngix的Ingress Controller，你可以根据自己需求选择。

这里我们就用官方的部署文件吧：
```
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.1/deploy/static/provider/cloud/deploy.yaml
```
部署完成后就只需port-forward去Ingress Controller就可以了
```
kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 80:80
```

# 最后一步，设置host文件

想必程序员们对host文件不陌生吧，我们就只需把`default.iam.example.com`设成本地解析就可以了。
简单的在`C:\Windows\System32\drivers\etc\hosts`文件加一行：
```
127.0.0.1 default.iam.example.com
```

现在你就可以浏览 https://default.iam.example.com/am 了。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n97l5i3sc3ystdaged4j.jpg)

还差最后一样都东西就是登录用户和密码，哈哈。这里我就不明示怎样创建用户了，你们就琢磨琢磨，如果真的不行就在评论区留言，我会在评论区教你。

# 总结

经过我不断的尝试，终于找到一个可以部署ForgeOps让在Windows也能实现本地开发。这里就分享给大家，最后ForgeRock需要的内存挺多的，建议大家预留最少9GB的内存来运行。