‘一,wso2部署为pod官网 有四种部署模式,这里使用标准HA部署
1,使用helm把chart拉到本地 官网只有k8s的chart 这里我们要拉下来改一下
官网地址:
kubernetes-apim/advanced at master · wso2/kubernetes-apim · GitHub
git clone https://github.com/wso2/kubernetes-apim.git
2, 把包解压,列出这个目录
这几个目录分别对应不同的部署模式每个目录下都是一个Chart,am-pattern-1就是标准的HA部署
ls kubernetes-apim/advanced/
am-pattern-1 am-pattern-2 am-pattern-3 am-pattern-4 mysql-am
3,修改values.yaml 直接使用msyql数据库也可以,我由于特殊需要换成postgresql,且不能使用,cluster role binding
vim kubernetes-apim/advanced/am-pattern-1/values.yaml
mysql: false #这里改为 false 因为后面要换成postgresql
nfsServerProvisioner: false #这里改为false,启动nfs需要cluster role binding,
#storageClass: &storage_class "nfs" #这一行定义storage_class,因为我们关掉了nfs 所以这里也注释掉
#mysql-am:
# mysql:
# persistence:
# storageClass: *storage_class #这几行注释掉,这里会去使用上面 &storage_class "nfs"定义的nfs
hostname: "api.apps.openshift.devops.philips-healthsuitechina.com.cn" #改为你okd,路由最后暴露出来的连接,
kubernetes:
# Name of Kubernetes service account
serviceAccount: "default" #改为默认的 default 不然会报错,
4,因为是HA部署这两个目录下分别有 deployment和conf 文件
ls kubernetes-apim/advanced/am-pattern-1/templates/am
instance-1 instance-2
5,由于后面需要把数据库改为postgresql,但是默认的image:wso2/wso2am
:4.1.0里面没有postgresql-42.4.0.jar这个类,
参考官网地址:Change to PostgreSQL - WSO2 API Manager Documentation 4.1.0
下载postgresql-42.4.0.jar
wget https://jdbc.postgresql.org/download/postgresql-42.4.0.jar
6,把 postgresql-42.4.0.jar持久化到容器
方式一 configmap: #这里可以使用configmap去挂载这个包
kubectl create configmap postgresql-jar --from-file=postgresql-42.4.0.jar #直接指定一个文件 创建为 configmap
vim kubernetes-apim/advanced/am-pattern-1/templates/am/instance-1/wso2am-pattern-1-am-deployment.yaml
volumeMounts:
- name: config-vloume
mountPath: /home/wso2carbon/wso2am-4.1.0/repository/components/lib/postgresql-42.4.0.jar
subPath: home/wso2carbon/wso2am-4.1.0/repository/components/lib/postgresql-42.4.0.jar
#这里使用subPath这里开头不能是 "/" 这里必须严格遵守这种写法如果不使用subPath就会覆盖这个目录原来的文件
volumes:
- name: config-vloume
configMap:
items:
- key: postgresql-42.4.0.jar
path: etc/nginx/postgresql-42.4.0.jar
name: postgresql-jar
方式二 PVC挂载: 这里我们先创建一个临时pod,手动创建一个pvc把这个pvc挂载到pod里面
#这里保险起见我用的是方式二
vim nginx-test.yaml
volumeMounts:
- name: java-class-jar
mountPath: /home/wso2carbon/wso2am-4.1.0/repository/components/lib/
volumes:
- name: java-class-jar
persistentVolumeClaim:
claimName: java-class-jar
kubectl cp wso2am-4.1.0/repository/components/lib/* nginx-deployment-78757ff87d-c4jjj:/home/wso2carbon/wso2am-4.1.0/repository/components/lib/ -n project-apimanager #先把原有的拷贝进去
kubectl cp postgresql-42.4.0.jar nginx-deployment-78757ff87d-c4jjj:/home/wso2carbon/wso2am-4.1.0/repository/components/lib/ -n project-apimanager #在把刚才下载的拷贝进去
vim kubernetes-apim/advanced/am-pattern-1/templates/am/instance-1/wso2am-pattern-1-am-deployment.yaml #挂载到最终pod对应的目录,instance-2/wso2am-pattern-1-am-deployment.yaml也一样加上配置
volumeMounts:
- name: java-class-jar
mountPath: /home/wso2carbon/wso2am-4.1.0/repository/components/lib/
volumes:
- name: java-class-jar
persistentVolumeClaim:
claimName: java-class-jar
7,在当前project部署postgresql
helm repo add bitnami https://charts.bitnami.com/bitnami #添加 对应repo
helm pull bitnami/postgresql #把repo下载下来
vim values.yaml
serviceAccount:
create: false #后面的helm 模板应该是要引用这里然后自己创建一个role来绑定,这里关掉
storageClass: "" #这里把存储类的名字改为空 后面的helm 模板引用的就是空的,这样就会使用默认的存储类
helm install postgresql-prod postgresql -n project-apimanager
#这里安装的时候我把名字写为 postgresql-prod这样容易与测试环境区分,这个名字在helm模板里面叫做release会多次引用,后面的ingerss和,service都会随着名字的改变而改变
8,安装完成数据库后做数据库初始化操作
先把pod端口映射到本地
kubectl get secret postgresql-prod -o jsonpath="{.data.postgres-password}" | base64 --decode #获取 postgres 用户密码:
kubectl port-forward --address 0.0.0.0 service/postgresql-prod 5432:5432 -n project-apimanager& #使用--address 0.0.0.0 指定映射的ip 我这里映射的是当前主机的所有ip
psql --host 192.168.1.128 -U postgres -d postgres -p 5432 #登入用用户创建两个库
CREATE DATABASE shared_db;
CREATE DATABASE apim_db;
psql --host 127.0.0.1 -U postgres -d shared_db -p 5432 -f wso2am-4.1.0/dbscripts/postgresql.sql -W #退出数据库,这里使用刚才下载好的二进制包执行sql创建数据库表
psql --host 127.0.0.1 -U postgres -d apim_db -p 5432 -f wso2am-4.1.0/dbscripts/apimgt/postgresql.sql -W
9,修改wso2应用文件使数据库指向postgresql
修改wso2应用文件使数据库指向postgresql
vim kubernetes-apim/advanced/am-pattern-1/templates/am/instance-1/wso2am-pattern-1-am-conf.yaml # 这个instance-2/wso2am-pattern-1-am-conf.yaml文件也一样这样修改
[database.apim_db]
type = "postgre"
url = "jdbc:postgresql://postgresql-prod-hl:5432/apim_db"
#把数据库指向postgresql,postgresql-prod-hl 这个pod是有状态服务使用StatefulSets部署,所以访问的时候访问,postgresql-prod-hl 这个名字是刚才release的名字加 -hl 就是无头服务
username = "postgres"0
password = "Devops@XXXXXX" #密码就写刚才获取到的密码
driver = "org.postgresql.Driver"
validationQuery = "SELECT 1"
[database.shared_db]
type = "postgre"
url = "jdbc:postgresql://postgresql-prod-hl:5432/shared_db"
username = "postgres"
password = "Devops@XXXXXX"
driver = "org.postgresql.Driver"
validationQuery = "SELECT 1"
10,安装到OKD
helm install --name wso2-prod kubernetes-apim/advanced/wso2/am-pattern-1 --version 4.1.0 --namespace apimanager
#部署,卸载,更新的频率不要太频繁可能会出现访问不了的情况
二,使用router暴露服务 路由配置完成后就可以访问了 #devops-OKD不支持ingress访问
三,配置TLS权威证书,要先申请好权威证书如下
参考官网:密钥库 - WSO2 API 管理器文档 4.1.0
1,申请CA证书时会有一个key,使用key转换证书格式
openssl pkcs12 -export -out server.pfx -inkey apps.openshift.devops.philips-healthsuitechina.com.cn.key -in 20221107-3564.crt
2,使用以下命令将 PKCS12 转换为 Java 密钥库:
keytool -importkeystore -srckeystore server.pfx -srcstoretype pkcs12 -destkeystore newkeystore.jks -deststoretype JKS #输入新密钥库的 密码
3,将 CA 签名的证书导入密钥库
在将 CA 签名的证书导入密钥库之前,请通过执行下面给出的命令添加根 CA 证书和两个中间证书。
keytool -import -v -trustcacerts -alias ExternalCARoot -file PhilipsRootCA-2011.cer -keystore newkeystore.jks -storepass 123456 #这里输入刚才新密钥库的密码
keytool -import -v -trustcacerts -alias TrustCA -file EMIClass2CA-2011.cer -keystore newkeystore.jks -storepass 123456
keytool -import -v -trustcacerts -alias SecureServerCA -file EMIClass2PolicyCA-2011.cer -keystore newkeystore.jks -storepass 123456
将公钥添加到客户端信任库.jks
keytool -export -alias 1 -keystore newkeystore.jks -file cert.pem #使用 发出以下命令从文件中导出公钥
keytool -import -alias phicert -file cert.pem -keystore client-truststore.jks -storepass wso2carbon #将在上一步中提取的公钥导入到文件中,
4,修改yaml指向新的密钥库
vim kubernetes-apim/advanced/am-pattern-1/templates/am/instance-1/wso2am-pattern-1-am-conf.yaml
[keystore.tls]
file_name = "newkeystore.jks"
type = "JKS"
password = "123456"
alias = "1" #
key_password = "123456"
5,直接吧这个配置好证书的目录通过PVC挂载到pod里,这样就不用在pod配置且可以直接目录数据持久化
vim kubernetes-apim/advanced/am-pattern-1/templates/am/instance-1/wso2am-pattern-1-am-deployment.yaml
volumeMounts:
- name: tls-ssl-ca-prod
mountPath: /home/wso2carbon/wso2am-4.1.0/repository/resources/security/
volumes:
- name: tls-ssl-ca-prod
persistentVolumeClaim:
claimName: tls-ssl-ca-prod
6,更新pod配置,如下图链接为安全
helm upgrade wso2-prod /root/wso2/kubernetes-apim-prod/advanced/am-pattern-1/ -n project-apimanager
四,apiamanger-wso2,集成keycloak
1,先登入 keycloak 进入realm,一个realm可以配置多个环境,如果配置在不同的realm登入就是独立的,如果配置在一个realm里面配置多个环境的Client,那么登入状态就是共享的
2, 在realm 创建clents
Valid Redirect URLs:这个是一个回调的URL,登入keycloak跳转的页面从镜像的URL,这个就写刚才hostname的URL,后面的URI改为通配符”*“,然后先save
登入 https://api-test.apps.openshift.devops.philips-healthsuitechina.com.cn/carbon 这个URI
这里还没有,配置第三方登入的,这里点击add添加一个
这个名字自定义即可
这个Clint Id填写keycloak 进入realm的ID
Api-manager-wso2的Clinet Secret到keycloak的credentials如下两张图示
从这里点开
点开后跳转到这里,
上图autorization_endpint对应下图的authorization Endpoint URL
上图 token_endpoint对应下图 Token Endpoint URL:
Callback Uri 这个是回调的不用改默认就配置好的
如上图Userinfo_endpint对应下图的Userinfo Endpoint URL
上图的end_session_endpint对应下图 Logout Endpoint URL,这个名字有点不对应但是看end_session_endpint的结尾可以看出是logout
scope=openid 这个就是固定的配置,配置完成然后保存
apiamanger有好几个URI:
API Manager Publisher:
https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/publisher
API Manager DevPortal: https://api.apps.openshift.devops.philips-healthsuitechina.com.cn
/devportal
API Manager Carbon Console: https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/
carbon #另外三个都可以继承keycloak,这个无法继承keycloak,因为这个是用来管理identity Providers
用来做配置管理的:https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/admin #
每当登入一个URI这里就会多一个Service Provider ID
Identity Providers配置一次就可以了,现在让Service Providers 去应用刚才keycloak的配置就可以了,点开apim_publisher,
这里选中我们刚才配置的 Keycloak登入,保存
保存后在回到这里在访问apimanager就会跳到keycloak登入界面
这里不需要手动添加用户,这里会自动同步code1里面的用户
这个同步应该是集成了code1,使用Ldap集成的
这里登入后会报错,因为还没授权,apimanager集成keycloak后需要退出两次,这里应该是个Bug
然后配置权限,这个权限是和role绑定的,所以我们只需要为code1的用户设置他的role,然后在把role关联到apimanager的role,然后就会获得到对应的权限了
这里使用默认的role就可以,
点开这里
点开下面,我们要设置apiamanger的role和keycloak的role的对应关系,这个等一下要在keycloak里的role对应
下图keycloak创建role要和上面的role名字是一 一对应的
添加client roles,选中后点击,add selected ,为了使用code1登入之后把刚才在client下面设置的role返回到我们用户信息里面
添加完成后编辑
Tiken Claim Name 要设置为roles,(apimanager认证机制就是会那这个字段里面的角色信息去认证你的权限他的字段名字必须是这个),下面的都勾选上然后save
用code1搜索对应的用户
displayName是等一下使用code1登入后显示的名称,role是登入认证的URL
preferred_username 如果可以手动调用keycloak的code1认证登入的话,可以看到认证信息的
下面的两个选项对应选上
这里这个选项的意思是说通过keycloak登入后会把用户同步到apimanager的用户列表
五,测试:这里使用code1登入成功,把生产在使用的api导出过来测试并发布测试
点击Create完成创建
创建完成之后发布api,发布的时候需要输入一个URL
发布完成之后就可以在 https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/devportal/ #这个URL看到
六,配置页面跳转
https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/devportal
把这个URL也开启keycloak认证如下图
在这个页面点击https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/publisher就可以跳转到devportal的api的详细信息这里了
七,配置邮件通知,在每次发布和更新api的时候都会邮件通知对应的订阅人
vim wso2am-pattern-1-am-conf.yaml #连个conf文件都需要加这几条相同的配置
[apim.notification]
from_address = "APIM_PROD_Noreply@philips.com" #先申请好邮件服务器账号密码
username = "smtp0192"
password = "16BE2MFE"
signature = "APIM_PROD_Noreply"
hostname = "smtprelay-asp1.philips.com"
port = "25"
enable_start_tls = true
enable_authentication = true
配置完成后更新服务pod会被重建
helm upgrade wso2 -n projak-apimanager
自定义邮箱发送内容
登入这个URI https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/admin
到这里搜索enable这个关键字找到这一段
把这里的hostname:9443 改成当前环境route配置的URL
"Template": " <html> <body> <h3 style=\"color:Black;\">We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our Developer Portal.</h3><a href=\"https://api.apps.openshift.devops.philips-healthsuitechina.com.cn/devportal\">Click here to Visit WSO2 API Developer Portal</a></body></html>"
}
触发邮件,首先先订阅api,这里先开启允许订阅配置,选择这个是可以允许无限次订阅
订阅此api
基础当前这个api创建一个新版本
命名为2.0
到这里直接点击发布
这里就收到邮件了,点击这个连接就可以直接跳转到devportal,看到刚才发布的api,这样就成功配置了邮箱
八,测试通过后编写脚本把发布到生产环境的api导入到现在这个环境
由于api很多需要导入导出,手动操作很麻烦,官方有提供apictl命令行的管理工具这里可以写个shell脚本截取对应字段在导入的时候引用对应字段
先添加需要导入导出的环境
apictl add env okd-prod --apim https://api.apps.openshift.devops.philips-healthsuitechina.com.cn
apictl add env test --apim https://test.cn.api.philips.com:9445
这里如果你的apimanager-wso2的服务是4.1.0 那你的apictl命令也要是4.1.0如果差了一些版本就会不出来东西
#!/bin/bash
usage="./migration.sh -f <from_env> -t <to_env>"
while getopts ":f:t:" opt; do
case $opt in
f) from="$OPTARG" ;;
t) to="$OPTARG" ;;
-*) echo "Option $opt needs a valid argument">&2 ; break ;;
\?) echo "Invalid option -$OPTARG">&2 ; break ;;
esac
done
if [[ -z ${from+x} || -z ${to+x} ]] ; then
echo "usage: $usage"
exit 1
fi
apictl login ${from} -k
apictl get apis -e ${from} -l 9999 -k | grep -v NAME | while read -r line; do
name=`echo $line | cut -f 2 -d " " `
version=`echo $line | cut -f 3 -d " " `
apictl export api -e ${from} -n ${name} -v ${version} --preserve-status -k
done
apictl login ${to} -k
cd ${HOME}/.wso2apictl/exported/apis/${from}/
for file in * ; do
apictl import api -f ${file} -e ${to} -k
done
echo "-------- done. --------"