Skip to content

Commit 582dcf0

Browse files
committed
v0.5
1 parent 66d1f68 commit 582dcf0

File tree

3 files changed

+140
-106
lines changed

3 files changed

+140
-106
lines changed

gencerts.sh

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ if [ "$1" == 'k8s' ]; then
2323
read -p "Enter Kubernetes Cluster Name [kubernetes]: " CLUSTER_NAME
2424
echo -n -e "Enter the IP Address in default namespace \n of the Kubernetes API Server[10.96.0.1]: "
2525
read APISERVER_CLUSTER_IP
26+
read -p "Enter Master servers name[master01 master02 master03]: " MASTERS
2627

2728
CLUSTER_NAME=${CLUSTER_NAME:-kubernetes}
2829
APISERVER_CLUSTER_IP=${APISERVER_CLUSTER_IP:-10.96.0.1}
30+
MASTERS=${MASTERS:-"master01 master02 master03"}
2931

30-
export CLUSTER_NAME APISERVER_CLUSTER_IP
32+
export CLUSTER_NAME APISERVER_CLUSTER_IP MASTERS
3133

3234
bash ./k8s-certs-gen.sh kubernetes
3335
fi

k8s-certs-gen.sh

+116-99
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ Usage: ./k8s-certs-gen.sh
77
Set the following environment variables to run this script:
88
99
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"
1212
1313
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
1515
is "my-cluster"
1616
1717
APISERVER_CLUSTER_IP
@@ -20,6 +20,10 @@ Set the following environment variables to run this script:
2020
2121
CA_CERT Path to the pem encoded CA certificate of your cluster.
2222
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".
2327
EOF
2428
exit 1
2529
}
@@ -33,26 +37,30 @@ fi
3337
if [ -z $APISERVER_CLUSTER_IP ]; then
3438
usage
3539
fi
40+
if [ -z "$MASTERS" ]; then
41+
usage
42+
fi
3643

3744
export DIR="generated"
3845
if [ $# -eq 1 ]; then
3946
DIR="$1"
4047
fi
4148

42-
export CERT_DIR=$DIR/pki
49+
export CERT_DIR=$DIR/CA
4350
mkdir -p $CERT_DIR
44-
PATCHES=$DIR/patches
45-
mkdir -p $PATCHES
46-
mkdir -p $DIR/auth
4751

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."
4959
openssl genrsa -out $CERT_DIR/ca.key 4096
5060
openssl req -config openssl.conf \
5161
-new -x509 -days 3650 -sha256 \
5262
-key $CERT_DIR/ca.key -out $CERT_DIR/ca.crt \
5363
-subj "/CN=k8s-ca"
54-
export CA_KEY=$CERT_DIR/ca.key
55-
export CA_CERT=$CERT_DIR/ca.crt
5664
fi
5765

5866
# Configure expected OpenSSL CA configs.
@@ -77,95 +85,127 @@ function openssl_sign() {
7785
-cert ${1} -keyfile ${2}
7886
}
7987

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
106136
apiVersion: v1
107137
kind: Config
108138
clusters:
109139
- name: ${CLUSTER_NAME}
110140
cluster:
111-
server: https://${CLUSTER_NAME}-api.${BASE_DOMAIN}:6443
141+
server: https://${master}.${BASE_DOMAIN}:6443
112142
certificate-authority-data: $( openssl base64 -A -in $CA_CERT )
113143
users:
114-
- name: k8s-admin
144+
- name: system:kube-controller-manager
115145
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 )
118148
contexts:
119149
- context:
120150
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}
124154
EOF
125155

126-
cat > $DIR/auth/controller-manager.conf << EOF
156+
echo "Generating kubeconfig for kube-scheduler"
157+
cat > ${master_dir}/auth/scheduler.conf << EOF
127158
apiVersion: v1
128159
kind: Config
129160
clusters:
130161
- name: ${CLUSTER_NAME}
131162
cluster:
132-
server: https://${CLUSTER_NAME}-api.${BASE_DOMAIN}:6443
163+
server: https://${master}.${BASE_DOMAIN}:6443
133164
certificate-authority-data: $( openssl base64 -A -in $CA_CERT )
134165
users:
135-
- name: system:kube-controller-manager
166+
- name: system:kube-scheduler
136167
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 )
139170
contexts:
140171
- context:
141172
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}
145176
EOF
146177

