@@ -7,11 +7,11 @@ Usage: ./k8s-certs-gen.sh
7
7
Set the following environment variables to run this script:
8
8
9
9
BASE_DOMAIN Base domain name of the cluster. For example if your API
10
- server is running on "my-cluster-k8s.example.com ", the
11
- base domain is "example.com "
10
+ server is running on "my-cluster-k8s.ilinux.io ", the
11
+ base domain is "ilinux.io "
12
12
13
13
CLUSTER_NAME Name of the cluster. If your API server is running on the
14
- domain "my-cluster-k8s.example.com ", the name of the cluster
14
+ domain "my-cluster-k8s.ilinux.io ", the name of the cluster
15
15
is "my-cluster"
16
16
17
17
APISERVER_CLUSTER_IP
@@ -20,6 +20,10 @@ Set the following environment variables to run this script:
20
20
21
21
CA_CERT Path to the pem encoded CA certificate of your cluster.
22
22
CA_KEY Path to the pem encoded CA key of your cluster.
23
+
24
+ MASTERS Name list. If all of your master's name is
25
+ "master01.ilinux.io", "master02.ilinux.io" and "master03.ilinux.io",
26
+ the list value is "master01 master02 master03".
23
27
EOF
24
28
exit 1
25
29
}
33
37
if [ -z $APISERVER_CLUSTER_IP ]; then
34
38
usage
35
39
fi
40
+ if [ -z " $MASTERS " ]; then
41
+ usage
42
+ fi
36
43
37
44
export DIR=" generated"
38
45
if [ $# -eq 1 ]; then
39
46
DIR=" $1 "
40
47
fi
41
48
42
- export CERT_DIR=$DIR /pki
49
+ export CERT_DIR=$DIR /CA
43
50
mkdir -p $CERT_DIR
44
- PATCHES=$DIR /patches
45
- mkdir -p $PATCHES
46
- mkdir -p $DIR /auth
47
51
48
- if [ -z " $CA_CERT " -o -z " $CA_KEY " ]; then
52
+ export CA_CERT=" $CERT_DIR /ca.crt"
53
+ export CA_KEY=" $CERT_DIR /ca.key"
54
+ if [ -f " $CA_CERT " -a -f " $CA_KEY " ]; then
55
+ echo " Using the CA: $CA_CERT and $CA_KEY "
56
+ read -p " pause" A
57
+ else
58
+ echo " Generating CA key and self signed cert."
49
59
openssl genrsa -out $CERT_DIR /ca.key 4096
50
60
openssl req -config openssl.conf \
51
61
-new -x509 -days 3650 -sha256 \
52
62
-key $CERT_DIR /ca.key -out $CERT_DIR /ca.crt \
53
63
-subj " /CN=k8s-ca"
54
- export CA_KEY=$CERT_DIR /ca.key
55
- export CA_CERT=$CERT_DIR /ca.crt
56
64
fi
57
65
58
66
# Configure expected OpenSSL CA configs.
@@ -77,95 +85,127 @@ function openssl_sign() {
77
85
-cert ${1} -keyfile ${2}
78
86
}
79
87
80
- # Generate CSRs for all components
81
- openssl_req $CERT_DIR apiserver " /CN=kube-apiserver/O=kube-master"
82
- openssl_req $CERT_DIR apiserver-kubelet-client " /CN=kube-apiserver-kubelet-client/O=system:masters"
83
- openssl_req $CERT_DIR kube-controller-manager " /CN=system:kube-controller-manager"
84
- openssl_req $CERT_DIR kube-scheduler " /CN=system:kube-scheduler"
85
- openssl_req $CERT_DIR kube-proxy " /CN=system:kube-proxy"
86
- openssl_req $CERT_DIR ingress-server " /CN=${CLUSTER_NAME} .${BASE_DOMAIN} "
87
-
88
- # Sign CSRs for all components
89
- openssl_sign $CA_CERT $CA_KEY $CERT_DIR apiserver apiserver_cert
90
- openssl_sign $CA_CERT $CA_KEY $CERT_DIR apiserver-kubelet-client client_cert
91
- openssl_sign $CA_CERT $CA_KEY $CERT_DIR kube-controller-manager client_cert
92
- openssl_sign $CA_CERT $CA_KEY $CERT_DIR kube-scheduler client_cert
93
- openssl_sign $CA_CERT $CA_KEY $CERT_DIR kube-proxy client_cert
94
- openssl_sign $CA_CERT $CA_KEY $CERT_DIR ingress-server server_cert
95
-
96
-
97
- # Add debug information to directories
98
- # for CERT in $CERT_DIR/*.crt; do
99
- # openssl x509 -in $CERT -noout -text > "${CERT%.crt}.txt"
100
- # done
101
-
102
- # Use openssl for base64'ing instead of base64 which has different wrap behavior
103
- # between Linux and Mac.
104
- # https://stackoverflow.com/questions/46463027/base64-doesnt-have-w-option-in-mac
105
- cat > $DIR /auth/admin.conf << EOF
88
+ # If supplied, generate a new etcd CA and associated certs.
89
+ if [ -n $FRONT_PROXY_CA_CERT ]; then
90
+ front_proxy_dir=${DIR} /front-proxy
91
+ if [ ! -d " $front_proxy_dir " ]; then
92
+ mkdir $front_proxy_dir
93
+ fi
94
+
95
+ openssl genrsa -out ${front_proxy_dir} /front-proxy-ca.key 2048
96
+ openssl req -config openssl.conf \
97
+ -new -x509 -days 3650 -sha256 \
98
+ -key ${front_proxy_dir} /front-proxy-ca.key \
99
+ -out ${front_proxy_dir} /front-proxy-ca.crt -subj " /CN=front-proxy-ca"
100
+
101
+ openssl_req ${front_proxy_dir} front-proxy-client " /CN=front-proxy-client"
102
+
103
+ openssl_sign ${front_proxy_dir} /front-proxy-ca.crt ${front_proxy_dir} /front-proxy-ca.key ${front_proxy_dir} front-proxy-client client_cert
104
+ rm -f ${front_proxy_dir} /* .csr
105
+ fi
106
+
107
+ # Generate and sihn CSRs for all components of masters
108
+ for master in $MASTERS ; do
109
+ master_dir=" ${DIR} /${master} "
110
+
111
+ if [ ! -d " ${master_dir} " ]; then
112
+ mkdir -p ${master_dir} /{auth,pki}
113
+ fi
114
+
115
+ export MASTER_NAME=${master}
116
+
117
+ openssl_req " ${master_dir} /pki" apiserver " /CN=kube-apiserver"
118
+ openssl_req " ${master_dir} /pki" kube-controller-manager " /CN=system:kube-controller-manager"
119
+ openssl_req " ${master_dir} /pki" kube-scheduler " /CN=system:kube-scheduler"
120
+ openssl_req " ${master_dir} /pki" apiserver-kubelet-client " /CN=kube-apiserver-kubelet-client/O=system:masters"
121
+
122
+ openssl_sign $CA_CERT $CA_KEY " ${master_dir} /pki" apiserver apiserver_cert
123
+ openssl_sign $CA_CERT $CA_KEY " ${master_dir} /pki" kube-controller-manager master_component_client_cert
124
+ openssl_sign $CA_CERT $CA_KEY " ${master_dir} /pki" kube-scheduler master_component_client_cert
125
+ openssl_sign $CA_CERT $CA_KEY " ${master_dir} /pki" apiserver-kubelet-client client_cert
126
+ rm -f ${master_dir} /pki/* .csr
127
+
128
+ echo " Copy CA key and cert file to ${master_dir} "
129
+ cp $CA_CERT $CA_KEY ${master_dir} /pki/
130
+
131
+ echo " Copy front-proxy CA key and cert file to ${master_dir} "
132
+ cp $front_proxy_dir /front-proxy* ${master_dir} /pki/
133
+
134
+ echo " Generating kubeconfig for kube-controller-manager"
135
+ cat > ${master_dir} /auth/controller-manager.conf << EOF
106
136
apiVersion: v1
107
137
kind: Config
108
138
clusters:
109
139
- name: ${CLUSTER_NAME}
110
140
cluster:
111
- server: https://${CLUSTER_NAME} -api .${BASE_DOMAIN} :6443
141
+ server: https://${master} .${BASE_DOMAIN} :6443
112
142
certificate-authority-data: $( openssl base64 -A -in $CA_CERT )
113
143
users:
114
- - name: k8s-admin
144
+ - name: system:kube-controller-manager
115
145
user:
116
- client-certificate-data: $( openssl base64 -A -in $CERT_DIR /apiserver-kubelet-client .crt )
117
- client-key-data: $( openssl base64 -A -in $CERT_DIR /apiserver-kubelet-client .key )
146
+ client-certificate-data: $( openssl base64 -A -in ${master_dir} /pki/kube-controller-manager .crt )
147
+ client-key-data: $( openssl base64 -A -in ${master_dir} /pki/kube-controller-manager .key )
118
148
contexts:
119
149
- context:
120
150
cluster: ${CLUSTER_NAME}
121
- user: k8s-admin
122
- name: k8s-admin @${CLUSTER_NAME}
123
- current-context: k8s-admin @${CLUSTER_NAME}
151
+ user: system:kube-controller-manager
152
+ name: system:kube-controller-manager @${CLUSTER_NAME}
153
+ current-context: system:kube-controller-manager @${CLUSTER_NAME}
124
154
EOF
125
155
126
- cat > $DIR /auth/controller-manager.conf << EOF
156
+ echo " Generating kubeconfig for kube-scheduler"
157
+ cat > ${master_dir} /auth/scheduler.conf << EOF
127
158
apiVersion: v1
128
159
kind: Config
129
160
clusters:
130
161
- name: ${CLUSTER_NAME}
131
162
cluster:
132
- server: https://${CLUSTER_NAME} -api .${BASE_DOMAIN} :6443
163
+ server: https://${master} .${BASE_DOMAIN} :6443
133
164
certificate-authority-data: $( openssl base64 -A -in $CA_CERT )
134
165
users:
135
- - name: system:kube-controller-manager
166
+ - name: system:kube-scheduler
136
167
user:
137
- client-certificate-data: $( openssl base64 -A -in $CERT_DIR / kube-controller-manager .crt )
138
- client-key-data: $( openssl base64 -A -in $CERT_DIR / kube-controller-manager .key )
168
+ client-certificate-data: $( openssl base64 -A -in ${master_dir} /pki/ kube-scheduler .crt )
169
+ client-key-data: $( openssl base64 -A -in ${master_dir} /pki/ kube-scheduler .key )
139
170
contexts:
140
171
- context:
141
172
cluster: ${CLUSTER_NAME}
142
- user: system:kube-controller-manager
143
- name: system:kube-controller-manager @${CLUSTER_NAME}
144
- current-context: system:kube-controller-manager @${CLUSTER_NAME}
173
+ user: system:kube-scheduler
174
+ name: system:kube-scheduler @${CLUSTER_NAME}
175
+ current-context: system:kube-scheduler @${CLUSTER_NAME}
145
176
EOF
146
177
147
- cat > $DIR /auth/scheduler.conf << EOF
178
+ echo " Generating kubeconfig for Cluster Admin"
179
+ cat > ${master_dir} /auth/admin.conf << EOF
148
180
apiVersion: v1
149
181
kind: Config
150
182
clusters:
151
183
- name: ${CLUSTER_NAME}
152
184
cluster:
153
- server: https://${CLUSTER_NAME} -api .${BASE_DOMAIN} :6443
185
+ server: https://${master} .${BASE_DOMAIN} :6443
154
186
certificate-authority-data: $( openssl base64 -A -in $CA_CERT )
155
187
users:
156
- - name: system:kube-scheduler
188
+ - name: k8s-admin
157
189
user:
158
- client-certificate-data: $( openssl base64 -A -in $CERT_DIR /kube-scheduler .crt )
159
- client-key-data: $( openssl base64 -A -in $CERT_DIR /kube-scheduler .key )
190
+ client-certificate-data: $( openssl base64 -A -in ${master_dir} /pki/apiserver-kubelet-client .crt )
191
+ client-key-data: $( openssl base64 -A -in ${master_dir} /pki/apiserver-kubelet-client .key )
160
192
contexts:
161
193
- context:
162
194
cluster: ${CLUSTER_NAME}
163
- user: system:kube-scheduler
164
- name: system:kube-scheduler @${CLUSTER_NAME}
165
- current-context: system:kube-scheduler @${CLUSTER_NAME}
195
+ user: k8s-admin
196
+ name: k8s-admin @${CLUSTER_NAME}
197
+ current-context: k8s-admin @${CLUSTER_NAME}
166
198
EOF
199
+ done
200
+
201
+ # Generate key and cert for kubelet
202
+ kubelet_dir=${DIR} /kubelet
203
+ mkdir -p ${kubelet_dir} /{pki,auth}
204
+
205
+ openssl_req ${kubelet_dir} /pki kube-proxy " /CN=system:kube-proxy"
206
+ openssl_sign $CA_CERT $CA_KEY ${kubelet_dir} /pki kube-proxy client_cert
167
207
168
- cat > $DIR /auth/kube-proxy.conf << EOF
208
+ cat > ${kubelet_dir} /auth/kube-proxy.conf << EOF
169
209
apiVersion: v1
170
210
kind: Config
171
211
clusters:
@@ -176,8 +216,8 @@ clusters:
176
216
users:
177
217
- name: system:kube-proxy
178
218
user:
179
- client-certificate-data: $( openssl base64 -A -in $CERT_DIR /kube-proxy.crt )
180
- client-key-data: $( openssl base64 -A -in $CERT_DIR /kube-proxy.key )
219
+ client-certificate-data: $( openssl base64 -A -in ${kubelet_dir} /pki /kube-proxy.crt )
220
+ client-key-data: $( openssl base64 -A -in ${kubelet_dir} /pki /kube-proxy.key )
181
221
contexts:
182
222
- context:
183
223
cluster: ${CLUSTER_NAME}
@@ -186,51 +226,28 @@ contexts:
186
226
current-context: system:kube-proxy@${CLUSTER_NAME}
187
227
EOF
188
228
229
+ # Generate key and cert for ingress
230
+ ingress_dir=${DIR} /ingress
231
+ mkdir -p ${DIR} /ingress/patches
232
+
233
+ openssl_req ${ingress_dir} ingress-server " /CN=${CLUSTER_NAME} .${BASE_DOMAIN} "
234
+ openssl_sign $CA_CERT $CA_KEY ${ingress_dir} ingress-server server_cert
235
+ rm -f ${ingress_dir} /* .csr
189
236
190
237
# Generate secret patches. We include the metadata here so
191
238
# `kubectl patch -f ( file ) -p $( cat ( file ) )` works.
192
- cat > $PATCHES /ingress-tls.patch << EOF
193
- apiVersion: v1
194
- kind: Secret
195
- metadata:
196
- name: tectonic-ingress-tls-secret
197
- namespace: tectonic-system
198
- data:
199
- tls.crt: $( openssl base64 -A -in ${CERT_DIR} /ingress-server.crt )
200
- tls.key: $( openssl base64 -A -in ${CERT_DIR} /ingress-server.key )
201
- EOF
202
-
203
- cat > $PATCHES /kube-apiserver-secret.patch << EOF
239
+ cat > ${ingress_dir} /patches/ingress-tls.patch << EOF
204
240
apiVersion: v1
205
241
kind: Secret
206
242
metadata:
207
- name: kube-apiserver
243
+ name: ingress-tls-secret
208
244
namespace: kube-system
209
245
data:
210
- apiserver .crt: $( openssl base64 -A -in ${CERT_DIR} /apiserver .crt )
211
- apiserver .key: $( openssl base64 -A -in ${CERT_DIR} /apiserver .key )
246
+ tls .crt: $( openssl base64 -A -in ${ingress_dir} /ingress-server .crt )
247
+ tls .key: $( openssl base64 -A -in ${ingress_dir} /ingress-server .key )
212
248
EOF
213
249
214
- # If supplied, generate a new etcd CA and associated certs.
215
- if [ -n $FRONT_PROXY_CA_CERT ]; then
216
- openssl genrsa -out $CERT_DIR /front-proxy-ca.key 2048
217
- openssl req -config openssl.conf \
218
- -new -x509 -days 3650 -sha256 \
219
- -key $CERT_DIR /front-proxy-ca.key \
220
- -out $CERT_DIR /front-proxy-ca.crt -subj " /CN=front-proxy-ca"
221
-
222
- openssl_req $CERT_DIR front-proxy-client " /CN=front-proxy-client"
223
-
224
- openssl_sign $CERT_DIR /front-proxy-ca.crt $CERT_DIR /front-proxy-ca.key $CERT_DIR front-proxy-client client_cert
225
-
226
- # Add debug information to directories
227
- # for CERT in $CERT_DIR/front-proxy-*.crt; do
228
- # openssl x509 -in $CERT -noout -text > "${CERT%.crt}.txt"
229
- # done
230
- fi
231
-
232
250
# Clean up openssl config
233
- rm $CERT_DIR /index*
234
- rm $CERT_DIR /100*
235
- rm $CERT_DIR /serial*
236
- rm $CERT_DIR /* .csr
251
+ rm -f $CERT_DIR /index*
252
+ rm -f $CERT_DIR /100*
253
+ rm -f $CERT_DIR /serial*
0 commit comments