The last post quickly outlined on how you can setup MiniShift for playing around with OpenShift on your workstation. In this post we’ll setup PostgreSQL in MiniShift using the default PostgreSQL image that already comes with MiniShift.
When MiniShift is currently stopped start it up:
dwe@box:~$ minishift start dwe@box:~$ eval $(minishift oc-env) dwe@box:~$ which oc /home/dwe/.minishift/cache/oc/v3.9.0/linux/oc
With OpenShift everything is organized into projects and the first thing you need to do is to create a project. You can either do that using the command line or the web interface. Doing it using the command line is quite simple and fast. The first step is to login to OpenShift:
dwe@box:~$ oc login Authentication required for https://192.168.99.100:8443 (openshift) Username: system Password: Login successful. You don't have any projects. You can try to create a new project, by running oc new-project
The output of the login command already tells what you need to do to create a new project:
dwe@box:~$ oc new-project postgres Now using project "postgres" on server "https://192.168.99.100:8443". You can add applications to this project with the 'new-app' command. For example, try: oc new-app centos/ruby-22-centos7~https://github.com/openshift/ruby-ex.git to build a new example application in Ruby.
Doing the same with the web interface of course needs more time:
To get a list of available images from the command line:
dwe@box:~$ oc get imagestreams --namespace openshift NAME DOCKER REPO TAGS UPDATED dotnet 172.30.1.1:5000/openshift/dotnet 2.0,latest 4 hours ago dotnet-runtime 172.30.1.1:5000/openshift/dotnet-runtime 2.0,latest 4 hours ago httpd 172.30.1.1:5000/openshift/httpd 2.4,latest 4 hours ago jenkins 172.30.1.1:5000/openshift/jenkins 1,2,latest 4 hours ago mariadb 172.30.1.1:5000/openshift/mariadb 10.1,10.2,latest 4 hours ago mongodb 172.30.1.1:5000/openshift/mongodb 2.4,2.6,3.2 + 2 more... 4 hours ago mysql 172.30.1.1:5000/openshift/mysql 5.5,5.6,5.7 + 1 more... 4 hours ago nginx 172.30.1.1:5000/openshift/nginx 1.10,1.12,1.8 + 1 more... 4 hours ago nodejs 172.30.1.1:5000/openshift/nodejs 8,latest,0.10 + 2 more... 4 hours ago perl 172.30.1.1:5000/openshift/perl 5.24,latest,5.16 + 1 more... 4 hours ago php 172.30.1.1:5000/openshift/php 5.5,5.6,7.0 + 2 more... 4 hours ago postgresql 172.30.1.1:5000/openshift/postgresql 9.2,9.4,9.5 + 2 more... 4 hours ago python 172.30.1.1:5000/openshift/python 3.3,3.4,3.5 + 3 more... 4 hours ago redis 172.30.1.1:5000/openshift/redis 3.2,latest 4 hours ago ruby 172.30.1.1:5000/openshift/ruby 2.0,2.2,2.3 + 2 more... 4 hours ago wildfly 172.30.1.1:5000/openshift/wildfly 10.1,8.1,9.0 + 2 more... 4 hours ago
Quite a few to choose from but we of course are interested in the postgresql one.
dwe@box:~$ oc new-app -e POSTGRESQL_USER=blubb -e POSTGRESQL_PASSWORD=blubb -e POSTGRESQL_DATABASE=blubb postgresql
Checking the logs is always a good idea. For this we need to know the pod:
dwe@box:~$ oc get pods NAME READY STATUS RESTARTS AGE postgresql-1-8n85h 1/1 Running 0 5m
Now that we know the pod we can ask for the logs:
dwe@box:~$ oc logs postgresql-1-8n85h The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "en_US.utf8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /var/lib/pgsql/data/userdata ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok Success. You can now start the database server using: pg_ctl -D /var/lib/pgsql/data/userdata -l logfile start WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. waiting for server to start....LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log". done server started => sourcing /usr/share/container-scripts/postgresql/start/set_passwords.sh ... ALTER ROLE waiting for server to shut down.... done server stopped Starting server... LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log".
Looks good so far. How can we work with the PostgreSQL instance now? One way is to start a remote shell:
dwe@box:~$ oc rsh postgresql-1-8n85h sh-4.2$ ps -ef UID PID PPID C STIME TTY TIME CMD 1000100+ 1 0 0 13:29 ? 00:00:00 postgres 1000100+ 57 1 0 13:29 ? 00:00:00 postgres: logger process 1000100+ 59 1 0 13:29 ? 00:00:00 postgres: checkpointer process 1000100+ 60 1 0 13:29 ? 00:00:00 postgres: writer process 1000100+ 61 1 0 13:29 ? 00:00:00 postgres: wal writer process 1000100+ 62 1 0 13:29 ? 00:00:00 postgres: autovacuum launcher pr 1000100+ 63 1 0 13:29 ? 00:00:00 postgres: stats collector proces 1000100+ 85 0 0 13:46 ? 00:00:00 /bin/sh sh-4.2$ psql -c "\l" List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+-------------------- --- blubb | blubb | UTF8 | en_US.utf8 | en_US.utf8 | postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgr es template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgr es (4 rows)
This is usually not what you want to do. What you rather want is to make the instance available from outside the cluster. How can you do that? Either you do port forwarding:
dwe@box:~$ oc port-forward postgresql-1-8n85h 5432 Forwarding from 127.0.0.1:5432 -> 5432
This will stay in the foreground. From another session you can use psql to connect:
dwe@box:~$ psql -h localhost -U blubb blubb psql (9.5.12, server 9.6.5) WARNING: psql major version 9.5, server major version 9.6. Some psql features might not work. Type "help" for help. blubb=>
… or you can expose a service:
dwe@box:~$ oc expose dc postgresql --type=LoadBalancer --name=mpostgresql-ingress service "mpostgresql-ingress" exposed dwe@box:~$ oc get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mpostgresql-ingress LoadBalancer 172.30.15.98 172.29.104.134,172.29.104.134 5432:31734/TCP 38s
From now on you can connect using the MiniShift IP and the port listed above:
dwe@box:~$ psql -h $(minishift ip) -p 31734 -U blubb Password for user blubb: psql (9.5.12, server 9.6.5) WARNING: psql major version 9.5, server major version 9.6. Some psql features might not work. Type "help" for help. blubb=> \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- blubb | blubb | UTF8 | en_US.utf8 | en_US.utf8 | postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) blubb=>
Be aware that the storage is not persistent in that case and you’ll lose everything when the container is stopped. In the next post we’ll look into how we can deploy the containers which are provided by EnterpriseDB.