Merge "Separate CA for k8s and etcd"

This commit is contained in:
Zuul
2021-10-22 16:14:55 +00:00
committed by Gerrit Code Review
8 changed files with 152 additions and 45 deletions

View File

@@ -222,6 +222,8 @@ docker_registries:
# - ssl_ca_cert # - ssl_ca_cert
# - k8s_root_ca_cert # - k8s_root_ca_cert
# - k8s_root_ca_key # - k8s_root_ca_key
# - etcd_root_ca_cert
# - etcd_root_ca_key
# #
# ssl_ca_cert: /path/to/ssl_ca_cert_file # ssl_ca_cert: /path/to/ssl_ca_cert_file

View File

@@ -146,7 +146,6 @@
path: "{{ hieradata_workdir }}/static.yaml" path: "{{ hieradata_workdir }}/static.yaml"
line: "{{ item }}" line: "{{ item }}"
with_items: with_items:
- "platform::etcd::params::security_enabled: true"
- "platform::etcd::params::bind_address: {{ cluster_floating_address }}" - "platform::etcd::params::bind_address: {{ cluster_floating_address }}"
- "platform::etcd::params::bind_address_version: {{ etcd_listen_address_version }}" - "platform::etcd::params::bind_address_version: {{ etcd_listen_address_version }}"

View File

@@ -120,6 +120,8 @@
- "prev_k8s_root_ca_cert: {{ k8s_root_ca_cert }}" - "prev_k8s_root_ca_cert: {{ k8s_root_ca_cert }}"
- "prev_k8s_root_ca_key: {{ k8s_root_ca_key }}" - "prev_k8s_root_ca_key: {{ k8s_root_ca_key }}"
- "prev_apiserver_oidc: {{ apiserver_oidc | to_yaml }}" - "prev_apiserver_oidc: {{ apiserver_oidc | to_yaml }}"
- "prev_etcd_root_ca_cert: {{ etcd_root_ca_cert }}"
- "prev_etcd_root_ca_key: {{ etcd_root_ca_key }}"
# Nested dictionaries are picky about having things on the same line # Nested dictionaries are picky about having things on the same line
- "prev_docker_registries: " - "prev_docker_registries: "
- "{{ docker_registries | to_yaml }}" - "{{ docker_registries | to_yaml }}"

View File

@@ -81,17 +81,47 @@
- "apiserver-etcd-client.key" - "apiserver-etcd-client.key"
when: k8s_pki_files is defined when: k8s_pki_files is defined
- name: Copy ca, cert and key generated by etcd to kubeadm_pki_dir - block:
copy: - name: Copy apiserver cert and key generated by etcd to kubeadm_pki_dir
src: "/etc/etcd/{{ item }}" copy:
dest: "{{ kubeadm_pki_dir }}/{{ item }}" src: "/etc/etcd/{{ item }}"
remote_src: yes dest: "{{ kubeadm_pki_dir }}/{{ item }}"
force: yes remote_src: yes
with_items: force: yes
- "ca.crt" with_items:
- "ca.key" - "apiserver-etcd-client.crt"
- "apiserver-etcd-client.crt" - "apiserver-etcd-client.key"
- "apiserver-etcd-client.key"
- name: Generate private key for kubernetes-ca
openssl_privatekey:
path: "{{ kubeadm_pki_dir }}/ca.key"
type: RSA
size: 4096
state: present
force: true
- name: Generate CSR for kubernetes-ca
openssl_csr:
path: "{{ kubeadm_pki_dir }}/ca.csr"
privatekey_path: "{{ kubeadm_pki_dir }}/ca.key"
common_name: kubernetes
basic_constraints:
- CA:true
- pathlen:1
basic_constraints_critical: True
key_usage:
- keyCertSign
- digitalSignature
- keyEncipherment
force: true
- name: Generate self-signed CA certificate for kubernetes-ca
openssl_certificate:
path: "{{ kubeadm_pki_dir }}/ca.crt"
privatekey_path: "{{ kubeadm_pki_dir }}/ca.key"
csr_path: "{{ kubeadm_pki_dir }}/ca.csr"
provider: selfsigned
force: true
when: k8s_pki_files is undefined when: k8s_pki_files is undefined
- name: Set kubelet node configuration - name: Set kubelet node configuration

View File