147-
cat > $DIR/auth/scheduler.conf << EOF
178+
echo "Generating kubeconfig for Cluster Admin"
179+
cat > ${master_dir}/auth/admin.conf << EOF
148180
apiVersion: v1
149181
kind: Config
150182
clusters:
151183
- name: ${CLUSTER_NAME}
152184
cluster:
153-
server: https://${CLUSTER_NAME}-api.${BASE_DOMAIN}:6443
185+
server: https://${master}.${BASE_DOMAIN}:6443
154186
certificate-authority-data: $( openssl base64 -A -in $CA_CERT )
155187
users:
156-
- name: system:kube-scheduler
188+
- name: k8s-admin
157189
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 )
160192
contexts:
161193
- context:
162194
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}
166198
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
167207

168-
cat > $DIR/auth/kube-proxy.conf << EOF
208+
cat > ${kubelet_dir}/auth/kube-proxy.conf << EOF
169209
apiVersion: v1
170210
kind: Config
171211
clusters:
@@ -176,8 +216,8 @@ clusters:
176216
users:
177217
- name: system:kube-proxy
178218
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 )
181221
contexts:
182222
- context:
183223
cluster: ${CLUSTER_NAME}
@@ -186,51 +226,28 @@ contexts:
186226
current-context: system:kube-proxy@${CLUSTER_NAME}
187227
EOF
188228

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
189236

190237
# Generate secret patches. We include the metadata here so
191238
# `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
204240
apiVersion: v1
205241
kind: Secret
206242
metadata:
207-
name: kube-apiserver
243+
name: ingress-tls-secret
208244
namespace: kube-system
209245
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 )
212248
EOF
213249

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-
232250
# 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*

openssl.conf

+21-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ BASE_DOMAIN=
33
CLUSTER_NAME=
44
CERT_DIR=
55
APISERVER_CLUSTER_IP=
6+
MASTER_NAME=
67

78
[ ca ]
89
# `man ca`
@@ -118,12 +119,26 @@ subjectKeyIdentifier = hash
118119
authorityKeyIdentifier = keyid,issuer:always
119120
keyUsage = critical, digitalSignature, keyEncipherment
120121
extendedKeyUsage = serverAuth, clientAuth
121-
subjectAltName = @alt_names
122+
subjectAltName = @apiserver_names
122123

123-
[alt_names]
124+
[ master_component_client_cert ]
125+
basicConstraints = CA:FALSE
126+
nsCertType = client
127+
nsComment = "OpenSSL Generated Client Certificate"
128+
subjectKeyIdentifier = hash
129+
authorityKeyIdentifier = keyid,issuer
130+
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
131+
extendedKeyUsage = clientAuth
132+
subjectAltName = @master_names
133+
134+
[apiserver_names]
124135
DNS.1 = ${ENV::CLUSTER_NAME}-api.${ENV::BASE_DOMAIN}
125-
DNS.2 = kubernetes
126-
DNS.3 = kubernetes.default
127-
DNS.4 = kubernetes.default.svc
128-
DNS.5 = kubernetes.default.svc.cluster.local
136+
DNS.2 = ${ENV::MASTER_NAME}.${ENV::BASE_DOMAIN}
137+
DNS.3 = kubernetes
138+
DNS.4 = kubernetes.default
139+
DNS.5 = kubernetes.default.svc
140+
DNS.6 = kubernetes.default.svc.cluster.local
129141
IP.1 = ${ENV::APISERVER_CLUSTER_IP}
142+
143+
[ master_names ]
144+
DNS.1 = ${ENV::MASTER_NAME}.${ENV::BASE_DOMAIN}

0 commit comments

Comments
 (0)