[Kubernetes/PKOS2] 약간의 kops 설명과 lens 접속
가시다님의 스터디 PKOS(Production Kubernetes Online Study)를 시작하게 되었다!
PKOS 스터디는 ‘24단계 실습으로 정복하는 쿠버네티스’ 책 내용을 기반으로 진행된다 😊
본 스터디는 kops (Kubernetes Operations) 도구를 통해 AWS에서 k8s 클러스터를 구축, 관리, 운영하게 된다
k8s 프로비저닝 도구
클러스터 프로비저닝 도구로는 Kops, Kubespray, Kubeadm, Minikube 등이 있는데 각각의 장단점이 달라서 자신의 유스케이스에 따라 도구를 선택하면 된다.
Kops | Kubespray | Kubeadm | Minikube | |
---|---|---|---|---|
? | AWS 최적화 | Ansible 기반, 멀티클라우드 지원 | kubernetes에서 제공하는 기본적인 도구 | 로컬 개발 및 테스트용 |
node | 멀티노드 | 멀티노드 | 멀티노드 | 단일노드 |
setup | kops | kubespary | kubeadm | minikube |
kops와 kubespary는 운영 차원에서 간편하게 클러스터를 관리할 수 있는 자동화 도구이고,
kubeadm은 클러스터를 부트스트랩하는 도구로 클러스터 구축할 때 간편하지는 않다.
minikube는 말그대로 테스트 용도로만 적합하다.
kops로 aws에서 k8s 클러스터 구축
그림 출처 ) 가시다님 노션 제공
위 실습 구성도대로 클러스터를 구축했다
kops-ec2
: 배스천 서버로, kops를 설치하여 클러스터를 구축하고 kubectl 명령을 수행s3
: k8s 설정 파일 저장- 버전 : k8s v1.24.10, OS Ubuntu 20.04 LTS
- Control Plane과 Node는 EC2 Auto Scaling Group(=ASG) 설정으로 구성
- 퍼블릭 도메인 구매하여 사용
생성된 kubeconfig로 lens 접속
kops로 클러스터 구축하는 과정은 생략하겠다…(ㅎㅎ)
kops로 클러스터를 구축하면서 kubeconfig는 자동으로 생성되었다
[root@kops-ec2 ~]# cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: [certificate-authority-data]
server: https://api.yooga.in
name: yooga.in
contexts:
- context:
cluster: yooga.in
user: yooga.in
name: yooga.in
current-context: yooga.in
kind: Config
preferences: {}
users:
- name: yooga.in
user:
client-certificate-data: [client-certificate-data]
client-key-data: [client-key-data]
그래서 이 kubeconfig로 lens 접속하려 하니,,
분명 클러스터를 구축한 당시에는 kops-ec2(배스천서버) → k8s api server로 접근이 됐었는데,,,
kubeconfig 다운받으려니 갑자기 아래와 같이 권한이 없다는 에러를 뱉는다.
[root@kops-ec2 ~]# kubectl get nodes -v6
I0325 16:08:13.665555 13638 loader.go:373] Config loaded from file: /root/.kube/config
I0325 16:08:13.740641 13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 74 milliseconds
E0325 16:08:13.740943 13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
I0325 16:08:13.740960 13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
I0325 16:08:13.742184 13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 1 milliseconds
E0325 16:08:13.742397 13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
I0325 16:08:13.742410 13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
I0325 16:08:13.742435 13638 shortcut.go:100] Error loading discovery information: the server has asked for the client to provide credentials
I0325 16:08:13.743416 13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 0 milliseconds
E0325 16:08:13.743623 13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
I0325 16:08:13.743635 13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
I0325 16:08:13.784823 13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 41 milliseconds
E0325 16:08:13.785080 13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
I0325 16:08:13.785094 13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
I0325 16:08:13.786286 13638 round_trippers.go:553] GET https://api.yooga.in/api?timeout=32s 401 Unauthorized in 1 milliseconds
E0325 16:08:13.786514 13638 memcache.go:265] couldn't get current server API group list: the server has asked for the client to provide credentials
I0325 16:08:13.786527 13638 cached_discovery.go:120] skipped caching discovery info due to the server has asked for the client to provide credentials
I0325 16:08:13.786667 13638 helpers.go:246] server response object: [{
"metadata": {},
"status": "Failure",
"message": "the server has asked for the client to provide credentials",
"reason": "Unauthorized",
"details": {
"causes": [
{
"reason": "UnexpectedServerResponse",
"message": "unknown"
}
]
},
"code": 401
}]
error: You must be logged in to the server (the server has asked for the client to provide credentials)
(원래 admin 권한이었을거같지만) admin 권한으로 다시 kubeconfig를 생성하고 확인해 보면
참고 문서 ) Kops export kubeconfig - kOps - Kubernetes Operations
[root@kops-ec2 ~]# kops export kubeconfig --name yooga.in --admin
kOps has set your kubectl context to yooga.in
[root@kops-ec2 ~]# cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: [certificate-authority-data]
server: https://api.yooga.in
name: yooga.in
contexts:
- context:
cluster: yooga.in
user: yooga.in
name: yooga.in
current-context: yooga.in
kind: Config
preferences: {}
users:
- name: yooga.in
user:
client-certificate-data: [client-certificate-data]
client-key-data: [client-key-data]
users.user
에서 client-certificate-data
, client-key-data
이 두 가지 값이 바뀌었다.
그리고 k8s에 접근도 잘된다.
[root@kops-ec2 ~]# kubectl cluster-info
Kubernetes control plane is running at https://api.yooga.in
CoreDNS is running at https://api.yooga.in/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'
이제 이 kubeconfig로 lens에 접속! 후후
+) kops export kubeconfig duration
kops export kubeconfig하면 기본 18h
로 duration이 잡혀 있어서 그 이후엔 크레덴셜이 만료되고 Unauthorized
에러가 발생한다.
공식 문서 참고 ) Kops export kubeconfig - kOps - Kubernetes Operations
kops export kubecfg --admin=87600h
이 때 위와 같은 값을 넣어주면 10년이나 더 쓸 수 있다 ㅋㅋ
Leave a comment