@@ -197,11 +197,13 @@
docker_https_proxy: "{{ docker_https_proxy | default('undef') }}" docker_https_proxy: "{{ docker_https_proxy | default('undef') }}"
docker_no_proxy: "{{ docker_no_proxy | default([]) }}" docker_no_proxy: "{{ docker_no_proxy | default([]) }}"
- name: Set default values for kubernetes certificate parameters if not defined - name: Define k8s/etcd certificate parameters if not defined
set_fact: set_fact:
k8s_root_ca_cert: "{{ k8s_root_ca_cert | default('') }}" k8s_root_ca_cert: "{{ k8s_root_ca_cert | default('') }}"
k8s_root_ca_key: "{{ k8s_root_ca_key | default('') }}" k8s_root_ca_key: "{{ k8s_root_ca_key | default('') }}"
apiserver_cert_sans: "{{ apiserver_cert_sans | default([]) }}" apiserver_cert_sans: "{{ apiserver_cert_sans | default([]) }}"
etcd_root_ca_cert: "{{ etcd_root_ca_cert | default('') }}"
etcd_root_ca_key: "{{ etcd_root_ca_key | default('') }}"
# Give the bootstrap config output file on the host a generic name so the # Give the bootstrap config output file on the host a generic name so the
# same file is referenced if the host is bootstrapped locally and remotely # same file is referenced if the host is bootstrapped locally and remotely
@@ -333,7 +335,9 @@
prev_docker_no_proxy != docker_no_proxy | sort)) or prev_docker_no_proxy != docker_no_proxy | sort)) or
(prev_apiserver_cert_sans != apiserver_cert_sans) or (prev_apiserver_cert_sans != apiserver_cert_sans) or
(prev_k8s_root_ca_cert != k8s_root_ca_cert) or (prev_k8s_root_ca_cert != k8s_root_ca_cert) or
(prev_k8s_root_ca_key != k8s_root_ca_key) (prev_k8s_root_ca_key != k8s_root_ca_key) or
(prev_etcd_root_ca_cert != etcd_root_ca_cert) or
(prev_etcd_root_ca_key != etcd_root_ca_key)
- name: Turn on service endpoints reconfiguration flag if management and/or oam network config is changed - name: Turn on service endpoints reconfiguration flag if management and/or oam network config is changed
set_fact: set_fact:

View File

@@ -730,6 +730,22 @@
include: validate_address.yml input_address={{ item }} include: validate_address.yml input_address={{ item }}
with_items: "{{ apiserver_cert_sans }}" with_items: "{{ apiserver_cert_sans }}"
- name: Verify that either both etcd root ca cert and key are defined or not at all
fail:
msg: "etcd_root_ca_cert and etcd_root_ca_key must be provided as a pair"
when: (etcd_root_ca_cert and not etcd_root_ca_key) or
(not etcd_root_ca_cert and etcd_root_ca_key)
- name: Check for etcd_root_ca_cert file
fail:
msg: "etcd_root_ca_cert file not found. ({{ etcd_root_ca_cert }})"
when: etcd_root_ca_cert and (not etcd_root_ca_cert is file)
- name: Check for etcd_root_ca_key file
fail:
msg: "etcd_root_ca_key file not found. ({{ etcd_root_ca_key }})"
when: etcd_root_ca_key and (not etcd_root_ca_key is file)
- name: Verify that either both Kubernetes root ca cert and key are defined or not at all - name: Verify that either both Kubernetes root ca cert and key are defined or not at all
fail: fail:
msg: "k8s_root_ca_cert and k8s_root_ca_key must be provided as a pair" msg: "k8s_root_ca_cert and k8s_root_ca_key must be provided as a pair"

View File

