Nesse lab você irá provisionar uma Infraestrutura PKI (Infraestrutura de Chave Privada) utilizando o toolkit da CloudFare, cfssl e então utilizá-la para subir uma Autoridade Certificadora e gerar certificados TLS para os seguintes componentes: etcd, kube-apiserver, kubelet e kube-proxy.
Nessa seção você irá provisionar uma Autoridade Certificadora que pode ser utilizada para gerar certificados TLS adicionais.
Crie o arquivo de configuração da CA:
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
EOF
Crie a requisição de assinatura do certificado da CA:
cat > ca-csr.json <<EOF
{
"CN": "Kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "Kubernetes",
"OU": "CA",
"ST": "Oregon"
}
]
}
EOF
Gere o certificado da CA e a chave privada:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
Resultados:
ca-key.pem
ca.pem
Nessa seção você irá gerar os certificados de cliente e servidor para cada um dos componentes do Kubernetes e um certificado de cliente para o usuário admin
do Kubernetes.
Crie a requisição de assinatura do certificado de cliente 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
Gere o certificado de cliente e a chave privada do admin
:
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
admin-csr.json | cfssljson -bare admin
Resultados:
admin-key.pem
admin.pem
Kubernetes utiliza um [modo de autorização de "propósito especial"] (https://kubernetes.io/docs/admin/authorization/node/) chamado Node Authorizer (Autorizador de Nó), que autoriza especificamente requisições de API feitas pelos Kubelets. Para serem autorizados pelo Autorizador de Nó, os Kubelets devem utilizar uma credencial que os identifiquem como parte do grupo system:nodes
, com um usuário parte de system:node:<nomeDoNó>
. Nessa seção você irá criar um certificado para cada worker do Kubernetes que atenda aos requisitos do Autorizador de Nós.
Gere um certificado e uma chave privada para cada nó worker do Kubernetes:
for instance in worker-0 worker-1 worker-2; do
cat > ${instance}-csr.json <<EOF
{
"CN": "system:node:${instance}",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "system:nodes",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
EOF
EXTERNAL_IP=$(gcloud compute instances describe ${instance} \
--format 'value(networkInterfaces[0].accessConfigs[0].natIP)')
INTERNAL_IP=$(gcloud compute instances describe ${instance} \
--format 'value(networkInterfaces[0].networkIP)')
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-hostname=${instance},${IP_EXTERNO},${IP_INTERNO} \
-profile=kubernetes \
${instance}-csr.json | cfssljson -bare ${instance}
done
Resultados:
worker-0-key.pem
worker-0.pem
worker-1-key.pem
worker-1.pem
worker-2-key.pem
worker-2.pem
Crie a requisição de assinatura do certificado de cliente 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
Gere o certificado de cliente e a chave privada do kube-proxy
:
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
kube-proxy-csr.json | cfssljson -bare kube-proxy
Resultados:
kube-proxy-key.pem
kube-proxy.pem
O endereço estático de IP do kubernetes-the-hard-way
será incluído na lista de nomes de sujeitos alternativos para o certificado do Servidor de API do Kubernetes. Isso irá garantir que o certificado possa ser validado por clientes remotos.
Recupere o endereço de IP estático do kubernetes-the-hard-way
:
KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \
--region $(gcloud config get-value compute/region) \
--format 'value(address)')
Crie a requisição de assinatura do certificado do Servidor de API do Kubernetes:
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
Gere o certificado e a chave privada do Servidor de API do Kubernetes:
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-hostname=10.32.0.1,10.240.0.10,10.240.0.11,10.240.0.12,${KUBERNETES_PUBLIC_ADDRESS},127.0.0.1,kubernetes.default \
-profile=kubernetes \
kubernetes-csr.json | cfssljson -bare kubernetes
Resultados:
kubernetes-key.pem
kubernetes.pem
Copie os certificados e chaves privadas apropriadas para cada instância de worker:
for instance in worker-0 worker-1 worker-2; do
gcloud compute scp ca.pem ${instance}-key.pem ${instance}.pem ${instance}:~/
done
Copie os certificados e chaves privadas apropriadas para cada instância de controladora:
for instance in controller-0 controller-1 controller-2; do
gcloud compute scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem ${instance}:~/
done
Os certificados de cliente do
kube-proxy
e dokubelet
serão utilizados para gerar arquivos de configuração para autenticação de clientes no próximo lab.
Próximo: Gerando Arquivos de Configuração do Kubernetes para Autenticação