ocp4: setup VPN on worker nodes
Deploy openvpn client on each node with a router. OpenVPN certs needs to be available for each node in /srv/private/ansible/files/vpn/pki/issued/$hostname.{crt,key}
This commit is contained in:
parent
877aa2f99f
commit
7e084f5140
11 changed files with 319 additions and 0 deletions
72
playbooks/openshift-apps/openvpn.yml
Normal file
72
playbooks/openshift-apps/openvpn.yml
Normal file
|
@ -0,0 +1,72 @@
|
|||
- name: make the app be real
|
||||
# We don't have any VPN set up on stg
|
||||
hosts: os_masters[0]
|
||||
user: root
|
||||
gather_facts: False
|
||||
|
||||
vars_files:
|
||||
- /srv/web/infra/ansible/vars/global.yml
|
||||
- "/srv/private/ansible/vars.yml"
|
||||
- /srv/web/infra/ansible/vars/{{ ansible_distribution }}.yml
|
||||
vars:
|
||||
app: openvpn
|
||||
|
||||
roles:
|
||||
- role: openshift/project
|
||||
description: Openvpn Client
|
||||
appowners: []
|
||||
|
||||
- role: openshift/object
|
||||
objectname: imagestream.yml
|
||||
template: imagestream.yml
|
||||
|
||||
- role: openshift/object
|
||||
objectname: buildconfig.yml
|
||||
template: buildconfig.yml
|
||||
|
||||
- role: openshift/object
|
||||
template: serviceaccount.yml
|
||||
objectname: serviceaccount.yml
|
||||
|
||||
- role: openshift/object
|
||||
template: scc.yml
|
||||
objectname: scc.yml
|
||||
|
||||
- role: openshift/object
|
||||
template: scc_role.yml
|
||||
objectname: scc_role.yml
|
||||
|
||||
- role: openshift/object
|
||||
template: scc_rolebinding.yml
|
||||
objectname: scc_rolebinding.yml
|
||||
|
||||
# load openVPN client certs for each node in ocp_nodes into ocp secret
|
||||
# expect certs to be generated in {{private}}/files/vpn/pki/issued/
|
||||
- role: openshift/object
|
||||
template: secrets.yml
|
||||
objectname: secrets.yml
|
||||
ocp_nodes:
|
||||
- worker06.ocp.iad2.fedoraproject.org
|
||||
|
||||
- role: openshift/object
|
||||
template: configmap.yml
|
||||
objectname: configmap.yml
|
||||
|
||||
- role: openshift/object
|
||||
template: deployment.yml
|
||||
objectname: deployment.yml
|
||||
|
||||
- role: openshift/start-build
|
||||
buildname: openvpn
|
||||
|
||||
###############################################
|
||||
# actions to delete the project from OpenShift
|
||||
###############################################
|
||||
# to run: sudo rbac-playbook -l os_masters_stg[0] -t delete openshift-apps/openvpn.yml
|
||||
- role: openshift/object-delete
|
||||
objecttype: project
|
||||
objectname: openvpn
|
||||
tags:
|
||||
- never
|
||||
- delete
|
||||
|
27
roles/openshift-apps/openvpn/templates/buildconfig.yml
Normal file
27
roles/openshift-apps/openvpn/templates/buildconfig.yml
Normal file
|
@ -0,0 +1,27 @@
|
|||
apiVersion: build.openshift.io/v1
|
||||
kind: BuildConfig
|
||||
metadata:
|
||||
name: openvpn
|
||||
spec:
|
||||
failedBuildsHistoryLimit: 5
|
||||
nodeSelector: null
|
||||
output:
|
||||
to:
|
||||
kind: ImageStreamTag
|
||||
name: openvpn:latest
|
||||
postCommit: {}
|
||||
resources: {}
|
||||
runPolicy: Serial
|
||||
source:
|
||||
dockerfile: |-
|
||||
FROM registry.fedoraproject.org/fedora:latest
|
||||
RUN dnf -y install \
|
||||
openvpn && \
|
||||
dnf clean all
|
||||
WORKDIR /config
|
||||
CMD openvpn --config openvpn.conf
|
||||
type: Dockerfile
|
||||
strategy:
|
||||
dockerStrategy: {}
|
||||
type: Docker
|
||||
successfulBuildsHistoryLimit: 5
|
25
roles/openshift-apps/openvpn/templates/client.conf
Normal file
25
roles/openshift-apps/openvpn/templates/client.conf
Normal file
|
@ -0,0 +1,25 @@
|
|||
client
|
||||
|
||||
dev tun
|
||||
|
||||
proto udp
|
||||
|
||||
# Specify multiple vpn servers here
|
||||
remote gateway
|
||||
remote bastion02
|
||||
remote bastion-iad01
|
||||
|
||||
resolv-retry infinite
|
||||
|
||||
nobind
|
||||
|
||||
persist-key
|
||||
persist-tun
|
||||
|
||||
ca ssl/ca.crt
|
||||
cert ssl/client.crt
|
||||
key ssl/client.key
|
||||
|
||||
comp-lzo
|
||||
|
||||
keepalive 10 60
|
8
roles/openshift-apps/openvpn/templates/configmap.yml
Normal file
8
roles/openshift-apps/openvpn/templates/configmap.yml
Normal file
|
@ -0,0 +1,8 @@
|
|||
{% macro load_file(filename) %}{% include filename %}{%- endmacro -%}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: openvpn-config
|
||||
data:
|
||||
openvpn.conf: |-
|
||||
{{ load_file('client.conf') | indent }}
|
97
roles/openshift-apps/openvpn/templates/deployment.yml
Normal file
97
roles/openshift-apps/openvpn/templates/deployment.yml
Normal file
|
@ -0,0 +1,97 @@
|
|||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: openvpn-client
|
||||
annotations:
|
||||
image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"openvpn:latest"},"fieldPath":"spec.template.spec.containers[?(@.name==\"setup\")].image"},{"from":{"kind":"ImageStreamTag","name":"openvpn:latest"},"fieldPath":"spec.template.spec.containers[?(@.name==\"openvpn\")].image"}]'
|
||||
spec:
|
||||
replicas: {{ ocp_nodes | length }}
|
||||
selector:
|
||||
matchLabels:
|
||||
app: openvpn-client
|
||||
strategy:
|
||||
type: Recreate
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: openvpn-client
|
||||
spec:
|
||||
initContainers:
|
||||
- name: setup
|
||||
image: image-registry.openshift-image-registry.svc:5000/openvpn-client/openvpn:latest
|
||||
command: ["/bin/bash", "-c"]
|
||||
args:
|
||||
- >
|
||||
set -e;
|
||||
cp -v /ssl/${NODENAME}.crt /config/ssl/client.crt;
|
||||
cp -v /ssl/${NODENAME}.key /config/ssl/client.key;
|
||||
cp -v /ssl/ca.crt /config/ssl/;
|
||||
env:
|
||||
- name: NODENAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: spec.nodeName
|
||||
volumeMounts:
|
||||
- mountPath: /ssl
|
||||
name: all-certs
|
||||
- mountPath: /config/ssl
|
||||
name: openvpn-ssl
|
||||
containers:
|
||||
- image: image-registry.openshift-image-registry.svc:5000/openvpn/openvpn:latest
|
||||
imagePullPolicy: IfNotPresent
|
||||
securityContext:
|
||||
capabilities:
|
||||
add: ["NET_ADMIN"]
|
||||
name: openvpn
|
||||
volumeMounts:
|
||||
- mountPath: /config/ssl
|
||||
name: openvpn-ssl
|
||||
- mountPath: /config/openvpn.conf
|
||||
name: openvpn-config
|
||||
readOnly: true
|
||||
subPath: openvpn.conf
|
||||
- mountPath: /dev/net/tun
|
||||
readOnly: true
|
||||
name: tun-device
|
||||
hostNetwork: true
|
||||
restartPolicy: Always
|
||||
serviceAccount: openvpn
|
||||
serviceAccountName: openvpn
|
||||
terminationGracePeriodSeconds: 5
|
||||
volumes:
|
||||
- name: all-certs
|
||||
secret:
|
||||
secretName: openvpn-certs
|
||||
defaultMode: 0400
|
||||
- configMap:
|
||||
name: openvpn-config
|
||||
name: openvpn-config
|
||||
- name: tun-device
|
||||
hostPath:
|
||||
path: /dev/net/tun
|
||||
- name: openvpn-ssl
|
||||
emptyDir: {}
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: worker06.ocp.iad2.fedoraproject.org
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- openvpn-client
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
podAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
- labelSelector:
|
||||
matchExpressions:
|
||||
- key: ingresscontroller.operator.openshift.io/deployment-ingresscontroller
|
||||
operator: In
|
||||
values:
|
||||
- default
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
namespaces:
|
||||
- openshift-ingress
|
||||
|
7
roles/openshift-apps/openvpn/templates/imagestream.yml
Normal file
7
roles/openshift-apps/openvpn/templates/imagestream.yml
Normal file
|
@ -0,0 +1,7 @@
|
|||
apiVersion: image.openshift.io/v1
|
||||
kind: ImageStream
|
||||
metadata:
|
||||
name: openvpn
|
||||
spec:
|
||||
lookupPolicy:
|
||||
local: false
|
43
roles/openshift-apps/openvpn/templates/scc.yml
Normal file
43
roles/openshift-apps/openvpn/templates/scc.yml
Normal file
|
@ -0,0 +1,43 @@
|
|||
allowHostDirVolumePlugin: true
|
||||
allowHostIPC: false
|
||||
allowHostNetwork: true
|
||||
allowHostPID: false
|
||||
allowHostPorts: false
|
||||
allowPrivilegeEscalation: false
|
||||
allowPrivilegedContainer: false
|
||||
allowedCapabilities:
|
||||
- NET_ADMIN
|
||||
apiVersion: security.openshift.io/v1
|
||||
defaultAddCapabilities: null
|
||||
fsGroup:
|
||||
type: MustRunAs
|
||||
groups: []
|
||||
kind: SecurityContextConstraints
|
||||
metadata:
|
||||
annotations:
|
||||
kubernetes.io/description: openvpn specific security context constaints
|
||||
generation: 1
|
||||
name: openvpn
|
||||
priority: null
|
||||
readOnlyRootFilesystem: false
|
||||
requiredDropCapabilities:
|
||||
- KILL
|
||||
- MKNOD
|
||||
- SETUID
|
||||
- SETGID
|
||||
runAsUser:
|
||||
type: RunAsAny
|
||||
seLinuxContext:
|
||||
type: MustRunAs
|
||||
supplementalGroups:
|
||||
type: RunAsAny
|
||||
users: []
|
||||
volumes:
|
||||
- configMap
|
||||
- downwardAPI
|
||||
- emptyDir
|
||||
- persistentVolumeClaim
|
||||
- projected
|
||||
- secret
|
||||
- hostPath
|
||||
|
13
roles/openshift-apps/openvpn/templates/scc_role.yml
Normal file
13
roles/openshift-apps/openvpn/templates/scc_role.yml
Normal file
|
@ -0,0 +1,13 @@
|
|||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: system:openshift:scc:openvpn
|
||||
rules:
|
||||
- apiGroups:
|
||||
- security.openshift.io
|
||||
resourceNames:
|
||||
- openvpn
|
||||
resources:
|
||||
- securitycontextconstraints
|
||||
verbs:
|
||||
- use
|
12
roles/openshift-apps/openvpn/templates/scc_rolebinding.yml
Normal file
12
roles/openshift-apps/openvpn/templates/scc_rolebinding.yml
Normal file
|
@ -0,0 +1,12 @@
|
|||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: system:openshift:scc:openvpn
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: system:openshift:scc:openvpn
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: openvpn
|
||||
namespace: openvpn
|
11
roles/openshift-apps/openvpn/templates/secrets.yml
Normal file
11
roles/openshift-apps/openvpn/templates/secrets.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: openvpn-certs
|
||||
data:
|
||||
ca.crt: {{ lookup('file', private+'/files/vpn/pki/ca.crt') | b64encode }}
|
||||
{% for node in ocp_nodes %}
|
||||
{{node}}.crt: {{ lookup('file', private+'/files/vpn/pki/issued/'+node+'.crt') | b64encode }}
|
||||
{{node}}.key: {{ lookup('file', private+'/files/vpn/pki/issued/'+node+'.key') | b64encode }}
|
||||
{% endfor %}
|
|
@ -0,0 +1,4 @@
|
|||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: openvpn
|
Loading…
Add table
Add a link
Reference in a new issue