반응형

kubernetes   yaml 분석

#apiVersion: 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전 설정.
apiVersion: apps/v1
#kind: 어떤 종류의 오브젝트를 생성하는지 설정.
#Deployment: ReplicaSet 을 관리하는 controller.
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: tuba-metric-collector #Deployment의 label
  name: tuba-metric-collector #Deployment의 이름
  namespace: dev
#spec: 각 컴포넌트에 대한 자세한 설명과 어떤 오브젝트 종류인지에 따른 내용 설정.
spec:
	#replicas: 유지하고자 하는 Pod 의 갯수.
  replicas: 2
	#selector: 관리하고자 하는 Pod 를 선택.
  selector:
    matchLabels:
      app: tuba-metric-collector
  strategy: {}
	#template: 관리되고자 하는 Pod 에 대해 정의하는 필드.
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: tuba-metric-collector
    spec:
      containers:
      - image: harbor.vista.astellu.com/tuba-dev/tuba-metric-collector:latest
        imagePullPolicy: Always
        name: tuba-metric-collector
        ports:
        - containerPort: 8080
        resources: {}

        env:
        - name: TUBA_SETTING_FILENAME
          value: "setting.yml"
        - name: TUBA_KAFKA_CONSUMER_TOPIC
          value: "tuba-meta-topic"
        - name: TUBA_KAFKA_CONSUMER_GROUP
          value: "oper2-mc-netapp"
        - name: TUBA_KAFKA_CONSUMER_EXPIRYTIME
          value: "120000"
      imagePullSecrets:
        - name: harbor
#status: 쿠버네티스가 자동으로 생성, 자신이 원하는 상태가 되도록 현재 상태를 설정.
status: {}
---
apiVersion: v1
kind: Service
metadata:
  name: tuba-metric-collector
  namespace: dev
spec:
  selector:
    app: tuba-metric-collector
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 32008
  type: NodePort
반응형

'Kubernetes' 카테고리의 다른 글

Pod에 붙어 있는 PV 확인  (0) 2024.09.11
kubectl 자동 완성  (0) 2024.09.06
kubernetes cluster 재설정  (1) 2024.06.30
Ubuntu 20.04 Kubernetes cluster 구축 방법  (1) 2024.06.30
반응형

Pod에 붙어 있는 PV 확인

 

$ kubectl describe pod "파드 이름" -n "namespace"

# Mounts 부분을 확인하면 어떤 디렉토리가 pv인지 확인 할 수 있다.
반응형

'Kubernetes' 카테고리의 다른 글

kubernetes yaml 분석  (1) 2024.10.07
kubectl 자동 완성  (0) 2024.09.06
kubernetes cluster 재설정  (1) 2024.06.30
Ubuntu 20.04 Kubernetes cluster 구축 방법  (1) 2024.06.30
반응형

kubectl 자동 완성

*현재 조건

  • Mac m1
  • kubectl 설치 완료
  • oh-my-zsh 사용
$ source <(kubectl completion zsh)  # 현재 셸에 zsh의 자동 완성 설정
$ echo "[[ $commands[kubectl] ]] && source <(kubectl completion zsh)" >> ~/.zshrc # 자동 완성을 zsh 셸에 영구적으로 추가한다.
$ echo "[[ $commands[kubectx] ]] && source <(kubectx $ZSH/custom/completions zsh)" >> ~/.zshrc

echo "fpath=($ZSH/custom/completions $fpath)" >> ~/.zshrc
$ cd ~/.oh-my-zsh/custom/plugins/

# zsh-autosuggestions 플러그인 
$ git clone https://github.com/zsh-users/zsh-autosuggestions

# zsh-syntax-highlighting 플러그인
$ git clone https://github.com/zsh-users/zsh-3syntax-highlighting.git

# plugin 활성화 plugins 항목에 다음것들을 추가해주면 된다.
$ vi ~/.zshrc
plugins=(git zsh-syntax-highlighting zsh-autosuggestions kubectl kube-ps1)
반응형

'Kubernetes' 카테고리의 다른 글

kubernetes yaml 분석  (1) 2024.10.07
Pod에 붙어 있는 PV 확인  (0) 2024.09.11
kubernetes cluster 재설정  (1) 2024.06.30
Ubuntu 20.04 Kubernetes cluster 구축 방법  (1) 2024.06.30
반응형

- Worker Node

sudo kubeadm reset
sudo rm -rf /etc/cni/net.d
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t raw -F
sudo iptables -t raw -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo ipvsadm --clear
rm $HOME/.kube/config


