Certificados
Iremos provisionar a infraestrutura PKI usando o kit de ferramentas PKI da AWS, e criar uma autoridade de certificação para e gerar certificados TLS dos seguintes componentes: etcd, kube-apiserver, kube-controller-manager, kube-scheduler kubelet e kube-proxy.
Certificado de Autoridade - CA
Criaremos uma Autoridade de Certificação que será para gerar certificados TLS adicionais.
cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": ["signing", "key encipherment", "server auth", "client auth"], "expiry": "8760h" } } } } EOF cat > ca-csr.json <<EOF { "CN": "Kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "Kubernetes", "OU": "CA", "ST": "Oregon" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca ls ca-key.pem ca.pem
Certificado Cliente Servidor
Vamos gerar os certificados de cliente e servidor para cada componente do Kubernetes e um certificado de cliente para o usuário administrador do Kubernetes
Certificado do Admin
cat > admin-csr.json <<EOF { "CN": "admin", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "system:masters", "OU": "Kubernetes The Hard Way", "ST": "Oregon" } ] } EOF cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes \ admin-csr.json | cfssljson -bare admin ls admin-key.pem admin.pem
Certificado do Cliente
O Kubernetes usa um modo de autorização de propósito especial denominado Node Authorizer, que autoriza especificamente as solicitações de API feitas pelo Kubelets. Para ser autorizado o Kubelets deve usar uma credencial que identifique os nós como estando no grupo system: nodes, com um nome de usuário system: node: nodeName. Vamos criar um certificado para cada worker do Kubernetes que atenda aos requisitos do autorizador de nó.
for i in 0 1 2; do instance="worker-${i}" instance_hostname="ip-10-0-1-2${i}" cat > ${instance}-csr.json <<EOF { "CN": "system:node:${instance_hostname}", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "system:nodes", "OU": "Kubernetes The Hard Way", "ST": "Oregon" } ] } EOF external_ip=$(aws ec2 describe-instances --filters \ "Name=tag:Name,Values=${instance}" \ "Name=instance-state-name,Values=running" \ --output text --query 'Reservations[].Instances[].PublicIpAddress') internal_ip=$(aws ec2 describe-instances --filters \ "Name=tag:Name,Values=${instance}" \ "Name=instance-state-name,Values=running" \ --output text --query 'Reservations[].Instances[].PrivateIpAddress') cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -hostname=${instance_hostname},${external_ip},${internal_ip} \ -profile=kubernetes \ worker-${i}-csr.json | cfssljson -bare worker-${i} done ls worker-0-key.pem worker-0.pem worker-1-key.pem worker-1.pem worker-2-key.pem worker-2.pem
Certificado dos Controllers
cat > kube-controller-manager-csr.json <<EOF { "CN": "system:kube-controller-manager", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "system:kube-controller-manager", "OU": "Kubernetes The Hard Way", "ST": "Oregon" } ] } EOF cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes \ kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager ls kube-controller-manager-key.pem kube-controller-manager.pem
Certificado Kube Proxy
cat > kube-proxy-csr.json <<EOF { "CN": "system:kube-proxy", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "system:node-proxier", "OU": "Kubernetes The Hard Way", "ST": "Oregon" } ] } EOF cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes \ kube-proxy-csr.json | cfssljson -bare kube-proxy ls kube-proxy-key.pem kube-proxy.pem
Certificado do Agendador
cat > kube-scheduler-csr.json <<EOF { "CN": "system:kube-scheduler", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "system:kube-scheduler", "OU": "Kubernetes The Hard Way", "ST": "Oregon" } ] } EOF cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes \ kube-scheduler-csr.json | cfssljson -bare kube-scheduler ls kube-scheduler-key.pem kube-scheduler.pem
Certificado da API
O endereço IP estático do kubernetes-the-hard-way será incluído na lista de nomes alternativos de assunto para o certificado do servidor da API Kubernetes. Isso garantirá que o certificado possa ser validado por clientes remotos.
cat > kubernetes-csr.json <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "Kubernetes", "OU": "Kubernetes The Hard Way", "ST": "Oregon" } ] } EOF cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -hostname=10.32.0.1,10.0.1.10,10.0.1.11,10.0.1.12,${KUBERNETES_PUBLIC_ADDRESS},127.0.0.1,kubernetes.default \ -profile=kubernetes \ kubernetes-csr.json | cfssljson -bare kubernetes ls kubernetes-key.pem kubernetes.pem
Certificado do Serviço
O Kubernetes Controller Manager usa um par de chaves para gerar e assinar tokens de conta de serviço.
cat > service-account-csr.json <<EOF { "CN": "service-accounts", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Portland", "O": "Kubernetes", "OU": "Kubernetes The Hard Way", "ST": "Oregon" } ] } EOF cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -profile=kubernetes \ service-account-csr.json | cfssljson -bare service-account ls service-account-key.pem service-account.pem
Distribuindo os Certificados Cliente Servidor (Workers)
Vamos copiar os certificados apropriados e as chaves privadas para cada instância do trabalhador:
for instance in worker-0 worker-1 worker-2; do external_ip=$(aws ec2 describe-instances --filters \ "Name=tag:Name,Values=${instance}" \ "Name=instance-state-name,Values=running" \ --output text --query 'Reservations[].Instances[].PublicIpAddress') scp -i kubernetes.id_rsa ca.pem ${instance}-key.pem ${instance}.pem ubuntu@${external_ip}:~/ done
Distribuindo os Certificados Cliente Servidor (Controllers)
for instance in controller-0 controller-1 controller-2; do external_ip=$(aws ec2 describe-instances --filters \ "Name=tag:Name,Values=${instance}" \ "Name=instance-state-name,Values=running" \ --output text --query 'Reservations[].Instances[].PublicIpAddress') scp -i kubernetes.id_rsa \ ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \ service-account-key.pem service-account.pem ubuntu@${external_ip}:~/ done