Skip to content

Commit c98a16c

Browse files
authored
Merge pull request #607 from hidekazuna/ssh_key_name
✨ Use OpenStack key pair instead of KubeadmConfig spec
2 parents ea003df + 0836254 commit c98a16c

File tree

7 files changed

+38
-83
lines changed

7 files changed

+38
-83
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,10 @@ OPENSTACK_CLOUD_PROVIDER_CONF_B64 ?= ""
298298
OPENSTACK_CLOUD_YAML_B64 ?= ""
299299
OPENSTACK_DNS_NAMESERVERS ?= ""
300300
OPENSTACK_IMAGE_NAME ?= "ubuntu-1910-kube-v1.17.3"
301-
OPENSTACK_SSH_AUTHORIZED_KEY ?= ""
302301
OPENSTACK_NODE_MACHINE_FLAVOR ?= "m1.small"
303302
OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR ?= "m1.medium"
304303
CLUSTER_NAME ?= "capi-quickstart"
304+
OPENSTACK_SSH_KEY_NAME ?= "${CLUSTER_NAME}-key"
305305
OPENSTACK_CLUSTER_TEMPLATE ?= "./templates/cluster-template-without-lb.yaml"
306306
KUBERNETES_VERSION ?= "v1.17.3"
307307
CONTROL_PLANE_MACHINE_COUNT ?= "1"
@@ -368,7 +368,7 @@ create-cluster: $(CLUSTERCTL) $(KUSTOMIZE) $(ENVSUBST) ## Create a development K
368368
OPENSTACK_CLOUD_YAML_B64=$(OPENSTACK_CLOUD_YAML_B64) \
369369
OPENSTACK_DNS_NAMESERVERS=$(OPENSTACK_DNS_NAMESERVERS) \
370370
OPENSTACK_IMAGE_NAME=$(OPENSTACK_IMAGE_NAME) \
371-
OPENSTACK_SSH_AUTHORIZED_KEY="$(OPENSTACK_SSH_AUTHORIZED_KEY)" \
371+
OPENSTACK_SSH_KEY_NAME=$(OPENSTACK_SSH_KEY_NAME) \
372372
OPENSTACK_NODE_MACHINE_FLAVOR=$(OPENSTACK_NODE_MACHINE_FLAVOR) \
373373
OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR=$(OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR) \
374374
$(CLUSTERCTL) config cluster $(CLUSTER_NAME) \