# 만약 cache가 있으면 cache도 제거

 

 

- Master Node

sudo kubeadm reset

sudo rm -rf /etc/cni/net.d
sudo rm -rf /var/lib/etcd
sudo rm -rf ~/.kube

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

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

curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml -o calico.yaml
kubectl apply -f calico.yaml
반응형

'Kubernetes' 카테고리의 다른 글

kubernetes yaml 분석  (1) 2024.10.07
Pod에 붙어 있는 PV 확인  (0) 2024.09.11
kubectl 자동 완성  (0) 2024.09.06
Ubuntu 20.04 Kubernetes cluster 구축 방법  (1) 2024.06.30
반응형

 

1. OS 정보 확인

# 코어 확인
nproc

# 메모리 확인
free -h

# MAC 확인
ifconfig -a

# product uuid 확인
sudo cat /sys/class/dmi/product_uuid
# 또는 
sudo cat /sys/class/dmi/id/product_uuid

 

2. 메모리 swap 기능 비활성화

# swap 임시 비활성화
sudo swapoff -a 

# swap 영구 비활성화
sudo sed -i '/swap/s/^/#/' /etc/fstab

# 메모리 상태 확인
sudo free -m

# swap 메모리 상태 확인, 출력값이 없으면 swap 메모리 비활성화 상태
sudo swapon -s


# 만일 위에 명령어로 swap 기능 비활성화가 되지 않으면 아래 명령어를 실행
#swap unit 조회
systemctl list-unit-files --type swap

# swap unit(dev-파티션이름.swap)을 mask해서 비활성화
systemctl mask [swap unit명]
ex) systemctl mask dev-sda3.swap

# 비활성화 적용 확인
sudo systemctl list-unit-files --type swap

 

3. 방화벽 설정(쿠버네티스 포트만 방화벽 포트 개방)

# 방화벽 예외 설정(마스터, 워커)
sudo apt-get install -y firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 마스터 노드일 경우
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250-10252/tcp
sudo firewall-cmd --permanent --add-port=8285/udp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --reload

# 워커 노드일 경우
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --permanent --add-port=8285/udp
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --permanent --add-port=26443/tcp
sudo firewall-cmd --reload

# 방화벽 오픈 상태 확인
sudo firewall-cmd --list-all

# 열린 포트 확인
sudo netstat -tlnp

# 다른 노드의 포트 점검
telnet [ip] [port]
ex) telnet 192.168.100.128 6443

>> 
Trying 192.168.111.128...
telnet: Unable to connect to remote host: Connection refused
#Trying 192.168.111.128... 만 계속 나오면 방화벽 오픈되어 있지 않음
#Connection refuesed가 나오면 방화벽 오픈은 되어 있으나 프로세스가 올라가 있지 않은 상태

# 방법2
curl -v telnet://[ip]:[port]

 

4. 네트워크 옵션 설정

# /etc/modules-load.d/k8s.conf 파일 생성
sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
 
# /etc/sysctl.d/k8s.conf 파일 생성
sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 시스템 재시작 없이 stysctl 파라미터 반영
sudo sysctl --system

br_netfilter는 Linux 커널 모듈로, 브리지 네트워크 인터페이스를 사용하여 IP 필터링과 네트워크 주소 변환(NAT)을 가능하게 하는 기능을 제공합니다. 이 모듈은 특히 Kubernetes와 같은 컨테이너 오케스트레이션 시스템에서 필수적입니다. Kubernetes에서 Pod 간 통신 및 네트워킹을 올바르게 처리하기 위해 br_netfilter가 필요할 수 있습니다.

 

5. 컨테이너 런타임 설치

- Docker 설치 후 Containerd 패키지 사용

apt 업데이트 및 필수 패키지 설치

# apt 업데이트
sudo apt-get update

# 필수 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

 

공개키 다운로드 및 저장소 등록

# 공개키 다운로드
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 저장소 등록
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

도커 설치

# 저장소 추가로 apt 업데이트
sudo apt update

# 도커 설치
sudo apt install -y docker.io 또는 sudo apt install -y docker-ce

# 도커 버전 조회
docker --version

* docker.io 데비안(우분투)에서 제공하는 도커 패키지로 데비안 저장소에서 도커 패키지를 가져오게 된다.

* docker.io 는 docker의 외부 종속성 패키지는 마이크로 패키징으로 독립적으로 패키징되어 있다.

* docker-ce 설치 시 → 외부 종속성 패키지로 containerd.io 설치됨.

* docker.io 설치 시 → 외부 종속성 패키지로 containerd 설치됨.

 

