helm: add OpenStack charts

This commit is contained in:
Malte Poll 2023-03-17 09:52:23 +01:00 committed by Malte Poll
parent 67f5625f99
commit e5124d1a97
10 changed files with 231 additions and 55 deletions

View File

@ -99,7 +99,7 @@ func (h *Client) InstallCilium(ctx context.Context, kubectl k8sapi.Client, relea
h.Wait = release.Wait h.Wait = release.Wait
switch in.CloudProvider { switch in.CloudProvider {
case "aws", "azure", "qemu": case "aws", "azure", "openstack", "qemu":
return h.installCiliumGeneric(ctx, release, in.LoadBalancerEndpoint) return h.installCiliumGeneric(ctx, release, in.LoadBalancerEndpoint)
case "gcp": case "gcp":
return h.installCiliumGCP(ctx, kubectl, release, in.NodeName, in.FirstNodePodCIDR, in.SubnetworkPodCIDR, in.LoadBalancerEndpoint) return h.installCiliumGCP(ctx, kubectl, release, in.NodeName, in.FirstNodePodCIDR, in.SubnetworkPodCIDR, in.LoadBalancerEndpoint)

View File

@ -313,6 +313,8 @@ go_library(
"charts/edgeless/operators/charts/node-maintenance-operator/values.schema.json", "charts/edgeless/operators/charts/node-maintenance-operator/values.schema.json",
"charts/edgeless/operators/charts/node-maintenance-operator/values.yaml", "charts/edgeless/operators/charts/node-maintenance-operator/values.yaml",
"charts/edgeless/operators/values.yaml", "charts/edgeless/operators/values.yaml",
"charts/edgeless/constellation-services/charts/ccm/templates/openstack-daemonset.yaml",
"charts/edgeless/constellation-services/charts/ccm/templates/openstack-secret.yaml",
], ],
importpath = "github.com/edgelesssys/constellation/v2/cli/internal/helm", importpath = "github.com/edgelesssys/constellation/v2/cli/internal/helm",
visibility = ["//cli:__subpackages__"], visibility = ["//cli:__subpackages__"],

View File

@ -7,23 +7,26 @@ dependencies:
- name: key-service - name: key-service
version: 0.0.0 version: 0.0.0
tags: tags:
- AWS
- Azure - Azure
- GCP - GCP
- AWS - OpenStack
- QEMU - QEMU
- name: join-service - name: join-service
version: 0.0.0 version: 0.0.0
tags: tags:
- AWS
- Azure - Azure
- GCP - GCP
- AWS - OpenStack
- QEMU - QEMU
- name: ccm - name: ccm
version: 0.0.0 version: 0.0.0
tags: tags:
- AWS
- Azure - Azure
- GCP - GCP
- AWS - OpenStack
- name: cnm - name: cnm
version: 0.0.0 version: 0.0.0
tags: tags:
@ -37,16 +40,18 @@ dependencies:
- name: verification-service - name: verification-service
version: 0.0.0 version: 0.0.0
tags: tags:
- AWS
- Azure - Azure
- GCP - GCP
- AWS - OpenStack
- QEMU - QEMU
- name: konnectivity - name: konnectivity
version: 0.0.0 version: 0.0.0
tags: tags:
- AWS
- Azure - Azure
- GCP - GCP
- AWS - OpenStack
- QEMU - QEMU
- name: gcp-guest-agent - name: gcp-guest-agent
version: 0.0.0 version: 0.0.0

View File

@ -0,0 +1,70 @@
{{- if eq .Values.csp "OpenStack" -}}
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cloud-controller-manager
namespace: {{ .Release.Namespace }}
labels:
k8s-app: cloud-controller-manager
spec:
selector:
matchLabels:
k8s-app: cloud-controller-manager
template:
metadata:
labels:
k8s-app: cloud-controller-manager
spec:
containers:
- name: cloud-controller-manager
image: {{ .Values.OpenStack.image | quote }}
args:
- /bin/openstack-cloud-controller-manager
- --cloud-provider=openstack
- --cloud-config=/etc/config/cloud.conf
- --leader-elect=true
- --allocate-node-cidrs=false
- -v=2
volumeMounts:
- name: etckubernetes
mountPath: /etc/kubernetes
readOnly: true
- name: etcssl
mountPath: /etc/ssl
readOnly: true
- name: etcpki
mountPath: /etc/pki
readOnly: true
- name: etcconfig
mountPath: /etc/config
readOnly: true
resources: {}
nodeSelector:
node-role.kubernetes.io/control-plane: ""
serviceAccountName: cloud-controller-manager
tolerations:
- effect: NoSchedule
key: node.cloudprovider.kubernetes.io/uninitialized
value: "true"
- effect: NoSchedule
key: node-role.kubernetes.io/master
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
operator: Exists
- effect: NoSchedule
key: node.kubernetes.io/not-ready
volumes:
- name: etckubernetes
hostPath:
path: /etc/kubernetes
- name: etcssl
hostPath:
path: /etc/ssl
- name: etcpki
hostPath:
path: /etc/pki
- name: etcconfig
secret:
secretName: openstackkey
updateStrategy: {}
{{- end -}}

View File

@ -0,0 +1,9 @@
{{- if eq .Values.csp "OpenStack" -}}
apiVersion: v1
kind: Secret
metadata:
name: openstackkey
namespace: {{ .Release.Namespace }}
data:
cloud.conf: {{ .Values.OpenStack.secretData | b64enc }}
{{- end -}}

View File

@ -3,7 +3,39 @@
"properties": { "properties": {
"csp": { "csp": {
"description": "CSP to which the chart is deployed.", "description": "CSP to which the chart is deployed.",
"enum": ["Azure", "GCP", "AWS", "QEMU"] "enum": ["AWS", "Azure", "GCP", "OpenStack", "QEMU"]
},
"AWS": {
"description": "Config values required for deployment on AWS",
"type": "object",
"properties": {
"image": {
"description": "Container image to use for the spawned pods.",
"type": "string"
}
},
"required": [
"image"
]
},
"Azure": {
"description": "Config values required for deployment on Azure",
"type": "object",
"properties": {
"image": {
"description": "Container image to use for the spawned pods.",
"type": "string",
"examples": ["mcr.microsoft.com/oss/kubernetes/azure-cloud-controller-manager:latest"]
},
"azureConfig": {
"description": "Base64 encoded json string that hold required config parameters for Azure CCM.",
"type": "string"
}
},
"required": [
"image",
"azureConfig"
]
}, },
"GCP": { "GCP": {
"description": "Config values required for deployment on GCP", "description": "Config values required for deployment on GCP",
@ -41,36 +73,22 @@
"subnetworkPodCIDR" "subnetworkPodCIDR"
] ]
}, },
"Azure": { "OpenStack": {
"description": "Config values required for deployment on Azure", "description": "Config values required for deployment on OpenStack",
"type": "object", "type": "object",
"properties": { "properties": {
"image": { "image": {
"description": "Container image to use for the spawned pods.", "description": "Container image to use for the spawned pods.",
"type": "string", "type": "string"
"examples": ["mcr.microsoft.com/oss/kubernetes/azure-cloud-controller-manager:latest"]
}, },
"azureConfig": { "secretData": {
"description": "Base64 encoded json string that hold required config parameters for Azure CCM.", "description": "OpenStack service account key as a json-string",
"type": "string" "type": "string"
} }
}, },
"required": [ "required": [
"image", "image",
"azureConfig" "secretData"
]
},
"AWS": {
"description": "Config values required for deployment on AWS",
"type": "object",
"properties": {
"image": {
"description": "Container image to use for the spawned pods.",
"type": "string"
}
},
"required": [
"image"
] ]
} }
}, },
@ -80,10 +98,10 @@
"allOf": [ "allOf": [
{ {
"if": { "if": {
"properties": { "csp": { "const": "GCP" } }, "properties": { "csp": { "const": "AWS" } },
"required": ["csp"] "required": ["csp"]
}, },
"then": { "required": ["GCP"] } "then": { "required": ["AWS"] }
}, },
{ {
"if": { "if": {
@ -94,10 +112,17 @@
}, },
{ {
"if": { "if": {
"properties": { "csp": { "const": "AWS" } }, "properties": { "csp": { "const": "GCP" } },
"required": ["csp"] "required": ["csp"]
}, },
"then": { "required": ["AWS"] } "then": { "required": ["GCP"] }
},
{
"if": {
"properties": { "csp": { "const": "OpenStack" } },
"required": ["csp"]
},
"then": { "required": ["OpenStack"] }
} }
], ],
"title": "Values", "title": "Values",

View File

@ -3,7 +3,7 @@
"properties": { "properties": {
"csp": { "csp": {
"description": "CSP to which the chart is deployed.", "description": "CSP to which the chart is deployed.",
"enum": ["Azure", "GCP", "AWS", "QEMU"] "enum": ["AWS", "Azure", "GCP", "OpenStack", "QEMU"]
}, },
"measurements": { "measurements": {
"description": "JSON-string to describe the expected measurements.", "description": "JSON-string to describe the expected measurements.",

View File

@ -18,7 +18,8 @@ azure:
# Set one of the tags to true to indicate which CSP you are deploying to. # Set one of the tags to true to indicate which CSP you are deploying to.
tags: tags:
AWS: false
Azure: false Azure: false
GCP: false GCP: false
AWS: false OpenStack: false
QEMU: false QEMU: false

View File

@ -77,6 +77,8 @@ func NewLoader(csp cloudprovider.Provider, k8sVersion versions.ValidK8sVersion)
cnmImage = versions.VersionConfigs[k8sVersion].CloudNodeManagerImageAzure cnmImage = versions.VersionConfigs[k8sVersion].CloudNodeManagerImageAzure
case cloudprovider.GCP: case cloudprovider.GCP:
ccmImage = versions.VersionConfigs[k8sVersion].CloudControllerManagerImageGCP ccmImage = versions.VersionConfigs[k8sVersion].CloudControllerManagerImageGCP
case cloudprovider.OpenStack:
ccmImage = versions.VersionConfigs[k8sVersion].CloudControllerManagerImageOpenStack
} }
return &ChartLoader{ return &ChartLoader{
@ -186,6 +188,8 @@ func (i *ChartLoader) loadCiliumValues() (map[string]any, error) {
values = azureVals values = azureVals
case cloudprovider.GCP: case cloudprovider.GCP:
values = gcpVals values = gcpVals
case cloudprovider.OpenStack:
values = openStackVals
case cloudprovider.QEMU: case cloudprovider.QEMU:
values = qemuVals values = qemuVals
default: default:
@ -300,6 +304,16 @@ func (i *ChartLoader) loadOperatorsValues() (map[string]any, error) {
}, },
} }
switch i.csp { switch i.csp {
case cloudprovider.AWS:
conOpVals, ok := values["constellation-operator"].(map[string]any)
if !ok {
return nil, errors.New("invalid constellation-operator values")
}
conOpVals["csp"] = "AWS"
values["tags"] = map[string]any{
"AWS": true,
}
case cloudprovider.Azure: case cloudprovider.Azure:
conOpVals, ok := values["constellation-operator"].(map[string]any) conOpVals, ok := values["constellation-operator"].(map[string]any)
if !ok { if !ok {
@ -320,6 +334,16 @@ func (i *ChartLoader) loadOperatorsValues() (map[string]any, error) {
values["tags"] = map[string]any{ values["tags"] = map[string]any{
"GCP": true, "GCP": true,
} }
case cloudprovider.OpenStack:
conOpVals, ok := values["constellation-operator"].(map[string]any)
if !ok {
return nil, errors.New("invalid constellation-operator values")
}
conOpVals["csp"] = "OpenStack"
values["tags"] = map[string]any{
"OpenStack": true,
}
case cloudprovider.QEMU: case cloudprovider.QEMU:
conOpVals, ok := values["constellation-operator"].(map[string]any) conOpVals, ok := values["constellation-operator"].(map[string]any)
if !ok { if !ok {
@ -330,16 +354,6 @@ func (i *ChartLoader) loadOperatorsValues() (map[string]any, error) {
values["tags"] = map[string]any{ values["tags"] = map[string]any{
"QEMU": true, "QEMU": true,
} }
case cloudprovider.AWS:
conOpVals, ok := values["constellation-operator"].(map[string]any)
if !ok {
return nil, errors.New("invalid constellation-operator values")
}
conOpVals["csp"] = "AWS"
values["tags"] = map[string]any{
"AWS": true,
}
} }
return values, nil return values, nil
@ -386,6 +400,18 @@ func (i *ChartLoader) loadConstellationServicesValues() (map[string]any, error)
} }
switch i.csp { switch i.csp {
case cloudprovider.AWS:
ccmVals, ok := values["ccm"].(map[string]any)
if !ok {
return nil, errors.New("invalid ccm values")
}
ccmVals["AWS"] = map[string]any{
"image": i.ccmImage,
}
values["tags"] = map[string]any{
"AWS": true,
}
case cloudprovider.Azure: case cloudprovider.Azure:
ccmVals, ok := values["ccm"].(map[string]any) ccmVals, ok := values["ccm"].(map[string]any)
if !ok { if !ok {
@ -415,24 +441,23 @@ func (i *ChartLoader) loadConstellationServicesValues() (map[string]any, error)
values["tags"] = map[string]any{ values["tags"] = map[string]any{
"GCP": true, "GCP": true,
} }
case cloudprovider.OpenStack:
ccmVals, ok := values["ccm"].(map[string]any)
if !ok {
return nil, errors.New("invalid ccm values")
}
ccmVals["OpenStack"] = map[string]any{
"image": i.ccmImage,
}
values["tags"] = map[string]any{
"OpenStack": true,
}
case cloudprovider.QEMU: case cloudprovider.QEMU:
values["tags"] = map[string]any{ values["tags"] = map[string]any{
"QEMU": true, "QEMU": true,
} }
case cloudprovider.AWS:
ccmVals, ok := values["ccm"].(map[string]any)
if !ok {
return nil, errors.New("invalid ccm values")
}
ccmVals["AWS"] = map[string]any{
"image": i.ccmImage,
}
values["tags"] = map[string]any{
"AWS": true,
}
} }
return values, nil return values, nil
} }

View File

@ -121,6 +121,45 @@ var gcpVals = map[string]any{
"kubeProxyReplacementHealthzBindAddr": "0.0.0.0:10256", "kubeProxyReplacementHealthzBindAddr": "0.0.0.0:10256",
} }
// Values for the Cilium Helm releases for OpenStack.
var openStackVals = map[string]any{
"endpointRoutes": map[string]any{
"enabled": true,
},
"encryption": map[string]any{
"enabled": true,
"type": "wireguard",
},
"l7Proxy": false,
"ipam": map[string]any{
"operator": map[string]any{
"clusterPoolIPv4PodCIDRList": []string{
"10.244.0.0/16",
},
},
},
"strictModeCIDR": "10.244.0.0/16",
"image": map[string]any{
"repository": "ghcr.io/3u13r/cilium",
"suffix": "",
"tag": "v1.12.1-edg",
"digest": "sha256:fdac430143fe719331698b76fbe66410631a21afd3405407d56db260d2d6999b",
"useDigest": true,
},
"operator": map[string]any{
"image": map[string]any{
"repository": "ghcr.io/3u13r/operator",
"tag": "v1.12.1-edg",
"suffix": "",
"genericDigest": "sha256:a225d8d3976fd2a05cfa0c929cd32e60283abedf6bae51db4709df19b2fb70cb",
"useDigest": true,
},
},
"kubeProxyReplacement": "strict",
"enableCiliumEndpointSlice": true,
"kubeProxyReplacementHealthzBindAddr": "0.0.0.0:10256",
}
var qemuVals = map[string]any{ var qemuVals = map[string]any{
"endpointRoutes": map[string]any{ "endpointRoutes": map[string]any{
"enabled": true, "enabled": true,