1
+ #! /bin/bash
2
+ set -euo pipefail
3
+
4
+ OVN_NB_POD=
5
+
6
+ showHelp (){
7
+ echo " sh ipsec.sh [init|start|stop|status]"
8
+ }
9
+
10
+ getOvnCentralPod (){
11
+ NB_POD=$( kubectl get pod -n kube-system -l ovn-nb-leader=true | grep ovn-central | head -n 1 | awk ' {print $1}' )
12
+ if [ -z " $NB_POD " ]; then
13
+ echo " nb leader not exists"
14
+ exit 1
15
+ fi
16
+ OVN_NB_POD=$NB_POD
17
+ }
18
+
19
+ initIpsec (){
20
+ podNames=` kubectl get pod -n kube-system -l app=ovs -o ' jsonpath={.items[*].metadata.name}' `
21
+ for pod in $podNames ; do
22
+ caPod=$pod
23
+ break
24
+ done
25
+
26
+ echo " Initing CA $caPod "
27
+ kubectl exec -it $caPod -n kube-system -- ovs-pki init --force > /dev/null
28
+
29
+ for pod in $podNames ; do
30
+ echo " Initing privkey,req,cert file on pod $pod "
31
+ systemId=$( kubectl exec -it ${pod} -n kube-system -- ovs-vsctl get Open_vSwitch . external_ids:system-id | tr -d ' "' | tr -d ' \r' )
32
+
33
+ kubectl exec -it $pod -n kube-system -- ovs-pki req -u $systemId --force > /dev/null
34
+ kubectl exec -it $pod -n kube-system -- mv " ${systemId} -privkey.pem" /etc/ipsec.d/private/
35
+ kubectl exec -it $pod -n kube-system -- mv " ${systemId} -req.pem" /etc/ipsec.d/reqs/
36
+
37
+ if [[ $pod == $caPod ]]; then
38
+ kubectl exec -it $pod -n kube-system -- rm -f " /etc/ipsec.d/reqs/${systemId} -cert.pem" > /dev/null
39
+ kubectl exec -it $pod -n kube-system -- ovs-pki sign -b " /etc/ipsec.d/reqs/${systemId} " switch > /dev/null
40
+ kubectl exec -it $pod -n kube-system -- mv " /etc/ipsec.d/reqs/${systemId} -cert.pem" /etc/ipsec.d/certs/
41
+ kubectl exec -it $pod -n kube-system -- cp /var/lib/openvswitch/pki/switchca/cacert.pem /etc/ipsec.d/cacerts/ > /dev/null
42
+ else
43
+ kubectl cp " ${pod} :/etc/ipsec.d/reqs/${systemId} -req.pem" " ${systemId} -req.pem" -n kube-system > /dev/null
44
+ kubectl cp " ${systemId} -req.pem" " ${caPod} :/kube-ovn/" -n kube-system > /dev/null
45
+ # ovs-pki sign do not have options --force so rm cert first
46
+ kubectl exec -it $caPod -n kube-system -- rm -f " /kube-ovn/${systemId} -cert.pem"
47
+ kubectl exec -it $caPod -n kube-system -- ovs-pki sign -b ${systemId} switch > /dev/null
48
+ kubectl cp " ${caPod} :/kube-ovn/${systemId} -cert.pem" " ${systemId} -cert.pem" -n kube-system > /dev/null
49
+ kubectl cp " ${systemId} -cert.pem" " ${pod} :/etc/ipsec.d/certs/" -n kube-system > /dev/null
50
+
51
+ kubectl cp " ${caPod} :/var/lib/openvswitch/pki/switchca/cacert.pem" cacert.pem -n kube-system > /dev/null
52
+ kubectl cp cacert.pem " ${pod} :/etc/ipsec.d/cacerts/" -n kube-system > /dev/null
53
+
54
+ # clean temp files
55
+ kubectl exec -it $caPod -n kube-system -- rm -f " /kube-ovn/${systemId} -req.pem"
56
+ kubectl exec -it $caPod -n kube-system -- rm -f " /kube-ovn/${systemId} -cert.pem"
57
+ rm -f ${systemId} -req.pem
58
+ rm -f ${systemId} -cert.pem
59
+ rm -f cacert.pem
60
+ fi
61
+
62
+ kubectl exec -it $pod -n kube-system -- ovs-vsctl set Open_vSwitch . \
63
+ other_config:certificate=/etc/ipsec.d/certs/" ${systemId} -cert.pem" \
64
+ other_config:private_key=/etc/ipsec.d/private/" ${systemId} -privkey.pem" \
65
+ other_config:ca_cert=/etc/ipsec.d/cacerts/cacert.pem
66
+ done
67
+
68
+ echo " Enabling ovn ipsec "
69
+ kubectl ko nbctl set nb_global . ipsec=true
70
+
71
+ for pod in $podNames ; do
72
+ echo " Starting pod ${pod} ipsec service"
73
+ kubectl exec -it -n kube-system $pod -- service openvswitch-ipsec restart > /dev/null
74
+ kubectl exec -it -n kube-system $pod -- service ipsec restart > /dev/null
75
+ done
76
+
77
+ echo " Kube-OVN ipsec init successfully, it may take a few seconds to setup ipsec completely "
78
+ }
79
+
80
+ getOvnCentralPod
81
+ subcommand=" $1 " ; shift
82
+
83
+ case $subcommand in
84
+ init)
85
+ initIpsec
86
+ ;;
87
+ start)
88
+ kubectl exec " $OVN_NB_POD " -n kube-system -c ovn-central -- ovn-nbctl set nb_global . ipsec=true
89
+ echo " Kube-OVN ipsec started "
90
+ ;;
91
+ stop)
92
+ kubectl exec " $OVN_NB_POD " -n kube-system -c ovn-central -- ovn-nbctl set nb_global . ipsec=false
93
+ echo " Kube-OVN ipsec stopped "
94
+ ;;
95
+ status)
96
+ podNames=` kubectl get pod -n kube-system -l app=ovs -o ' jsonpath={.items[*].metadata.name}' `
97
+ for pod in $podNames ; do
98
+ echo " Pod {$pod } ipsec status..."
99
+ kubectl exec -it $pod -n kube-system -- ovs-appctl -t ovs-monitor-ipsec tunnels/show
100
+ done
101
+ ;;
102
+ * )
103
+ showHelp
104
+ exit 1
105
+ ;;
106
+ esac
0 commit comments