728x90

CKA 시험을 좀 더 편하고 빠르게 볼 수 있기 위한 터미널 환경 세팅

일부 문제는 ssh를 통해 다른 노드로 접근해야 하는데, 이 경우 해당 세팅이 유지되진 않는 점을 참조해야 합니다.

 

 

CKA 시험에 이미 설정되어 있는 부분

alias

alias k=kubectl

https://kubernetes.io/docs/reference/kubectl/cheatsheet/

Vim

~/.vimrc

set tabstop=2

set expandtab

set shiftwidth=2

추가 설정

빠르게 yaml 파일로 저장하기

export do="--dry-run=client -o yaml"

ex) k run pod1 --image=ngnix $do

빠르게 pod 삭제하기

export now="--force --grace-period 0"

ex) k delete pod1 $now

Namespace 줄이기

alias kn='kubectl config set-context --current --namespace '

ex) kn default # default ns로 세팅

기타

history 명령어를 통해 썼던 명령어 확인하기

또는 Ctrl r

명령어를 치고 대기해야 하는 경우, Ctrl z를 사용하여 작업을 백그라운드에 배치

fg 명령어를 통해 다시 가져올 수 있음

Vim 단축키

줄 번호 붙이기

:set nu

복사, 붙여넣기, 잘라내기

라인 표시: Esc+V

복사: y

잘라내기: d

붙여넣기: p

728x90
728x90

쿠버네티스 대시보드

관련 문서

쿠버네티스 대시보드 설치 자체는 금방 끝난다. 편리하게 GUI를 이용해 보도록 하자.

 

1. 대시보드 적용

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

 

1.5 원격으로 서버에 접속하고 있다면, kubernetes-dashboard service의 yaml 변경이 필요하다.

kubectl edit services kubernetes-dashboard -n kubernetes-dashboard

해당 명령어를 통해 수정이 가능하다. 아랫쪽에 있는 type을 ClusterIP에서 NodePort로 변경하면 된다.

apiVersion: v1
kind: Service
  ...
spec:
  ports:
  - nodePort: 31116
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort
[root@master ~]#  kubectl get services -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.102.33.100   <none>        8000/TCP        17h
kubernetes-dashboard        NodePort    10.108.90.43    <none>        443:31116/TCP   17h

수정된 것을 확인하면 TYPE이 NodePort로 변경되었다. 마스터노드IP:노드포트(31116)으로 접속 가능하다.

해당 과정을 거치지 않고 원격지에서 마스터 노드 IP를 통해 대시보드에 접속하면 보안 문제로 토큰 입력이 불가능하다.

 

2. 대시보드 접속 활성화

kubectl proxy

프록시를 활성화 했다면 다음 링크로 대시보드 접근이 가능하다. http://localhost:8001/

1-5 단계를 거친 경우 https://마스터노드IP:NodePort 로 접속 가능하다.

 

3. 접속 방법

해당 주소로 접속하면, 다음과 같은 창이 뜬다.

 

4. 토큰 생성 방법

Serviceaccount는 kubectl get serviceaccount 명령어로 확인이 가능하지만, 권한이 없어 대시보드에 접근해도 아무것도 볼 수 없는 상태다. 그러므로 권한을 가지고 있는 어카운트를 만들어 보도록 하자. 대시보드 네임스페이스에 admin-user 어카운트를 만들어 준다.

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF
[root@master ~]# kubectl get serviceaccounts -n kubernetes-dashboard
NAME                   SECRETS   AGE
admin-user             1         65s
default                1         19h
kubernetes-dashboard   1         19h

 

만들고 권한을 생성해 준다. cluster-admin이라는 role이 모든 권한을 가지고 있다.

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: admin-user
    namespace: kubernetes-dashboard
EOF
[root@master ~]# kubectl get clusterrolebinding admin-user
NAME         ROLE                        AGE
admin-user   ClusterRole/cluster-admin   45s

 

그런 다음 토큰을 가져온다.

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