@@ -54,36 +54,27 @@
with_items: with_items:
- "etcd-client" - "etcd-client"
- name: Check if CA exists - name: Define values for etcd certificate and key
stat: set_fact:
path: /etc/kubernetes/pki/ca.crt etcd_root_ca_cert: "{{ etcd_root_ca_cert | default('') }}"
register: ca_file etcd_root_ca_key: "{{ etcd_root_ca_key | default('') }}"
- name: Copy existed CA - name: Setup dictionary of etcd certificates to install
copy: set_fact:
src: "/etc/kubernetes/pki/{{ item }}" etcd_ca_files: { ca.crt: "{{etcd_root_ca_cert}}", ca.key: "{{etcd_root_ca_key}}" }
dest: "/etc/etcd/{{ item }}" when:
remote_src: yes - (etcd_root_ca_cert)
force: yes - (etcd_root_ca_key)
with_items:
- "ca.crt"
- "ca.key"
when: ca_file.stat.exists
- name: copy user specified CA - name: Copy etcd root ca certificates
copy: copy:
src: "{{ item.src }}" src: "{{ item.value }}"
dest: "{{ item.dest }}" dest: "/etc/etcd/{{item.key}}"
force: yes with_dict: "{{ etcd_ca_files }}"
with_items: when: etcd_ca_files is defined
- { src: "{{ k8s_root_ca_cert }}", dest: "/etc/etcd/ca.crt" }
- { src: "{{ k8s_root_ca_key }}", dest: "/etc/etcd/ca.key" }
when: (k8s_root_ca_cert)
- block: - block:
- name: Generate private key for kubernetes-ca - name: Generate private key for etcd-ca
# Reuse this kubernetes-ca for the etcd-ca,
# will copy to /etc/kubernetes/pki later
openssl_privatekey: openssl_privatekey:
path: "/etc/etcd/ca.key" path: "/etc/etcd/ca.key"
type: RSA type: RSA
@@ -91,11 +82,11 @@
state: present state: present
force: true force: true
- name: Generate CSR for kubernetes-ca - name: Generate CSR for etcd-ca
openssl_csr: openssl_csr:
path: "/etc/etcd/ca.csr" path: "/etc/etcd/ca.csr"
privatekey_path: "/etc/etcd/ca.key" privatekey_path: "/etc/etcd/ca.key"
common_name: kubernetes common_name: etcd
basic_constraints: basic_constraints:
- CA:TRUE - CA:TRUE
- pathlen:1 - pathlen:1
@@ -103,19 +94,19 @@
key_usage: key_usage:
- keyCertSign - keyCertSign
- digitalSignature - digitalSignature
- keyEncipherment
force: true force: true
- name: Generate self-signed CA certificate - name: Generate self-signed CA certificate for etcd-ca
openssl_certificate: openssl_certificate:
path: "/etc/etcd/ca.crt" path: "/etc/etcd/ca.crt"
privatekey_path: "/etc/etcd/ca.key" privatekey_path: "/etc/etcd/ca.key"
csr_path: "/etc/etcd/ca.csr" csr_path: "/etc/etcd/ca.csr"
provider: selfsigned provider: selfsigned
force: true force: true
when: etcd_root_ca_cert == ''
when: not ca_file.stat.exists and k8s_root_ca_cert == '' - name: Generate certs signed with etcd CA certificate
- name: Generate certs signed with kubernetes CA certificate"
openssl_certificate: openssl_certificate:
path: "/etc/etcd/{{ item }}.crt" path: "/etc/etcd/{{ item }}.crt"
csr_path: "/etc/etcd/{{ item }}.csr" csr_path: "/etc/etcd/{{ item }}.csr"

View File

@@ -0,0 +1,63 @@
---
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# ROLE DESCRIPTION:
# Create a separate CA cert for etcd, separating from kubernetes
# This file can be removed in the release after STX6.0
- hosts: all
become: yes
become_user: root
tasks:
- name: Create cert for etcd server and client
import_role:
name: common/create-etcd-certs
- name: Create etcd cert permdir
file:
path: "{{ config_permdir + '/etcd' }}"
state: directory
mode: 0700
- name: Copy etcd certificates to config_permdir
copy:
src: "/etc/etcd/{{ item }}"
dest: "{{ config_permdir + '/etcd' }}/{{ item }}"
remote_src: yes
force: yes
with_items:
- "apiserver-etcd-client.crt"
- "apiserver-etcd-client.key"
- "etcd-server.crt"
- "etcd-server.key"
- "ca.crt"
- "ca.key"
- "etcd-client.crt"
- "etcd-client.key"
- name: Copy apiserver-etcd-client cert
copy:
src: "/etc/etcd/{{ item }}"
dest: "/etc/kubernetes/pki/{{ item }}"
remote_src: yes
force: yes
with_items:
- "apiserver-etcd-client.crt"
- "apiserver-etcd-client.key"
- name: Create list of etcd classes to pass to puppet
copy:
dest: "/tmp/etcd.yml"
content: |
classes:
- platform::etcd::upgrade::runtime
- name: Applying puppet for enabling etcd security
command: >
/usr/local/bin/puppet-manifest-apply.sh
{{ puppet_permdir }}/hieradata/
{{ ipaddress }}
controller runtime /tmp/etcd.yml
environment:
LC_ALL: "en_US.UTF-8"