Skip to content

Commit 49be220

Browse files
authored
Merge pull request #938 from percona/K8SPS-421
K8SPS-421: Add keyring vault support
2 parents ad414c4 + 6854a7d commit 49be220

File tree

86 files changed

+1631
-328
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+1631
-328
lines changed

api/v1alpha1/perconaservermysql_types.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ type MySQLSpec struct {
128128
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
129129
SidecarPVCs []SidecarPVC `json:"sidecarPVCs,omitempty"`
130130

131+
VaultSecretName string `json:"vaultSecretName,omitempty"`
132+
131133
PodSpec `json:",inline"`
132134
}
133135

@@ -592,6 +594,16 @@ func (cr *PerconaServerMySQL) SetVersion() {
592594
cr.Spec.CRVersion = version.Version()
593595
}
594596

597+
func (cr *PerconaServerMySQL) Version() *v.Version {
598+
return v.Must(v.NewVersion(cr.Spec.CRVersion))
599+
}
600+
601+
// CompareVersion compares given version to current version.
602+
// Returns -1, 0, or 1 if given version is smaller, equal, or larger than the current version, respectively.
603+
func (cr *PerconaServerMySQL) CompareVersion(ver string) int {
604+
return cr.Version().Compare(v.Must(v.NewVersion(ver)))
605+
}
606+
595607
// CheckNSetDefaults validates and sets default values for the PerconaServerMySQL custom resource.
596608
func (cr *PerconaServerMySQL) CheckNSetDefaults(_ context.Context, serverVersion *platform.ServerVersion) error {
597609
if len(cr.Spec.MySQL.ClusterType) == 0 {
@@ -882,6 +894,10 @@ func (cr *PerconaServerMySQL) CheckNSetDefaults(_ context.Context, serverVersion
882894
cr.Spec.SSLSecretName = cr.Name + "-ssl"
883895
}
884896

897+
if cr.Spec.MySQL.VaultSecretName == "" {
898+
cr.Spec.MySQL.VaultSecretName = cr.Name + "-vault"
899+
}
900+
885901
return nil
886902
}
887903

build/ps-entrypoint.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,26 @@ create_default_cnf() {
167167
sed -i "/\[mysqld\]/a ssl_key=${TLS_DIR}/tls.key" $CFG
168168
fi
169169

170+
# if vault secret file exists we assume we need to turn on encryption
171+
vault_secret="/etc/mysql/vault-keyring-secret/keyring_vault.conf"
172+
if [[ -f "${vault_secret}" ]]; then
173+
sed -i "/\[mysqld\]/a early-plugin-load=keyring_vault.so" $CFG
174+
sed -i "/\[mysqld\]/a keyring_vault_config=${vault_secret}" $CFG
175+
176+
if [[ ${MYSQL_VERSION} =~ ^(8\.0|8\.4)$ ]]; then
177+
sed -i "/\[mysqld\]/a default_table_encryption=ON" $CFG
178+
sed -i "/\[mysqld\]/a table_encryption_privilege_check=ON" $CFG
179+
sed -i "/\[mysqld\]/a innodb_undo_log_encrypt=ON" $CFG
180+
sed -i "/\[mysqld\]/a innodb_redo_log_encrypt=ON" $CFG
181+
sed -i "/\[mysqld\]/a binlog_encryption=ON" $CFG
182+
sed -i "/\[mysqld\]/a binlog_rotate_encryption_master_key_at_startup=ON" $CFG
183+
sed -i "/\[mysqld\]/a innodb_temp_tablespace_encrypt=ON" $CFG
184+
sed -i "/\[mysqld\]/a innodb_parallel_dblwr_encrypt=ON" $CFG
185+
sed -i "/\[mysqld\]/a innodb_encrypt_online_alter_logs=ON" $CFG
186+
sed -i "/\[mysqld\]/a encrypt_tmp_files=ON" $CFG
187+
fi
188+
fi
189+
170190
for f in "${CUSTOM_CONFIG_FILES[@]}"; do
171191
echo "${f}"
172192
if [ -f "${f}" ]; then

build/run-restore.sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@ main() {
4141
"azure") run_azure | extract "${tmpdir}" ;;
4242
esac
4343

44-
xtrabackup --prepare --rollback-prepared-trx --target-dir="${tmpdir}"
44+
local keyring=""
45+
if [[ -f ${KEYRING_VAULT_PATH} ]]; then
46+
echo "Using keyring vault config: ${KEYRING_VAULT_PATH}"
47+
keyring="--keyring-vault-config=${KEYRING_VAULT_PATH}"
48+
fi
49+
50+
xtrabackup --prepare --rollback-prepared-trx --target-dir="${tmpdir}" ${keyring}
4551
xtrabackup --datadir="${DATADIR}" --move-back --force-non-empty-directories --target-dir="${tmpdir}"
4652

4753
rm -rf "${tmpdir}"

cmd/sidecar/main.go

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ import (
99
"net/http"
1010
"os"
1111
"os/exec"
12+
"os/signal"
1213
"path/filepath"
1314
"regexp"
1415
"strconv"
1516
"strings"
1617
"sync"
1718
"sync/atomic"
19+
"syscall"
20+
"time"
1821

1922
"golang.org/x/sync/errgroup"
2023
logf "sigs.k8s.io/controller-runtime/pkg/log"
@@ -69,10 +72,7 @@ func (s *Status) GetBackupConfig() *xb.BackupConfig {
6972
return &cfg
7073
}
7174

72-
func main() {
73-
opts := zap.Options{Development: true}
74-
logf.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
75-
75+
func startServer() *http.Server {
7676
mux := http.NewServeMux()
7777

7878
mux.HandleFunc("/health/", func(w http.ResponseWriter, req *http.Request) {
@@ -81,8 +81,42 @@ func main() {
8181
mux.HandleFunc("/backup/", backupHandler)
8282
mux.HandleFunc("/logs/", logHandler)
8383

84-
log.Info("starting http server")
85-
log.Error(http.ListenAndServe(":"+strconv.Itoa(mysql.SidecarHTTPPort), mux), "http server failed")
84+
srv := &http.Server{Addr: ":" + strconv.Itoa(mysql.SidecarHTTPPort), Handler: mux}
85+
86+
go func() {
87+
log.Info("starting http server")
88+
// always returns error. ErrServerClosed on graceful close
89+
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
90+
log.Error(err, "http server failed")
91+
}
92+
}()
93+
94+
return srv
95+
}
96+
97+
func main() {
98+
opts := zap.Options{Development: true}
99+
logf.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
100+
101+
srv := startServer()
102+
103+
stop := make(chan os.Signal, 1)
104+
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
105+
106+
<-stop
107+
108+
log.Info("received interrupt signal, shutting down http server")
109+
110+
// TODO: should this timeout use terminationGracePeriodSeconds?
111+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
112+
defer cancel()
113+
114+
if err := srv.Shutdown(ctx); err != nil {
115+
log.Error(err, "graceful shutdown failed")
116+
os.Exit(1)
117+
}
118+
119+
os.Exit(0)
86120
}
87121

88122
func getSecret(username apiv1alpha1.SystemUser) (string, error) {

config/crd/bases/ps.percona.com_perconaservermysqls.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5026,6 +5026,8 @@ spec:
50265026
- whenUnsatisfiable
50275027
type: object
50285028
type: array
5029+
vaultSecretName:
5030+
type: string
50295031
volumeSpec:
50305032
properties:
50315033
emptyDir:

deploy/bundle.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6949,6 +6949,8 @@ spec:
69496949
- whenUnsatisfiable
69506950
type: object
69516951
type: array
6952+
vaultSecretName:
6953+
type: string
69526954
volumeSpec:
69536955
properties:
69546956
emptyDir:

deploy/cr.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ spec:
5252
# - name: "my-secret-1"
5353
# - name: "my-secret-2"
5454
# initImage: perconalab/percona-server-mysql-operator:main
55+
# vaultSecretName: cluster1-vault
5556
size: 3
5657

5758
# env:

deploy/crd.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6949,6 +6949,8 @@ spec:
69496949
- whenUnsatisfiable
69506950
type: object
69516951
type: array
6952+
vaultSecretName:
6953+
type: string
69526954
volumeSpec:
69536955
properties:
69546956
emptyDir:

deploy/cw-bundle.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6949,6 +6949,8 @@ spec:
69496949
- whenUnsatisfiable
69506950
type: object
69516951
type: array
6952+
vaultSecretName:
6953+
type: string
69526954
volumeSpec:
69536955
properties:
69546956
emptyDir:

deploy/vault-secret.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
apiVersion: v1
2+
kind: Secret
3+
metadata:
4+
name: cluster1-vault
5+
type: Opaque
6+
stringData:
7+
keyring_vault.conf: |-
8+
token = <secret>
9+
vault_url = http://vault-service.vault-service.svc.cluster.local:8200
10+
secret_mount_point = secret

0 commit comments

Comments
 (0)