[root@master ~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-s6pvq
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1099 bytes
namespace:  20 bytes
token:      블라블라

 

제일 아래의 토큰 값을 기입해 주면, 접속 완료! 모든 권한을 가지고 있다.

728x90
728x90

컨테이너 오케스트레이션

컨테이너 오케스트레이션은 컨테이너를 사용하는 라이프사이클을 자동화한다. 쿠버네티스 뿐만 아니라, 도커의 swarm이나 미니 쿠버 등 여러 종류가 존재한다.

다음은 CentOS7, 8에서 Kubernetes 1.22.5 버전을 설치하는 방법이다. 따라만 하면 다 된다!

공식 설치 가이드

 

쿠버네티스 설치 순서

설치 전 사전 작업 (모든 노드 공통)

yum update -y 후 systemctl 명령어가 안 먹는다면 다음 명령어 입력 kill -TERM 1

 

1. Linux Hostname 변경

Control plane(이하 마스터) 노드와 Worker 노드들의 Linux hostname을 각각 다르게 변경해 준다. 호스트 네임이 같을 경우, 설치에 문제가 생길 수 있다.

hostnamectl set-hostname [사용할 호스트명]

테스트 환경 내역

Hostname IP
master 10.100.31.110
worker1 10.100.31.111
worker2 10.100.31.112
worker3 10.100.31.113

다 변경했다면, 본인의 환경에 맞추어 /etc/hosts 파일을 편집해 준다.

cat <<EOF >> /etc/hosts
10.100.31.110 master
10.100.31.111 worker1
10.100.31.112 worker2
10.100.31.113 worker3
EOF

 

2. Swap 비활성화

kubelet이 제대로 작동하게 하려면 반드시 swap을 사용하지 않도록 설정해야 한다. swap은 메모리 내부 공간이 부족할 경우 하드 디스크의 공간을 메모리 역할로 활용하는 기술이다. 1.21 버전까지는 swap 메모리 사용을 지원하지 않았으나, 1.22 버전에서 swap memory를 사용할 수 있도록 지원이 추가되었으나, 아직 정식 출시되지 않았기 때문에 꺼 주기로 하자. 관련 문서

swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

 

3. iPtable 트래픽 설정

리눅스 커널의 iptables가 브리지된 트래픽을 볼 수 있도록 커널을 수정해 준다. iptables와 netfilter의 작동 원리를 알면 좋다.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

lsmod | grep br_netfilter 명령어를 통해 br_netfilter 모듈이 로드되었는지 확인할 수 있다. 로드되지 않았다면 modprobe br_netfilter 명령어를 쳐 보자.

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

sysctl 구성에서 net.bridge.bridge-nf-call-iptables가 1로 설정되어 있는지도 확인해야 한다.

 

4. 방화벽 확인

별도 방화벽이 존재할 경우 firewall을 disable 해 준다. 필수로 열어야 하는 포트는 미리 확인 후 오픈이 필요하다. 관련 포트

systemctl stop firewalld 
systemctl disable firewalld

 

5. SELinux permissive mode로 변경

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

리눅스의 보안 관련 설정을 꺼 준다. getenforce 명령어로 확인 가능하다.

 

6. Docker 설치

이전 게시글을 참고해서 모든 노드에 Docker 설치해 준다.

 

kubeadm, kubelet, kubectl 설치

* kubeadm: 클러스터를 부트스트랩하는 명령
* kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트
* kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티

 

1. kubernetes 설치를 위한 리포지토리 설정

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

 

2. 1.22.5 버전 설치

다른 버전 설치시 숫자만 바꿔 주면 된다.

sudo yum install -y kubelet-1.22.5 kubeadm-1.22.5 kubectl-1.22.5 --disableexcludes=kubernetes

최신 버전은 아래의 명렁어로 설치하면 된다. 다만 안정성을 위해 추천하지 않는다.

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

 

3. 서비스 실행

sudo systemctl enable --now kubelet
sudo systemctl start kubelet
sudo systemctl status kubelet
# 참고: 서비스에 등록하고 실행하려면
systemctl daemon-reload
systemctl restart kubelet
systemctl enable kubelet

 

4. cgroup driver 설정

그냥 설치하게 되면 도커에서 사용하는 cgroup manager과 쿠버네티스에서 사용하는 게 다르기 때문에 충돌이 생긴다. 도커는 기본적으로 cgroupfs를 사용하고, 쿠버네티스는 systemd를 사용한다. docker의 config 파일을 수정해서 해결하는 방법과, k8s의 yaml을 파일로 우회하는 방법이 있다. 여기에서는 docker의 config 파일을 수정해 주겠다. 관련 문서

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

설정을 마쳤으면, docker를 다시 시작해 준다.

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

 

kubeadm으로 클러스터 생성

설치가 완료되었다면, 클러스터를 구성한다. 관련 문서

 

1. 마스터 노드에서 초기화 실행

컨트롤 플래인 컴포넌트가 작동하기 위해 초기화를 해 준다. 필요에 따라 관련 문서에서의 선택 옵션들을 추가해 준다. 기본 명령어는 아래와 같으나, 아래 명령어는 반드시 마스터 노드에서만 실행한다.

kubeadm init

혹시나 해당 명령어를 워커 노드에서 실행하였거나, 초기화가 제대로 안 되었을 시 다음 명령어로 리셋이 가능하다.

kubeadm reset

 

정상적으로 초기화를 마치면 하단에 다음과 같은 명령어가 뜬다.

더보기
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  /docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

특히 마지막 줄은 worker node에서 클러스터에 join할 수 있는 token값이 포함된 명령어인데, 이를 파일로 저장해 두면 좋다. 해당 토큰은 24시간 동안 유효하며, 노드 중설 시에는 토큰을 새로 생성해야 한다.

워커 노드에서 클러스터에 조인하는 명령어는 다음과 같다.

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

 

2. 마스터 노드에서 kubectl 명령어를 사용하기 위한 설정

Linux의 root에서 실행시 아래처럼 환경 변수에 등록해 준다.

export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

일반 유저 사용 시에는 권한 설정이 필요하다.

# ex) guru 계정에서 kubectl 명령어 사용 권한을 줄 때
mkdir -p ~guru/.kube
sudo scp master:/etc/kubernetes/admin.conf ~guru/.kube/config
sudo chown guru:guru ~guru/.kube/config

 

3. 마스터 노드에서 CNI 설치

CNI(Container Network Interface)는 Pod가 생성, 삭제될 때 호출되는 API의 규격과 인터페이스 등을 정의한다. 호스트에 VxLAN 생성 Overlay Network 구성, 호스트마다 IP, Subnet을 할당해 주고 Pod ID 부여해 주는 등 많은 역할을 한다.

CNI에는 플라넷, 위브넷, 칼리코 등이 있는데 각 환경에 맞는 CNI를 선택하여 사용하면 된다.

 

참고) centos8에서 Trident를 설치 시 CNI를 calico로 설치하면 오류난다. weave net으로 설치했을 시 정상 작동하였다.

 

