blob: 7c48504a251e8e727b3078511998e8322e3d2af9 [file] [log] [blame]
Zack Williams794532a2021-03-18 17:38:36 -07001..
2 SPDX-FileCopyrightText: © 2020 Open Networking Foundation <support@opennetworking.org>
3 SPDX-License-Identifier: Apache-2.0
4
5VPN Bootstrap
6=============
7
Hyunsun Moondb739a32021-08-12 01:59:21 -07008This section guides you through setting up a VPN connection between Aether
9Central in GCP and ACE.
Hyunsun Moon049b5052021-07-30 12:41:03 -070010We will be using GitOps based Aether CI/CD system for this and what you need to do is
Zack Williams1ae109e2021-07-27 11:17:04 -070011create a patch for the new edge in ``aether-pod-configs``, where all edge infrastructure
Hyunsun Moonbbad67d2021-08-12 00:47:27 -070012configuration is stored.
13
14Here is a brief overview of each step. Note that some of the steps described here are not
15directly related to setting up a VPN, but are prerequisites for adding a new edge.
16
17**1. Add deployment jobs**
Hyunsun Moondb739a32021-08-12 01:59:21 -070018Each edge has its own Jenkins jobs that build and execute an infrastructure change plan
19based on the configurations specified in aether-pod-configs.
20In this step, you'll add those jobs to Aether CI/CD system for the new edge.
Hyunsun Moonbbad67d2021-08-12 00:47:27 -070021
22**2. Update global resource maps**
23aether-pod-configs maintains complete list of clusters, VPN connections, and users
24in separate global resource files. Before adding edge specific configurations,
25it is required to update those global resource maps first.
26
27**3. Generate Ansible and Terraform configs**
28In this step, you'll add Ansible and Terraform configs necessary to install and
Zack Williams1ae109e2021-07-27 11:17:04 -070029configure VPN software at the edge and set up VPN gateway, router, and firewall
30on GCP.
Hyunsun Moonbbad67d2021-08-12 00:47:27 -070031
32**4. Submit your changes**
Hyunsun Moondb739a32021-08-12 01:59:21 -070033Finally, submit your aether-pod-configs changes to run the deployment job added
34in the first step.
Hyunsun Moonbbad67d2021-08-12 00:47:27 -070035
36.. attention::
37
38 If you are adding another ACE to an existing VPN connection, go to
Hyunsun Moondb739a32021-08-12 01:59:21 -070039 :ref:`Add ACE to an existing VPN connection <add_ace_to_vpn>`.
40
41.. attention::
42
43 Make sure that UDP port 500, UDP port 4500, and ESP from **gcpvpn1.infra.aetherproject.net(35.242.47.15)**
44 and **gcpvpn2.infra.aetherproject.net(34.104.68.78)** are allowed in the firewall at the edge.
Zack Williams794532a2021-03-18 17:38:36 -070045
Hyunsun Moon049b5052021-07-30 12:41:03 -070046.. _add_deployment_jobs:
47
Hyunsun Moona703edf2021-07-29 15:55:15 -070048Add deployment jobs
49-------------------
Hyunsun Moonfabe9742021-08-01 06:41:44 -070050First, you need to add Jenkins jobs to Aether CI/CD system that build and apply infrastructure change
Hyunsun Moon049b5052021-07-30 12:41:03 -070051plans for the new edge. This can be done by creating a patch to **aether-ci-management** repository.
Zack Williams794532a2021-03-18 17:38:36 -070052
Hyunsun Moona703edf2021-07-29 15:55:15 -070053Download **aether-ci-management** repository.
Zack Williams794532a2021-03-18 17:38:36 -070054
Hyunsun Moona703edf2021-07-29 15:55:15 -070055.. code-block:: shell
56
57 $ cd $WORKDIR
58 $ git clone "ssh://[username]@gerrit.opencord.org:29418/aether-ci-management"
59
Zack Williams1ae109e2021-07-27 11:17:04 -070060Add the jobs for the new cluster at the end of the ``cd-pipeline-terraform-ace`` project job list.
Hyunsun Moona703edf2021-07-29 15:55:15 -070061Make sure to add both pre-merge and post-merge jobs.
62Note that the cluster name specified here will be used in the rest of the deployment procedure.
63
64.. code-block:: diff
65
66 $ cd $WORKDIR/aether-ci-management
67 $ vi jjb/repos/cd-pipeline-terraform.yaml
68
69 # Add jobs for the new cluster
70 diff jjb/repos/cd-pipeline-terraform.yamll
71 --- a/jjb/repos/cd-pipeline-terraform.yaml
72 +++ b/jjb/repos/cd-pipeline-terraform.yaml
73 @@ -227,3 +227,9 @@
74 - 'cd-pipeline-terraform-postmerge-cluster':
75 pod: 'production'
76 cluster: 'ace-eks'
77 + - 'cd-pipeline-terraform-premerge-cluster':
78 + pod: 'production'
79 + cluster: 'ace-test'
80 + - 'cd-pipeline-terraform-postmerge-cluster':
81 + pod: 'production'
82 + cluster: 'ace-test'
83
Hyunsun Moon2b2bf9a2021-08-01 05:29:48 -070084Submit your change and wait for the jobs you just added available in Aether Jenkins.
Hyunsun Moona703edf2021-07-29 15:55:15 -070085
86.. code-block:: shell
87
88 $ git status
89 Changes not staged for commit:
90
91 modified: jjb/repos/cd-pipeline-terraform.yaml
92
93 $ git add .
94 $ git commit -m "Add test ACE deployment job"
95 $ git review
96
Zack Williams794532a2021-03-18 17:38:36 -070097
Andy Bavier802cce52021-07-29 12:15:15 -070098Get access to encrypted files in aether-pod-configs repository
99--------------------------------------------------------------
100
Andy Bavier718fd902021-07-30 10:10:55 -0700101`git-crypt <https://github.com/AGWA/git-crypt>`_ is used to securely store encrypted files
102in the aether-pod-configs repository. Before proceeding, (1) install git-crypt and `gpg <https://gnupg.org/>`_,
Andy Bavier6fc0ff12021-08-02 09:29:25 -0700103(2) create a GPG keypair, and (3) ask a member of the Aether OPs team to add your public key
Andy Bavier802cce52021-07-29 12:15:15 -0700104to the aether-pod-configs keyring. To create the keypair follow these steps:
105
106.. code-block:: shell
107
108 $ gpg --full-generate-key
109 $ gpg --output <key-name>.gpg --armor --export <your-email-address>
110
Zack Williams794532a2021-03-18 17:38:36 -0700111.. _update_global_resource:
112
113Update global resource maps
114---------------------------
115
Hyunsun Moona703edf2021-07-29 15:55:15 -0700116Download aether-pod-configs repository.
117
118.. code-block:: shell
119
120 $ cd $WORKDIR
121 $ git clone "ssh://[username]@gerrit.opencord.org:29418/aether-pod-configs"
Andy Bavier802cce52021-07-29 12:15:15 -0700122 $ git-crypt unlock
Hyunsun Moona703edf2021-07-29 15:55:15 -0700123
Hyunsun Moonfabe9742021-08-01 06:41:44 -0700124Add the new cluster information at the end of the following global resource maps.
Zack Williams794532a2021-03-18 17:38:36 -0700125
126* ``user_map.tfvars``
127* ``cluster_map.tfvars``
128* ``vpn_map.tfvars``
129
Zack Williams794532a2021-03-18 17:38:36 -0700130.. code-block:: diff
131
132 $ cd $WORKDIR/aether-pod-configs/production
133 $ vi user_map.tfvars
134
135 # Add the new cluster admin user at the end of the map
136 $ git diff user_map.tfvars
137 --- a/production/user_map.tfvars
138 +++ b/production/user_map.tfvars
139 @@ user_map = {
140 username = "menlo"
141 password = "changeme"
142 global_roles = ["user-base", "catalogs-use"]
143 + },
144 + test_admin = {
145 + username = "test"
146 + password = "changeme"
147 + global_roles = ["user-base", "catalogs-use"]
148 }
149 }
150
151.. code-block:: diff
152
153 $ cd $WORKDIR/aether-pod-configs/production
154 $ vi cluster_map.tfvars
155
156 # Add the new K8S cluster information at the end of the map
157 $ git diff cluster_map.tfvars
158 --- a/production/cluster_map.tfvars
159 +++ b/production/cluster_map.tfvars
160 @@ cluster_map = {
161 kube_dns_cluster_ip = "10.53.128.10"
162 cluster_domain = "prd.menlo.aetherproject.net"
163 calico_ip_detect_method = "can-reach=www.google.com"
164 + },
165 + ace-test = {
166 + cluster_name = "ace-test"
Hyunsun Moona703edf2021-07-29 15:55:15 -0700167 + management_subnets = ["10.32.4.0/24"]
Zack Williams794532a2021-03-18 17:38:36 -0700168 + k8s_version = "v1.18.8-rancher1-1"
Hyunsun Moona703edf2021-07-29 15:55:15 -0700169 + k8s_pod_range = "10.33.0.0/17"
170 + k8s_cluster_ip_range = "10.33.128.0/17"
171 + kube_dns_cluster_ip = "10.33.128.10"
Zack Williams794532a2021-03-18 17:38:36 -0700172 + cluster_domain = "prd.test.aetherproject.net"
173 + calico_ip_detect_method = "can-reach=www.google.com"
174 }
175 }
176 }
177
178.. code-block:: diff
179
180 $ cd $WORKDIR/aether-pod-configs/production
181 $ vi vpn_map.tfvars
182
183 # Add VPN and tunnel information at the end of the map
184 $ git diff vpn_map.tfvars
185 --- a/production/vpn_map.tfvars
186 +++ b/production/vpn_map.tfvars
187 @@ vpn_map = {
188 bgp_peer_ip_address_1 = "169.254.0.6"
189 bgp_peer_ip_range_2 = "169.254.1.5/30"
190 bgp_peer_ip_address_2 = "169.254.1.6"
191 + },
192 + ace-test = {
193 + peer_name = "production-ace-test"
Hyunsun Moona703edf2021-07-29 15:55:15 -0700194 + peer_vpn_gateway_address = "66.201.42.222"
Zack Williams794532a2021-03-18 17:38:36 -0700195 + tunnel_shared_secret = "UMAoZA7blv6gd3IaArDqgK2s0sDB8mlI"
196 + bgp_peer_asn = "65003"
197 + bgp_peer_ip_range_1 = "169.254.0.9/30"
198 + bgp_peer_ip_address_1 = "169.254.0.10"
199 + bgp_peer_ip_range_2 = "169.254.1.9/30"
200 + bgp_peer_ip_address_2 = "169.254.1.10"
201 }
202 }
203
204.. note::
Hyunsun Moonbbad67d2021-08-12 00:47:27 -0700205 Use `this site <https://cloud.google.com/network-connectivity/docs/vpn/how-to/generating-pre-shared-key/>`_
206 to generate a strong tunnel shared secret.
207
208.. note::
Hyunsun Moon35868bc2021-08-11 15:01:13 -0700209 Unless you have a specific requirement, set ASN to the next available value in the map.
210 For BGP peer IP range and address, use the next available /30 subnet in the map.
Zack Williams794532a2021-03-18 17:38:36 -0700211
212
Hyunsun Moonbbad67d2021-08-12 00:47:27 -0700213Generate Ansible and Terraform configurations
214---------------------------------------------
Zack Williams794532a2021-03-18 17:38:36 -0700215
Hyunsun Moonfabe9742021-08-01 06:41:44 -0700216In this step, we will create a directory under ``production`` with the same name
Hyunsun Moonbbad67d2021-08-12 00:47:27 -0700217as the cluster, and add Ansible and Terraform configurations needed
218to configure a VPN in ACE and GCP using a tool.
Zack Williams794532a2021-03-18 17:38:36 -0700219
220.. code-block:: shell
221
222 $ cd $WORKDIR/aether-pod-configs/tools
Hyunsun Moona703edf2021-07-29 15:55:15 -0700223 $ cp ace_config.yaml.example ace_config.yaml
Hyunsun Moonbbad67d2021-08-12 00:47:27 -0700224
225 # Set all values in ace_config.yaml
Hyunsun Moona703edf2021-07-29 15:55:15 -0700226 $ vi ace_config.yaml
Zack Williams794532a2021-03-18 17:38:36 -0700227
Zack Williams794532a2021-03-18 17:38:36 -0700228 $ make vpn
229 Created ../production/ace-test
Hyunsun Moon049b5052021-07-30 12:41:03 -0700230 Created ../production/ace-test/provider.tf
231 Created ../production/ace-test/cluster.tf
Zack Williams794532a2021-03-18 17:38:36 -0700232 Created ../production/ace-test/gcp_ha_vpn.tf
Hyunsun Moon049b5052021-07-30 12:41:03 -0700233 Created ../production/ace-test/gcp_fw.tf
Zack Williams794532a2021-03-18 17:38:36 -0700234 Created ../production/ace-test/backend.tf
235 Created ../production/ace-test/cluster_val.tfvars
Hyunsun Moon049b5052021-07-30 12:41:03 -0700236 Created ../production/ace-test/ansible
Zack Williams794532a2021-03-18 17:38:36 -0700237 Created ../production/ace-test/ansible/hosts.ini
238 Created ../production/ace-test/ansible/extra_vars.yml
239
Zack Williams794532a2021-03-18 17:38:36 -0700240
Hyunsun Moon2b2bf9a2021-08-01 05:29:48 -0700241Submit your change
Hyunsun Moona703edf2021-07-29 15:55:15 -0700242------------------
Zack Williams794532a2021-03-18 17:38:36 -0700243
244.. code-block:: shell
245
246 $ cd $WORKDIR/aether-pod-configs/production
247 $ git status
248 On branch tools
249 Changes not staged for commit:
250
251 modified: cluster_map.tfvars
252 modified: user_map.tfvars
253 modified: vpn_map.tfvars
254
255 Untracked files:
256 (use "git add <file>..." to include in what will be committed)
257
258 ace-test/
259
260 $ git add .
261 $ git commit -m "Add test ACE"
262 $ git review
263
Hyunsun Moonbbad67d2021-08-12 00:47:27 -0700264Wait for a while until the post-merge job finishes after the change is merged.
Zack Williams794532a2021-03-18 17:38:36 -0700265
266Verify VPN connection
267---------------------
268
Hyunsun Moonfabe9742021-08-01 06:41:44 -0700269You can verify the VPN connections by checking
Hyunsun Moonbbad67d2021-08-12 00:47:27 -0700270the routing table from the management server and trying to ping to one of the
Zack Williams794532a2021-03-18 17:38:36 -0700271central cluster VMs.
272
Zack Williams1ae109e2021-07-27 11:17:04 -0700273Be sure there are two tunnel interfaces, ``gcp_tunnel1`` and ``gcp_tunnel2``,
Hyunsun Moonbbad67d2021-08-12 00:47:27 -0700274and three additional routing entries via one of the tunnel interfaces.
Zack Williams794532a2021-03-18 17:38:36 -0700275
276.. code-block:: shell
277
278 # Verify routings
279 $ netstat -rn
280 Kernel IP routing table
281 Destination Gateway Genmask Flags MSS Window irtt Iface
Hyunsun Moona703edf2021-07-29 15:55:15 -0700282 0.0.0.0 66.201.42.209 0.0.0.0 UG 0 0 0 eno1
283 10.32.4.0 0.0.0.0 255.255.255.128 U 0 0 0 eno2
284 10.32.4.128 0.0.0.0 255.255.255.128 U 0 0 0 mgmt800
Zack Williams794532a2021-03-18 17:38:36 -0700285 10.45.128.0 169.254.0.9 255.255.128.0 UG 0 0 0 gcp_tunnel1
286 10.52.128.0 169.254.0.9 255.255.128.0 UG 0 0 0 gcp_tunnel1
Hyunsun Moona703edf2021-07-29 15:55:15 -0700287 10.33.128.0 10.32.4.138 255.255.128.0 UG 0 0 0 mgmt800
Zack Williams794532a2021-03-18 17:38:36 -0700288 10.168.0.0 169.254.0.9 255.255.240.0 UG 0 0 0 gcp_tunnel1
Hyunsun Moona703edf2021-07-29 15:55:15 -0700289 66.201.42.208 0.0.0.0 255.255.252.0 U 0 0 0 eno1
Zack Williams794532a2021-03-18 17:38:36 -0700290 169.254.0.8 0.0.0.0 255.255.255.252 U 0 0 0 gcp_tunnel1
291 169.254.1.8 0.0.0.0 255.255.255.252 U 0 0 0 gcp_tunnel2
292
293 # Verify ACC VM access
294 $ ping 10.168.0.6
295
Hyunsun Moona703edf2021-07-29 15:55:15 -0700296 # Verify ACC K8S Service access
Zack Williams794532a2021-03-18 17:38:36 -0700297 $ nslookup kube-dns.kube-system.svc.prd.acc.gcp.aetherproject.net 10.52.128.10
298
Hyunsun Moonfabe9742021-08-01 06:41:44 -0700299You can also login to GCP console and check if the edge subnets exist in
300**VPC Network > Routes > Dynamic**.
Zack Williams794532a2021-03-18 17:38:36 -0700301
302
303Post VPN setup
304--------------
305
Hyunsun Moonfabe9742021-08-01 06:41:44 -0700306Once you verify the VPN connections, update ``ansible`` directory name to
307``_ansible`` to prevent the ansible playbook from being rerun.
Zack Williams794532a2021-03-18 17:38:36 -0700308
309.. code-block:: shell
310
311 $ cd $WORKDIR/aether-pod-configs/production/$ACE_NAME
312 $ mv ansible _ansible
313 $ git add .
Hyunsun Moona703edf2021-07-29 15:55:15 -0700314 $ git commit -m "Ansible done for test ACE"
Zack Williams794532a2021-03-18 17:38:36 -0700315 $ git review
316
317.. _add_ace_to_vpn:
318
319Add another ACE to an existing VPN connection
320"""""""""""""""""""""""""""""""""""""""""""""
321
322VPN connections can be shared when there are multiple ACE clusters in a site.
Hyunsun Moonfabe9742021-08-01 06:41:44 -0700323In order to add another cluster to an existing VPN connection, you'll have to SSH into the
Zack Williams794532a2021-03-18 17:38:36 -0700324management node and manually update BIRD configuration.
325
326.. note::
327
328 This step needs improvements in the future.
329
330.. code-block:: shell
331
332 $ sudo vi /etc/bird/bird.conf
333 protocol static {
Hyunsun Moona703edf2021-07-29 15:55:15 -0700334 # Routings for the existing cluster
Zack Williams794532a2021-03-18 17:38:36 -0700335 ...
Hyunsun Moona703edf2021-07-29 15:55:15 -0700336 route 10.33.128.0/17 via 10.32.4.138;
Zack Williams794532a2021-03-18 17:38:36 -0700337
338 # Add routings for the new ACE's K8S cluster IP range via cluster nodes
339 # TODO: Configure iBGP peering with Calico nodes and dynamically learn these routings
340 route <NEW-ACE-CLUSTER-IP> via <SERVER1>
341 route <NEW-ACE-CLUSTER-IP> via <SERVER2>
342 route <NEW-ACE-CLUSTER-IP> via <SERVER3>
343 }
344
345 filter gcp_tunnel_out {
346 # Add the new ACE's K8S cluster IP range and the management subnet if required to the list
Hyunsun Moona703edf2021-07-29 15:55:15 -0700347 if (net ~ [ 10.32.4.0/24, 10.33.128.0/17, <NEW-ACE-CLUSTER-MGMT-SUBNET>, <NEW-ACE-CLUSTER-IP-RANGE> ]) then accept;
Zack Williams794532a2021-03-18 17:38:36 -0700348 else reject;
349 }
350 # Save and exit
351
352 $ sudo birdc configure
353
354 # Confirm the static routes are added
355 $ sudo birdc show route
356