http://www.clue2solve.io/tanzu/2020/07/14/install-ksm-and-configure-the-cf-marketplace.html
Steps
It's assumed you have already installed KSM into your Kubernetes Cluster
as shown below. If not please refer to the documentation to get this done
first
$ kubectl get all -n ksm NAME READY STATUS RESTARTS AGE pod/ksm-chartmuseum-78d5d5bfb-2ggdg 1/1 Running 0 15d pod/ksm-ksm-broker-6db696894c-blvpp 1/1 Running 0 15d pod/ksm-ksm-broker-6db696894c-mnshg 1/1 Running 0 15d pod/ksm-ksm-daemon-587b6fd549-cc7sv 1/1 Running 1 15d pod/ksm-ksm-daemon-587b6fd549-fgqx5 1/1 Running 1 15d pod/ksm-postgresql-0 1/1 Running 0 15d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ksm-chartmuseum ClusterIP 10.100.200.107 <none> 8080/TCP 15d service/ksm-ksm-broker LoadBalancer 10.100.200.229 10.195.93.188 80:30086/TCP 15d service/ksm-ksm-daemon LoadBalancer 10.100.200.222 10.195.93.179 80:31410/TCP 15d service/ksm-postgresql ClusterIP 10.100.200.213 <none> 5432/TCP 15d service/ksm-postgresql-headless ClusterIP None <none> 5432/TCP 15d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ksm-chartmuseum 1/1 1 1 15d deployment.apps/ksm-ksm-broker 2/2 2 2 15d deployment.apps/ksm-ksm-daemon 2/2 2 2 15d NAME DESIRED CURRENT READY AGE replicaset.apps/ksm-chartmuseum-78d5d5bfb 1 1 1 15d replicaset.apps/ksm-ksm-broker-6db696894c 2 2 2 15d replicaset.apps/ksm-ksm-broker-8645dfcf98 0 0 0 15d replicaset.apps/ksm-ksm-daemon-587b6fd549 2 2 2 15d NAME READY AGE statefulset.apps/ksm-postgresql 1/1 15d
1. let's start by getting the Broker IP address which when installed using
LoadBalancer type can be retrieved as shown below.
$ kubectl get service ksm-ksm-broker -n ksm
-o=jsonpath='{@.status.loadBalancer.ingress[0].ip}'
10.195.93.188
2. Upgrade your Helm release by running the following using the IP address
from above
$ export BROKER_IP=$(kubectl get service ksm-ksm-broker -n ksm
-o=jsonpath='{@.status.loadBalancer.ingress[0].ip}')
$ helm upgrade ksm ./ksm -n ksm --reuse-values \
--set
cf.brokerUrl="http://$BROKER_IP" \
--set cf.brokerName=KSM
\
--set
cf.apiAddress="https://api.system.run.haas-210.pez.pivotal.io" \
--set cf.username="admin"
\
--set
cf.password="admin-password"
3. Next we configure the ksm CLI. You can download the CLI from
here
configure-ksm-cli.sh
export KSM_IP=$(kubectl get service ksm-ksm-daemon -n ksm
-o=jsonpath='{@.status.loadBalancer.ingress[0].ip}')
export KSM_TARGET=http://$KSM_IP:$(kubectl get svc ksm-ksm-daemon -n
ksm -o=jsonpath='{@.spec.ports[0].port}')
export KSM_USER=admin
export KSM_PASSWORD=$(kubectl get secret -n ksm ksm-ksm-daemon
-o=jsonpath='{@.data.SECURITY_USER_PASSWORD}' | base64 --decode)
4. Verify ksm CLI is configured correctly
$ ksm version
Client Version [0.10.80]
Server Version [0.10.80]
5. Create a YAML file for the KSM service account and
ClusterRoleBinding
using the following YAML:
ksm-sa.yml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: ksm-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: ksm-cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: ksm-admin
namespace: kube-system
Apply as follows
$ kubectl apply -f ksm-sa.yml
6. You need a cluster credential file to register and set default
Kubernetes clusters that is done as follows
cluster-creds.sh
export kube_config="/Users/papicella/.kube/config"
cluster=`grep current $kube_config|sed "s/ //g"|cut -d ":" -f
2`
echo "Using cluster $cluster"
export server=`grep -B 2 "name: $cluster" $kube_config \
|grep server|sed "s/ //g"|sed "s/^[^:]*://g"`
export certificate=`grep -B 2 "name: $cluster" $kube_config \
|grep certificate|sed "s/ //g"|sed "s/.*://"`
export secret_name=$(kubectl get serviceaccount ksm-admin \
--namespace=kube-system -o
jsonpath='{.secrets[0].name}')
export secret_val=$(kubectl --namespace=kube-system get secret
$secret_name \
-o jsonpath='{.data.token}')
export secret_val=$(echo ${secret_val} | base64 --decode)
cat > cluster-creds.yaml << EOF
token: ${secret_val}
server: ${server}
caData: ${certificate}
EOF
echo ""
echo "ready to roll!!!!"
echo ""
Before running this script it's best to make sure you have targeted the
correct K8s cluster you wish to. You can run a command as follows to
verify that
$ kubectl config current-context
tas4k8s
7. Now we have a "cluster-creds.yaml" file we can go ahead and
register the Kubernetes cluster with KSM as follows
$ ksm cluster register ksm-svcs ./cluster-creds.yaml
$ ksm cluster set-default ksm-svcs
Verify as follows:
$ ksm cluster list
CLUSTER NAME IP ADDRESS
DEFAULT
ksm-svcs
https://tas4k8s.run.haas-210.pez.pivotal.io:8443
true
8. Now we can go ahead and create a Marketplace offering for MySQL. To do
that we will use the Bitnami MySQL chart as shown below
$ git clone https://github.com/bitnami/charts.git
$ cd ./charts/bitnami/mysql
** create bind.yaml as follows which is required so our service
binding from Tanzu Application Service will inject the right JSON we
are expecting or requiring at bind time **
$ cat bind.yaml
template: |
local filterfunc(j) = std.length(std.findSubstr("mysql",
j.name)) > 0;
local s1 = std.filter(filterfunc, $.services);
{
hostname:
s1[0].status.loadBalancer.ingress[0].ip,
name: s1[0].name,
jdbcUrl: "jdbc:mysql://" + self.hostname +
"/my_db?user=" + self.username + "&password=" + self.password +
"&useSSL=false",
uri: "mysql://" + self.username + ":" + self.password +
"@" + self.hostname + ":" + self.port + "/my_db?reconnect=true",
password:
$.secrets[0].data['mysql-root-password'],
port: 3306,
username: "root"
}
$ helm package .
# cd ..
$ ksm offer save ./mysql ./mysql/mysql-6.14.7.tgz
Verify MySQL is now part of the offer list as follows
$ ksm offer list MARKETPLACE NAME INCLUDED CHARTS VERSION PLANS rabbitmq rabbitmq 6.18.1 [persistent ephemeral] mysql mysql 6.14.7 [default]
9. Now we need to login as an ADMIN user
Verify you are logged in as admin user using the CF CLI:
$ cf target
api endpoint:
https://api.system.run.haas-210.pez.pivotal.io
api version: 2.151.0
user: admin
org: system
space: development
10. At this point you can see the KSM service broker registered with
TAS4K8s as follows
$ cf service-brokers
Getting service brokers as admin...
name url
KSM http://10.195.93.188
11. Enable access to the MySQL service as follows
$ cf enable-service-access mysql
Verify it's enabled:
$ cf service-access
Getting service access as admin...
broker: KSM
service plan
access orgs
mysql default
all
rabbitmq ephemeral all
rabbitmq persistent all
12. At this point it's best to log out of admin and log back in as a user
that is not admin
$ cf target
api endpoint:
https://api.system.run.haas-210.pez.pivotal.io
api version: 2.151.0
user: pas
org: apples-org
space: development
13. Create a MySQL service as follows. I passing in some JSON to indicate
that my K8s cluster support's a LoadBalancer type so use that as part of the
creation of the service.
$ cf create-service mysql default pas-mysql -c
'{"service":{"type":"LoadBalancer"}}'
14. Check that the service has created correctly it will take a few
minutes
$ cf services
Getting services in org apples-org / space development as
pas...
name service plan
bound apps last
operation broker upgrade
available
pas-mysql mysql default
my-springboot-app create succeeded
KSM no
15. Your service is created in it's own K8s namespace BUT that may not be
the case at some point.
$ kubectl get all -n ksm-2e526124-11a3-4d38-966c-b3ffd45471d7 NAME READY STATUS RESTARTS AGE pod/k-wqo5mubw-mysql-master-0 1/1 Running 0 15d pod/k-wqo5mubw-mysql-slave-0 1/1 Running 0 15d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/k-wqo5mubw-mysql LoadBalancer 10.100.200.12 10.195.93.192 3306:30563/TCP 15d service/k-wqo5mubw-mysql-slave LoadBalancer 10.100.200.130 10.195.93.191 3306:31982/TCP 15d NAME READY AGE statefulset.apps/k-wqo5mubw-mysql-master 1/1 15d statefulset.apps/k-wqo5mubw-mysql-slave 1/1 15d
16. At this point we can now test our new MySQL service we created and use
a Spring Boot application to test this out with.
The following GitHub repo can be used for that. Ignore the steps to create
a service as you have already done that
Finally to define service plans see the link below
More Information
Container Services Manager(KSM)
Tanzu Application Service for Kubernetes
No comments:
Post a Comment