도커 데몬 설정

# /etc/docker 디렉토리 없을 경우 생성
sudo mkdir /etc/docker

# daemon.json 파일 추가
sudo 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

# 필요 시 cgroup(runc) 옵션 설정
# containerd 구성 파일 생성
sudo mkdir -p /etc/containerd

# containerd 기본 설정값으로 config.toml 생성
sudo containerd config default | sudo tee /etc/containerd/config.toml

# config.toml 파일 수정
vi /etc/containerd/config.toml

# cgroup driver(runc) 사용하기 설정
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

# 수정사항 적용 및 재실행
sudo systemctl restart containerd

 

도커 재실행

# 도커 재시작
sudo service docker restart

# 도커 상태 조회
sudo service docker status

 

 

- Containerd 설치 후 사용

apt 업데이트 및 필수 패키지 설치

#apt 업데이트
sudo apt-get update

#필수 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

 

공개키 다운로드 및 저장소 목록

#공개키 다운로드
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 저장소 등록
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

containerd 패키지 설치

#저장소 적용을 위한 apt 업데이트
sudo apt-get update

#containerd 패키지 설치
sudo apt-get install containerd

#설치 확인
sudo systemctl status containerd

 

containerd config 옵션 설정

#containerd 구성 파일 생성
sudo mkdir -p /etc/containerd

#containerd 기본 설정값으로 config.toml 생성
sudo containerd config default | sudo tee /etc/containerd/config.toml

#config.toml 파일 수정
vi /etc/containerd/config.toml

# cgroup driver(runc) 사용하기 설정
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

#수정사항 적용 및 재실행
sudo systemctl restart containerd

 

- Docker Engine + cri-dockerd 적용

  • Docker 엔진 관련 명령을 기반으로 스크립트를 실행
  • 권한이 있는 Pod에서 Docker 명령 실행
  • Docker 특정 로깅 및 모니터링 활용

apt 패키지 업데이트 및 필수 패키지 설치

# apt 업데이트
sudo apt update

# 필수 패키지 설치
sudo apt install -y apt-transport-https ca-certificates curl gnupg

# 설치 패키지 조회
dpkg -l | grep [패키지명]

 

docker gpg 키 다운로드 및 저장소 추가

#공개키 다운로드
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 저장소 등록
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

docker 패키지 설치

#등록한 레포지토리를 반영하기 위해 apt update
sudo apt update

#docker 패키지 설치
sudo apt install -y docker-ce

 

설치 확인

#버전 확인
docker --version

#hello-world container 생성
docker run -it --name [컨테이너명] hello-world

#도커 컨테이너 조회
docker ps -a

#도커 컨테이너 삭제
docker rm [컨테이너ID 또는 컨테이너명]

#도커 이미지 조회
docker images

#도커 이미지 삭제
docker rmi [이미지명]

 

- cri-dockerd를 이용하여 도커 엔진과 쿠버네티스 연결

#cri-dockerd 소스코드 복사
git clone https://github.com/Mirantis/cri-dockerd.git

#Go언어 설치
wget https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x ./installer_linux
./installer_linux
source ~/.bash_profile

#cri-dockerd 빌드
cd cri-dockerd
mkdir bin
go build -o bin/cri-dockerd

#/usr/local/bin 으로 빌드파일 복사
mkdir -p /usr/local/bin
install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd

#systemd에 서비스 등록
cp -a packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

#재기동
systemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket
sudo systemctl restart docker && sudo systemctl restart cri-docker

#상태 확인
sudo systemctl status cri-docker.socket --no-pager

# Docker daemon Cgroup 변경
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

 

6. Kubernetes Cluster 설치

a. apt 패키지 업데이트 및 필수 패키지 

  • apt-transport-https
  • ca-certificates
  • curl
  • gnupg
# apt 업데이트
sudo apt-get update

# 필수 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

 

b. 구글 클라우드의 공캐  키 다운로드 및 쿠버네티스 레포지토리 추가

- Ubuntu 20.04

#keyrings 디렉토리 생성
sudo mkdir -p /etc/apt/keyrings

#개인키 다운로드
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg

#쿠버네티스 레포지토리 추가
sudo apt-add-repository "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] http://apt.kubernetes.io/ kubernetes-xenial main"

 

- Ubuntu 22.04 이후

#공개 키 다운로드
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg

#apt 저장소에 쿠버네티스 저장소 추가
sudo echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 23.01쯤 부터 쿠버네티스 저장소 url이 변경됨.
#https://packages.cloud.google.com/apt/doc/apt-key.gpg -> https://dl.k8s.io/apt/doc/apt-key.gpg

