CFSSL 로 Kubernetes API 계정 생성하기

리눅스/PaaS|2024. 5. 14. 12:00
반응형

Kubernetes API 계정은 여러가지 방법으로 생성 가능하지만, 여기에서는 CFSSL 로 생성하는 방법을 다루었습니다.

 

 

1. CFSSL 설치

 

CFSSL 은 CloudFlare 에서 개발한 오픈 소스 도구로, 인증서와 인증 기관 (Certificate Authority, CA) 을 관리하기 위한 도구입니다.

CFSSL 명령 바이너리 파일을 다운로드 받습니다.

# CFSSL_VERSION="1.6.5"
# curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl_${CFSSL_VERSION}_linux_amd64" -o cfssl
# curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssljson_${CFSSL_VERSION}_linux_amd64" -o cfssljson
# curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl-certinfo_${CFSSL_VERSION}_linux_amd64" -o cfssl-certinfo

 

파일에 실행권한을 주고 적절한 디렉토리로 이동 시킵니다.

# chmod +x cfssl*
# mv cfssl* /usr/local/bin/

 

설치된 CFSSL 버전을 확인합니다.

# cfssl version
Version: 1.6.5
Runtime: go1.22.0

 

 

2. 사용자 생성

 

공식 Document 참고 : https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/

 

아래와 같이 Kubernetes API 에 접근할 계정 (sysdocu) 의 key 및 csr 파일을 생성합니다.

예제에서는 계정에 색상을 더했습니다. 다른 계정으로 사용할 분은 이름을 바꿔서 사용하시면 됩니다.

# openssl req -new -newkey rsa:4096 -nodes -keyout sysdocu.key -out sysdocu.csr -subj "/CN=sysdocu"

 

# cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: sysdocu
spec:
  groups:
  - system:authenticated
  request: $(cat sysdocu.csr | base64 | tr -d '\n')
  signerName: kubernetes.io/kube-apiserver-client
  usages:
    - client auth
EOF

 

CSR 을 생성하면 승인 대기 상태가 되므로, 아래와 같이 추가 명령으로 승인을 해주어야 합니다.
# kubectl certificate approve sysdocu

승인 (Approved) 은 되었는데, 발행 (Issued) 까지 되지 못한 경우에는 아래 작업을 계속 이어서 진행합니다.

# kubectl get csr
NAME      AGE    SIGNERNAME                            REQUESTOR   REQUESTEDDURATION   CONDITION
sysdocu   106m   kubernetes.io/kube-apiserver-client   admin       <none>              Approved

이제 CFSSL 을 이용하여 인증서를 발급받아야 합니다.

# cat <<EOF | cfssl gencert -initca - | cfssljson -bare ca
{
  "CN": "sysdocu",
  "key": {
    "algo": "rsa",
    "size": 4096
  }
}
EOF
2024/03/15 11:00:36 [INFO] generating a new CA key and certificate from CSR
2024/03/15 11:00:36 [INFO] generate received request
2024/03/15 11:00:36 [INFO] received CSR
2024/03/15 11:00:36 [INFO] generating key: rsa-4096
2024/03/15 11:00:37 [INFO] encoded CSR
2024/03/15 11:00:37 [INFO] signed certificate with serial number 540868796268120255911872831281879045817461391444

 

# vi server-signing-config.json

{
    "signing": {
        "default": {
            "usages": [
                "client auth"
            ],
            "expiry": "876000h",
            "ca_constraint": {
                "is_ca": false
            }
        }
    }
}

 

# kubectl get csr sysdocu -o jsonpath='{.spec.request}' | \
  base64 --decode | \
  cfssl sign -ca ca.pem -ca-key ca-key.pem -config server-signing-config.json - | \
  cfssljson -bare ca-signed-server
2024/03/15 11:02:49 [INFO] signed certificate with serial number 559793821146666936971756884293966902391849545829

 

인증서가 생성되었습니다.
# ls -al ca-signed-server.pem
-rw-r--r-- 1 root root 1172 Mar 15 11:02 ca-signed-server.pem

 

CSR 에 서명된 인증서를 입력합니다.
# kubectl get csr sysdocu -o json | \
  jq '.status.certificate = "'$(base64 ca-signed-server.pem | tr -d '\n')'"' | \
  kubectl replace --raw /apis/certificates.k8s.io/v1/certificatesigningrequests/sysdocu/status -f -

(결과 생략)


이제 CSR 에 인증서가 발행된 것을 확인할 수 있습니다.
# kubectl get csr -A
NAME      AGE    SIGNERNAME                            REQUESTOR   REQUESTEDDURATION   CONDITION
sysdocu   110m   kubernetes.io/kube-apiserver-client   admin       <none>              Approved,Issued

 

반응형

댓글()

K3S 설치 및 삭제, Worker node 추가 및 삭제

반응형

K3S 를 설치하고 삭제하는 방법과 노드가 부족하거나 여러대로 클러스터를 구성하기 위해 사용하는 방법입니다.

아래는 마스터 노드와 워커 노드에서 사용하는 명령을 정리하였으므로 잘 구분해서 실행하시기 바랍니다.

 

 

1. K3S 설치 

 

(마스터 노드에서)

# curl -sfL https://get.k3s.io | sh -s - --disable traefik --write-kubeconfig-mode 644

# export KUBECONFIG="/etc/rancher/k3s/k3s.yaml"

 

앞으로 SSH 접속시마다 자동으로 환경이 로드 되도록 하면 편리합니다.

# echo 'export KUBECONFIG="/etc/rancher/k3s/k3s.yaml"' >> ~/.bashrc

 

 

2. K3S 삭제

 

(마스터 노드에서)

자동 삭제 스크립트를 이용해 삭제 합니다.
# /usr/local/bin/k3s-uninstall.sh

삭제가 안된 부분이 있을 수 있으므로 수동으로 추가 삭제 명령을 내립니다.
# systemctl stop k3s

# systemctl disable k3s
# rm -rf /etc/rancher/k3s
# rm -rf /var/lib/rancher/k3s
# rm -f /usr/local/bin/k3s
# rm -f /usr/local/bin/kubectl
# rm -f /usr/local/bin/crictl
# rm -f /usr/local/bin/ctr

서비스를 제거 합니다.
# systemctl daemon-reload

 

 

3. Worker node 추가

 

(마스터 노드에서)

# cat /var/lib/rancher/k3s/server/node-token

 

(워커 노드에서)

# curl -sfL https://get.k3s.io| K3S_URL=https://<SERVER_IP>:6443 K3S_TOKEN=<TOKEN> sh -

여기에서 Master node 서버 IP 와 출력되었던 토큰을 대체 입력해야 합니다.

 

이제 추가 한 Worker node 가 연결된 것을 확인 할 수 있습니다.

# kubectl get nodes

 

 

4. Worker node 삭제

 

(워커 노드에서)
# systemctl stop k3s-agent
# systemctl disable k3s-agent
# /usr/local/bin/k3s-agent-uninstall.sh
# rm -rf /etc/rancher/k3s
# rm -rf /var/lib/rancher/k3s

 

(마스터 노드에서)
# kubectl delete node <NODE_NAME>

 

반응형

댓글()