Home [K8S] Cluster Setup
Post
Cancel

[K8S] Cluster Setup

운영자 PC에 Kubernetes 환경 설정

1.1. kubectl 설치 (Mac 기준)

1
iMacPro:~$ brew install kubectl

1.2. Control Plane에 개발용 인증서 생성 (optional)

1
2
ubuntu@cplane:/etc/kubernetes/pki$ sudo openssl genrsa -out domain.com.ca.key 2048
ubuntu@cplane:/etc/kubernetes/pki$ sudo openssl req -x509 -new -nodes -key ./domain.com.ca.key -subj "/CN=domain.com" -addext "subjectAltName = DNS:domain.com,DNS:domain.com.default,DNS:domain.com.default.svc,DNS:domain.com.default.svc.cluster.local,DNS:cplane,IP:10.96.0.1,IP:172.31.x.x" -out domain.com.ca.crt

1.3. Control Plane에 클러스터 등록 (optional)

apiserver.crt 인증서를 사용하는 이유는, 클러스터와 통신한다는 것이 결국 apiserver와 통신을 의미하기때문이다. 따라서 apiserver의 인증서를 사용한다.

이 인증서를 위에서 만든 개발용 인증서로 사용하고 싶다면, kube-apiserver.yaml에서 -tls-cert-file과 -tls-private-key-file 옵션을 변경해줘야한다.

1
ubuntu@cplane:~$ k config set-cluster domain.com --server https://172.x.x.x:6443 --embed-certs --certificate-authority=/etc/kubernetes/pki/domain.com.ca.crt

1.4. 운영자 PC 호스트파일 변경

API Server의 인증서를 별도로 바꾸지 않고, 기본적으로 생성된 인증서(apiserver.crt)를 사용할 경우, Control Plane에서 apiserver.crt(/etc/kubernetes/pki/)를 다운로드 받은 후, 아래 명령으로 정보 확인. kubernetes API Server의 인증서로 kubernetes를 호스트로 요청 시에만 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
iMacPro:~$ openssl x509 -in ./apiserver.crt -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        ...
        Issuer: CN = kubernetes
        ...
        X509v3 extensions:
            ...
            X509v3 Subject Alternative Name:
                DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:cplane, IP Address:10.96.0.1, IP Address:172.x.x.x
    Signature Algorithm: sha256WithRSAEncryption
    ...

아래와 같이 운영자 PC의 호스트 파일에 kubernetes를 아래와 같이 등록하여 사용하면 된다.

1
2
3
4
/etc/hosts
...
13.x.x.x  kubernetes
...

1.5. 운영자 PC에 클러스터 등록

1
iMacPro:~$ k config set-cluster domain.com --server https://kubernetes:6443 --embed-certs --certificate-authority=./apiserver.crt

개발자(운영) 계정 추가

운영자 계정으로, Dev,Stg,Prod Namespace에서 동시에 사용할 예정

2.1. 개발자 계정 인증서 생성

1
2
3
4
5
ubuntu@cplane:~/domain$ openssl genrsa -out domain-ops.key 2048
ubuntu@cplane:~/domain$ openssl req -new -key domain-ops.key -out domain-ops.csr
...
Common Name (e.g. server FQDN or YOUR name) []:**domain-ops**
...

2.2. CSR 생성

1
2
3
4
5
6
7
8
9
10
11
ubuntu@cplane:~/domain$ cat ./domain-ops.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: domain-ops
spec:
  request: LS0tLS1CRU...  # cat ./domain-ops.csr | base64 | tr -d "\n" 
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
ubuntu@cplane:~/domain$ k apply -f ./domain-ops.yaml

2.3. CSR 승인

1
2
3
4
5
6
7
ubuntu@cplane:~/domain$ k get csr
NAME        AGE   SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITION
domain-ops   5s    kubernetes.io/kube-apiserver-client   kubernetes-admin   <none>              **Pending**
ubuntu@cplane:~/domain$ k certificate approve domain-ops
ubuntu@cplane:~/domain$ k get csr
NAME        AGE     SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITION
domain-ops   2m34s   kubernetes.io/kube-apiserver-client   kubernetes-admin   <none>              **Approved,Issued**

2.4. 인증서 추출

1
ubuntu@cplane:~/domain$ k get csr domain-ops -o jsonpath='{.status.certificate}' | base64 -d > domain-ops.crt

2.5. 개발자 계정 kubeconfig에 등록

1
ubuntu@cplane:~/domain$ k config set-credentials domain-ops --client-key ./domain-ops.key --client-certificate ./domain-ops.crt --embed-certs=true

2.6. 운영자PC에 개발자 계정 등록. 위에서 만든 사용자 키, 인증서는 서버로부터 다운로드 받아온다.

1
iMacPro:~$ k config set-credentials domain-ops --client-key ./domain-ops.key --client-certificate ./domain-ops.crt --embed-certs=true

2.7. 운영자PC에 컨텍스트 생성

1
iMacPro:~$ k config set-context domain-ops@domain.com --cluster domain.com --user domain-ops

운영자 PC에 최종. 추가된 클러스터, 사용자, 컨텍스트 정보

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
iMacPro:~$ k config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://kubernetes:6443
  name: domain.com
...
contexts:
...
- context:
    cluster: domain.com
    user: domain-ops
  name: domain-ops@domain.com
current-context: domain-ops@domain.com
kind: Config
preferences: {}
users:
...
- name: domain-ops
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

개발자(운영) 계정 RBAC 추가

3.1. 개발자(운영)에게 필요한 role 확인

우선, 모든 권한을 부여해주자.

1
ubuntu@cplane:~$ k create clusterrolebinding domain-ops --clusterrole cluster-admin --user domain-ops

클러스터, 리소스별 권한은 차차 부여하기로 한다.

This post is licensed under CC BY 4.0 by the author.