*만약 문제가 발생하면 vi 편집기로 kubenetes.list 파일에 해당 문자열 추가

sudo vi /etc/apt/sources.list.d/kubernetes.list 

# 다음 문자열 추가
deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] http://apt.kubernetes.io/ kubernetes-xenial main

 

c. 쿠버네티스 패키지 설치

# 저장소 추가되었기 때문에 apt 업데이트
sudo apt-get update

# 쿠버네티스 패키지 설치
sudo apt-get install -y kubelet kubeadm kubectl

# 쿠버네티스 패키지 버전 고정
sudo apt-mark hold kubelet kubeadm kubectl

# 쿠버네티스 설치 버전 조회
kubelet --version
kubeadm version
kubectl version

# kubelet service 확인
sudo systemctl status kubelet.service

*쿠버네티스 패키지 설치할 때 Unable to locate package ~ 에러가 발생할 수 있습니다.

# 해결
# 구글 클라우드의 공개 사이닝 키를 다운로드 한다.
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

# 쿠버네티스 apt 리포지터리를 추가한다.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.
sudo apt-get update

 

7. Master Node 구성

a. Control-Plan 구성

kubeadm을 통해 Control-Plane 설정을 완료하면 Worker Node의 join키가 발급되고 해당 키로 Worker Node를 등록 시 사용하니 기록 필요

# 쿠버네티스 클러스터를 초기화하여 새로운 마스터 노드를 생성하는 명령어
# 별도의 옵션을 설정하지 않으면 기본 디폴트 값으로 적용
kubeadm init [옵션]

# 기본 설정 명령어
sudo kubeadm init

# Calico
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
# Flannel
sudo kubeadm init --pod-network-cidr=10.244.0.0/16



# 옵션 목록
--config : 초기화에 사용할 구성 파일을 지정
--token : 클러스터에 대한 액세스를 허용하는 토큰을 초기화
--pod-network-cidr : 클러스터에 대한 Pod 네트워크 CIDR 범위를 지정
--apiserver-advertise-address : API 서버가 퍼블릭 엔드포인트에 대해 알릴 IP 주소를 지정
--apiserver-cert-extra-sans : 마스터 노드 인정스에 추가할 DNS 이름을 지정
--control-plane-endpoint : 컨트롤 플레인 구성요소가 서로 통신하는데 사용할 엔드포인트를 지정
--cri-socket : 사용할 CRI의 소켓을 지정

# 결과
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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.19.95:6443 --token er5mxz.xnyvpcqw5tx1kwbe --discovery-token-ca-cert-hash sha256:ef921801340bd63f1e7ab862d4c9130c0fbd2f0c37e59ab81b29af0f27a23ba7

 

b. kubectl 설정

root 계정이 아닌 다른 계정에서도 kubectl 명령어를 사용하기 위해 config 설정

*config 설정을 진행하지 않을 경우 kubectl 명령어를 사용 시

The connection to the server localhost:8080 was refused - did you specify the right host or port?

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

 

c. CNI(Container Network Interface) 설정

컨테이너 간의 네트워크를 제어할 수 있는 플러그인으로 컨테이너 런타임에서 컨테이너의 네트워크를 사용하게 해주는 인터페이스입니다.

쿠버네티스에서 사용되는 Pod들은 기본적으로 오버레이 네트워크 방식을 적용하여 엔드포인트 간의 네트워크 구조를 추상화하여 네트워크 통신 경로를 단순화합니다. 이때 사용되는 플러그인 마다 설정 방법이 다릅니다.

# Flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# Calico
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml -o calico.yaml
kubectl apply -f calico.yaml

# CNI 적용 확인
kubectl get pods -A -o wide

 

8. Worker Node구성

a. Worker Node Master 클러스터에 연결

마스터 노드에서 kubeadm init을 통해 생성한 join 명령어를 이용하여worker node 등록

sudo kubeadm join [ip]:6443 --token [토큰명] --discovery-token-ca-cert-hash [hashkey]

 

9. 최종 확인

a. Master Node에서 node 상태 확인

kubectl get node
or
kubectl get nodes -o wide

 

 

 

 

 

 

 

반응형

'Kubernetes' 카테고리의 다른 글

kubernetes yaml 분석  (1) 2024.10.07
Pod에 붙어 있는 PV 확인  (0) 2024.09.11
kubectl 자동 완성  (0) 2024.09.06
kubernetes cluster 재설정  (1) 2024.06.30

+ Recent posts