* calico 설치 관련 문서

curl https://docs.projectcalico.org/manifests/canal.yaml -O
kubectl apply -f canal.yaml

* weave net 설치 관련 문서

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

CNI 설치 후 /etc/cni/net.d에서 CNI config 파일 확인이 가능하다.

 

 

4. 워커 노드에서 cluster join

초기화 후 저장해 두었던 kubeadm join 명령어를 각 워커 노드에서 실행한다.

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

 

설치가 완료되었다면 다음 명령어로 클러스터 구성이 제대로 되었는지 확인 가능하다. Ready 상태면 정상적으로 클러스터 구성도 완료된 것이다.

[root@master /]# kubectl get nodes
NAME      STATUS   ROLES                  AGE    VERSION
master    Ready    control-plane,master   125m   v1.22.5
worker1   Ready    <none>                 117m   v1.22.5
worker2   Ready    <none>                 117m   v1.22.5
worker3   Ready    <none>                 117m   v1.22.5

[root@master /]# kubectl cluster-info
Kubernetes control plane is running at https://10.100.31.110:6443
CoreDNS is running at https://10.100.31.110:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

 

Shell 자동 완성 활성화

명령어를 칠 때 tap 키를 통해 자동 완성을 하기 위해서는 패키지를 설치해야 한다. 관련 문서

yum install bash-completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
kubectl completion bash >/etc/bash_completion.d/kubectl
728x90