docs/configuration.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
- [Required configuration](#required-configuration)
66
- [Operating system image](#operating-system-image)
7-
- [SSH authorized key](#ssh-authorized-key)
7+
- [SSH key pair](#ssh-key-pair)
88
- [OpenStack credential](#openstack-credential)
99
- [Availability zone](#availability-zone)
1010
- [DNS server](#dns-server)
@@ -35,11 +35,15 @@ We currently depend on an up-to-date version of cloud-init otherwise the operati
3535

3636
The image can be referenced by exposing it as an environment variable `OPENSTACK_IMAGE_NAME`.
3737

38-
## SSH authorized key
38+
## SSH key pair
3939

40-
The ssh public key is required. This key does not need to be created by OpenStack key pair.
40+
The SSH key pair is required. You can create one using,
4141

42-
The public key must be exposed as an environment variable `OPENSTACK_SSH_AUTHORIZED_KEY`.
42+
```bash
43+
openstack keypair create [--public-key <file> | --private-key <file>] <name>
44+
```
45+
46+
The key pair name must be exposed as an environment variable `OPENSTACK_SSH_KEY_NAME`.
4347

4448
If you want to login to each machine by ssh, you have to configure security groups. If `spec.managedSecurityGroups` of `OpenStackCluster` set to true, two security groups will be created and added to the instances. One is `k8s-cluster-${NAMESPACE}-${CLUSTER_NAME}-secgroup-controlplane`, another is `k8s-cluster-${NAMESPACE}-${CLUSTER_NAME}-secgroup-worker`. These security group rules include the kubeadm's [Check required ports](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports) so that each node can not be logged in through ssh by default. Please add pre-existing security group allowing ssh port to OpenStackMachineTemplate spec. Here is an example:
4549

hack/ci/e2e-conformance.sh

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@
1919
set -o errexit -o nounset -o pipefail
2020

2121
OPENSTACK_CLOUD_YAML_FILE=${OPENSTACK_CLOUD_YAML_FILE:-"/tmp/clouds.yaml"}
22-
OPENSTACK_SSH_AUTHORIZED_KEY_PATH=${OPENSTACK_SSH_AUTHORIZED_KEY_PATH:-"/tmp/id_rsa.pub"}
23-
OPENSTACK_SSH_PRIVATE_KEY_PATH=${OPENSTACK_SSH_PRIVATE_KEY_PATH:-"/tmp/id_rsa"}
2422
OPENSTACK_IMAGE_NAME="ubuntu-1910-kube-v1.17.3"
2523
OPENSTACK_DNS_NAMESERVERS=${OPENSTACK_DNS_NAMESERVERS:-"192.168.200.1"}
2624
OPENSTACK_NODE_MACHINE_FLAVOR=${OPENSTACK_NODE_MACHINE_FLAVOR:-"m1.small"}
2725
OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR=${OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR:-"m1.medium"}
2826
OPENSTACK_CLUSTER_TEMPLATE=${OPENSTACK_CLUSTER_TEMPLATE:-"./templates/cluster-template-without-lb.yaml"}
2927
CLUSTER_NAME=${CLUSTER_NAME:-"capi-quickstart"}
28+
OPENSTACK_SSH_KEY_NAME=${OPENSTACK_SSH_KEY_NAME:-"${CLUSTER_NAME}-key"}
3029
KUBERNETES_VERSION=${KUBERNETES_VERSION:-"v1.18.6"}
3130
TIMESTAMP=$(date +"%Y-%m-%dT%H:%M:%SZ")
3231

@@ -119,13 +118,14 @@ dump_capo_logs() {
119118

120119
openstack console log show "${node}" > "${dir}/console.log" || true
121120

122-
PROXY_COMMAND="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=30 -x -W %h:22 -i ${OPENSTACK_SSH_PRIVATE_KEY_PATH} capo@${jump_node}"
121+
ssh_key_pem="/tmp/${OPENSTACK_SSH_KEY_NAME}.pem"
122+
PROXY_COMMAND="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=30 -x -W %h:22 -i ${ssh_key_pem} ubuntu@${jump_node}"
123123
node=$(openstack port show ${node} -f json -c fixed_ips | jq '.fixed_ips[0].ip_address' -r)
124124

125125
ssh-to-node "${node}" "${jump_node}" "sudo chmod -R a+r /var/log" || true
126-
scp -r -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=30 -o ProxyCommand="${PROXY_COMMAND}" -i ${OPENSTACK_SSH_PRIVATE_KEY_PATH} \
127-
"capo@${node}:/var/log/cloud-init.log" "capo@${node}:/var/log/cloud-init-output.log" \
128-
"capo@${node}:/var/log/pods" "capo@${node}:/var/log/containers" \
126+
scp -r -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=30 -o ProxyCommand="${PROXY_COMMAND}" -i ${ssh_key_pem} \
127+
"ubuntu@${node}:/var/log/cloud-init.log" "ubuntu@${node}:/var/log/cloud-init-output.log" \
128+
"ubuntu@${node}:/var/log/pods" "ubuntu@${node}:/var/log/containers" \
129129
"${dir}" || true
130130

131131
ssh-to-node "${node}" "${jump_node}" "sudo journalctl --output=short-precise -k" > "${dir}/kern.log" || true
@@ -152,11 +152,21 @@ function ssh-to-node() {
152152
local jump="$2"
153153
local cmd="$3"
154154

155+
ssh_key_pem="/tmp/${OPENSTACK_SSH_KEY_NAME}.pem"
155156
ssh_params="-o LogLevel=quiet -o ConnectTimeout=30 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
156-
scp $ssh_params -i "${OPENSTACK_SSH_PRIVATE_KEY_PATH}" "${OPENSTACK_SSH_PRIVATE_KEY_PATH}" "capo@${jump}:${OPENSTACK_SSH_PRIVATE_KEY_PATH}"
157-
ssh $ssh_params -i "${OPENSTACK_SSH_PRIVATE_KEY_PATH}" \
158-
-o "ProxyCommand ssh $ssh_params -W %h:%p -i ${OPENSTACK_SSH_PRIVATE_KEY_PATH} capo@${jump}" \
159-
capo@"${node}" "${cmd}"
157+
scp $ssh_params -i $ssh_key_pem $ssh_key_pem "ubuntu@${jump}:$ssh_key_pem"
158+
ssh $ssh_params -i $ssh_key_pem \
159+
-o "ProxyCommand ssh $ssh_params -W %h:%p -i $ssh_key_pem ubuntu@${jump}" \
160+
ubuntu@"${node}" "${cmd}"
161+
}
162+
163+
create_key_pair() {
164+
echo "Create key pair"
165+
166+
ssh-keygen -t rsa -f "/tmp/${OPENSTACK_SSH_KEY_NAME}.pem" -N ""
167+
chmod 0400 "/tmp/${OPENSTACK_SSH_KEY_NAME}.pem"
168+
169+
openstack keypair create --public-key "/tmp/${OPENSTACK_SSH_KEY_NAME}.pem.pub" ${OPENSTACK_SSH_KEY_NAME}
160170
}
161171

162172
upload_image() {
@@ -248,20 +258,14 @@ create_cluster() {
248258
# actually create the cluster
249259
KIND_IS_UP=true
250260

251-
if [[ ! -f ${OPENSTACK_SSH_AUTHORIZED_KEY_PATH} ]]
252-
then
253-
ssh-keygen -t rsa -f ${OPENSTACK_SSH_PRIVATE_KEY_PATH} -N ""
254-
chmod 0400 ${OPENSTACK_SSH_AUTHORIZED_KEY_PATH}
255-
fi
256-
257261
# exports the b64 env vars used below
258262
source ${REPO_ROOT}/templates/env.rc ${OPENSTACK_CLOUD_YAML_FILE} ${CLUSTER_NAME}
259263

260264
OPENSTACK_CLOUD_CACERT_B64=${OPENSTACK_CLOUD_CACERT_B64} \
261265
OPENSTACK_CLOUD_PROVIDER_CONF_B64=${OPENSTACK_CLOUD_PROVIDER_CONF_B64} \
262266
OPENSTACK_CLOUD_YAML_B64=${OPENSTACK_CLOUD_YAML_B64} \
263267
OPENSTACK_IMAGE_NAME=${OPENSTACK_IMAGE_NAME} \
264-
OPENSTACK_SSH_AUTHORIZED_KEY="$(cat ${OPENSTACK_SSH_AUTHORIZED_KEY_PATH})" \
268+
OPENSTACK_SSH_KEY_NAME=${OPENSTACK_SSH_KEY_NAME} \
265269
OPENSTACK_DNS_NAMESERVERS=${OPENSTACK_DNS_NAMESERVERS} \
266270
OPENSTACK_CLUSTER_TEMPLATE=${OPENSTACK_CLUSTER_TEMPLATE} \
267271
KUBERNETES_VERSION=${KUBERNETES_VERSION} \
@@ -397,6 +401,7 @@ main() {
397401
fi
398402

399403
build
404+
create_key_pair
400405
create_cluster
401406

402407
if [[ -z "${SKIP_RUN_TESTS:-}" ]]; then

hack/ci/e2e-conformance/kustomization.yaml

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,3 @@ resources:
44
- cluster.yaml
55
patchesStrategicMerge:
66
- e2e-conformance_patch.yaml
7-
patchesJSON6902:
8-
# sets the password of the capo user to capo
9-
- target:
10-
group: bootstrap.cluster.x-k8s.io
11-
version: v1alpha3
12-
kind: KubeadmConfigTemplate
13-
name: capi-quickstart-md-0
14-
patch: |-
15-
- op: replace
16-
path: /spec/template/spec/users/0/passwd
17-
value: '$1$SaltSalt$JQx8irEe3sMOl/Lu8y7oZ1'
18-
- target:
19-
group: controlplane.cluster.x-k8s.io
20-
version: v1alpha3
21-
kind: KubeadmControlPlane
22-
name: capi-quickstart-control-plane
23-
patch: |-
24-
- op: replace
25-
path: /spec/kubeadmConfigSpec/users/0/passwd
26-
value: '$1$SaltSalt$JQx8irEe3sMOl/Lu8y7oZ1'

templates/cluster-template-external-cloud-provider.yaml

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,6 @@ spec:
6868
name: '{{ local_hostname }}'
6969
kubeletExtraArgs:
7070
cloud-provider: external
71-
ntp:
72-
servers: []
73-
users:
74-
- name: capo
75-
sudo: "ALL=(ALL) NOPASSWD:ALL"
76-
sshAuthorizedKeys:
77-
- "${OPENSTACK_SSH_AUTHORIZED_KEY}"
7871
version: "${KUBERNETES_VERSION}"
7972
---
8073
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
@@ -86,6 +79,7 @@ spec:
8679
spec:
8780
flavor: ${OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR}
8881
image: ${OPENSTACK_IMAGE_NAME}
82+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
8983
cloudName: ${OPENSTACK_CLOUD}
9084
cloudsSecret:
9185
name: ${CLUSTER_NAME}-cloud-config
@@ -128,6 +122,7 @@ spec:
128122
namespace: ${NAMESPACE}
129123
flavor: ${OPENSTACK_NODE_MACHINE_FLAVOR}
130124
image: ${OPENSTACK_IMAGE_NAME}
125+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
131126
---
132127
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3
133128
kind: KubeadmConfigTemplate
@@ -141,13 +136,6 @@ spec:
141136
name: '{{ local_hostname }}'
142137
kubeletExtraArgs:
143138
cloud-provider: external
144-
ntp:
145-
servers: []
146-
users:
147-
- name: capo
148-
sudo: "ALL=(ALL) NOPASSWD:ALL"
149-
sshAuthorizedKeys:
150-
- "${OPENSTACK_SSH_AUTHORIZED_KEY}"
151139
---
152140
apiVersion: v1
153141
kind: Secret

templates/cluster-template-without-lb.yaml

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,6 @@ spec:
9393
encoding: base64
9494
ntp:
9595
servers: []
96-
users:
97-
- name: capo
98-
sudo: "ALL=(ALL) NOPASSWD:ALL"
99-
sshAuthorizedKeys:
100-
- "${OPENSTACK_SSH_AUTHORIZED_KEY}"
10196
version: "${KUBERNETES_VERSION}"
10297
---
10398
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
@@ -109,6 +104,7 @@ spec:
109104
spec:
110105
flavor: ${OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR}
111106
image: ${OPENSTACK_IMAGE_NAME}
107+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
112108
cloudName: ${OPENSTACK_CLOUD}
113109
cloudsSecret:
114110
name: ${CLUSTER_NAME}-cloud-config
@@ -151,6 +147,7 @@ spec:
151147
namespace: ${NAMESPACE}
152148
flavor: ${OPENSTACK_NODE_MACHINE_FLAVOR}
153149
image: ${OPENSTACK_IMAGE_NAME}
150+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
154151
---
155152
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3
156153
kind: KubeadmConfigTemplate
@@ -176,13 +173,6 @@ spec:
176173
kubeletExtraArgs:
177174
cloud-config: /etc/kubernetes/cloud.conf
178175
cloud-provider: openstack
179-
ntp:
180-
servers: []
181-
users:
182-
- name: capo
183-
sudo: "ALL=(ALL) NOPASSWD:ALL"
184-
sshAuthorizedKeys:
185-
- "${OPENSTACK_SSH_AUTHORIZED_KEY}"
186176
---
187177
apiVersion: v1
188178
kind: Secret

templates/cluster-template.yaml

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,6 @@ spec:
9393
permissions: "0600"
9494
content: ${OPENSTACK_CLOUD_CACERT_B64}
9595
encoding: base64
96-
ntp:
97-
servers: []
98-
users:
99-
- name: capo
100-
sudo: "ALL=(ALL) NOPASSWD:ALL"
101-
sshAuthorizedKeys:
102-
- "${OPENSTACK_SSH_AUTHORIZED_KEY}"
10396
version: "${KUBERNETES_VERSION}"
10497
---
10598
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
@@ -111,6 +104,7 @@ spec:
111104
spec:
112105
flavor: ${OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR}
113106
image: ${OPENSTACK_IMAGE_NAME}
107+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
114108
cloudName: ${OPENSTACK_CLOUD}
115109
cloudsSecret:
116110
name: ${CLUSTER_NAME}-cloud-config
@@ -153,6 +147,7 @@ spec:
153147
namespace: ${NAMESPACE}
154148
flavor: ${OPENSTACK_NODE_MACHINE_FLAVOR}
155149
image: ${OPENSTACK_IMAGE_NAME}
150+
sshKeyName: ${OPENSTACK_SSH_KEY_NAME}
156151
---
157152
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3
158153
kind: KubeadmConfigTemplate
@@ -178,13 +173,6 @@ spec:
178173
kubeletExtraArgs:
179174
cloud-config: /etc/kubernetes/cloud.conf
180175
cloud-provider: openstack
181-
ntp:
182-
servers: []
183-
users:
184-
- name: capo
185-
sudo: "ALL=(ALL) NOPASSWD:ALL"
186-
sshAuthorizedKeys:
187-
- "${OPENSTACK_SSH_AUTHORIZED_KEY}"
188176
---
189177
apiVersion: v1
190178
kind: Secret

0 commit comments

Comments
 (0)