Passing Docker container's run parameters in Kubernetes

8/23/2017

I have two containers (GitLab and PostgreSQL) running on RancherOS v1.0.3. I would like to make them part of Kubernetes cluster.

[rancher@rancher-agent-1 ~]$ cat postgresql.sh
docker run --name gitlab-postgresql -d \
    --env 'POSTGRES_DB=gitlabhq_production' \
    --env 'POSTGRES_USER=gitlab' --env 'POSTGRES_PASSWORD=password' \
    --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \
    postgres:9.6-2


[rancher@rancher-agent-1 ~]$ cat gitlab.sh
docker run --name gitlab -d \
    --link gitlab-postgresql:postgresql \
    --publish 443:443 --publish 80:80 \
    --env 'GITLAB_PORT=80' --env 'GITLAB_SSH_PORT=10022' \
    --env 'GITLAB_SECRETS_DB_KEY_BASE=64-char-key-A' \
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=64-char-key-B' \
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=64-char-key-C' \
    --volume /srv/docker/gitlab/gitlab:/home/git/data \
    sameersbn/gitlab:9.4.5

Queries:
1) I have some idea about how to use YAML files to provision pods, replication controller etc. but i am not sure how to pass the above docker run parameters to Kubernetes so that it can apply the same to image(s) correctly.

2) I'm not sure whether --link argument (used in gitlab.sh above) also need to be passed in Kubernetes. Although i am currently deploying both containers on single host but will be creating cluster of each (PostgreSQL and GitLab) later, so just wanted to confirm whether inter-host communication will automatically be taken care of by Kubernetes. If not, then what options can be explored?

-- Technext
docker
kubernetes
rancher

1 Answer

8/23/2017

You should first try to represent your run statements into a docker-compose.yml file. Which is quite easy and it would turn something like below

version: '3'

services:
  postgresql:
    image: postgres:9.6-2
    environment:
      - "POSTGRES_DB=gitlabhq_production"
      - "POSTGRES_USER=gitlab"
      - "POSTGRES_PASSWORD=password"
    volumes:
      - /srv/docker/gitlab/postgresql:/var/lib/postgresql
  gitlab:
    image: sameersbn/gitlab:9.4.5
    ports:
      - "443:443"
      - "80:80"
    environment:
      - "GITLAB_PORT=80"
      - "GITLAB_SSH_PORT=10022"
      - "GITLAB_SECRETS_DB_KEY_BASE=64-char-key-A"
      - "GITLAB_SECRETS_SECRET_KEY_BASE=64-char-key-B"
      - "GITLAB_SECRETS_OTP_KEY_BASE=64-char-key-C"
    volumes:
      - /srv/docker/gitlab/gitlab:/home/git/data

Now there is a amazing tool name kompose from kompose.io which does the conversion part for you. If you convert the above you will get the related files

$ kompose convert -f docker-compose.yml
WARN Volume mount on the host "/srv/docker/gitlab/gitlab" isn't supported - ignoring path on the host
WARN Volume mount on the host "/srv/docker/gitlab/postgresql" isn't supported - ignoring path on the host
INFO Kubernetes file "gitlab-service.yaml" created
INFO Kubernetes file "postgresql-service.yaml" created
INFO Kubernetes file "gitlab-deployment.yaml" created
INFO Kubernetes file "gitlab-claim0-persistentvolumeclaim.yaml" created
INFO Kubernetes file "postgresql-deployment.yaml" created
INFO Kubernetes file "postgresql-claim0-persistentvolumeclaim.yaml" created

Now you have to fix the volume mount part as per kubernetes. This completes 80% of the work and you just need figure out the rest 20%

Here is a cat of all the generate files, so that you can just see what kind of files are generated

==> gitlab-claim0-persistentvolumeclaim.yaml <==
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: gitlab-claim0
  name: gitlab-claim0
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

==> gitlab-deployment.yaml <==
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: gitlab
  name: gitlab
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: gitlab
    spec:
      containers:
      - env:
        - name: GITLAB_PORT
          value: "80"
        - name: GITLAB_SECRETS_DB_KEY_BASE
          value: 64-char-key-A
        - name: GITLAB_SECRETS_OTP_KEY_BASE
          value: 64-char-key-C
        - name: GITLAB_SECRETS_SECRET_KEY_BASE
          value: 64-char-key-B
        - name: GITLAB_SSH_PORT
          value: "10022"
        image: sameersbn/gitlab:9.4.5
        name: gitlab
        ports:
        - containerPort: 443
        - containerPort: 80
        resources: {}
        volumeMounts:
        - mountPath: /home/git/data
          name: gitlab-claim0
      restartPolicy: Always
      volumes:
      - name: gitlab-claim0
        persistentVolumeClaim:
          claimName: gitlab-claim0
status: {}

==> gitlab-service.yaml <==
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: gitlab
  name: gitlab
spec:
  ports:
  - name: "443"
    port: 443
    targetPort: 443
  - name: "80"
    port: 80
    targetPort: 80
  selector:
    io.kompose.service: gitlab
status:
  loadBalancer: {}

==> postgresql-claim0-persistentvolumeclaim.yaml <==
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: postgresql-claim0
  name: postgresql-claim0
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

==> postgresql-deployment.yaml <==
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: postgresql
  name: postgresql
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: postgresql
    spec:
      containers:
      - env:
        - name: POSTGRES_DB
          value: gitlabhq_production
        - name: POSTGRES_PASSWORD
          value: password
        - name: POSTGRES_USER
          value: gitlab
        image: postgres:9.6-2
        name: postgresql
        resources: {}
        volumeMounts:
        - mountPath: /var/lib/postgresql
          name: postgresql-claim0
      restartPolicy: Always
      volumes:
      - name: postgresql-claim0
        persistentVolumeClaim:
          claimName: postgresql-claim0
status: {}

==> postgresql-service.yaml <==
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: postgresql
  name: postgresql
spec:
  clusterIP: None
  ports:
  - name: headless
    port: 55555
    targetPort: 0
  selector:
    io.kompose.service: postgresql
status:
  loadBalancer: {}
-- Tarun Lalwani
Source: StackOverflow