Browsing Tag

Certified Kubernetes Administrator

IT/Linux/Kubernetes

Docker Kubernetes Online Study – Ubuntu 20.04 Install

안녕하세요. ManVSCloud 김수현입니다.

CloudNet@에서 진행했던 ANOS 2기 스터디에 이어 DKOS(DOCKER KUBERNETES ONLINE STUDY)의 기회를 얻게되었습니다.

핵심만 콕! 쿠버네티스

위 책을 기반으로 공부를 하게 될 것으로 보이며 스터디가 6월 6일부터 시작되어 Ubuntu 설치와 사전 권장 학습을 진행해야합니다.

오늘은 간단하게 Ubuntu 20.04 설치에 대해서 포스팅했습니다.


Ubuntu 20.04 Install

VirutalBox

VirutalBox는 위 링크에서 다운로드 받을 수 있으며 Ubuntu는 20.04 Server 버전으로 VirtualBox를 이용하여 설치해줄 것입니다.

일단 DKOS-Ubuntu-Master라는 이름으로 생성해주었습니다.
이후 Node를 OS부터 하나씩 설치하지않고 Master를 특정 부분까지 설치 및 설정 해준 뒤 스냅샷으로 Node를 생성할 것입니다.

English 선택
키보드 레이아웃 고르는 것입니다.
저는 Korean으로 선택해주었습니다.
네트워크 설정해주는 곳인데 저는 이곳에서 설정을 해줬습니다.
이후 서버 내에서 설정하는 것도 알려드리겠습니다.
DHCP로 하지않고 고정으로 설정 해보겠습니다.
저는 VirtualBox에서 네트워크 연결 방식을 “어댑터에 브릿지” 으로 설정해두었으므로
위와 같이 설정해주었습니다.
192.168.0.30을 Master IP로 사용할 것입니다.
이전에 CentOS 환경으로 Kubernetes를 설치 및 테스트한 경험이 있습니다.
이전에 테스트 당시 만들어둔 표인데 대충 참고만하면 좋을듯합니다.
Disk 파티션을 설정하는 곳입니다.
Custom storage layout을 선택하면 사용자 설정을 할 수 있지만 저는 그냥 통으로 설치했습니다.
사용자 계정과 패스워드 등을 설정해줍시다.
위 Install OpenSSH Server를 체크해줍시다.
이후 따로 설치해줄 필요없습니다.
설치가 진행되고 이후 update&reboot이 나오면 reboot을 진행해주고 설치를 마무리합니다.
설치가 완료되면 설치 시 생성한 사용자 계정을 통해 접속이 가능합니다.
설치가 완료되었다면 VirtualBox에서 스냅샷을 찍어줍시다.★
스냅샷을 찍어두는 습관은 이후에도 많은 도움이 됩니다.
putty를 이용하여 생성한 OS에 접근
Ubuntu 20.04 설치 완료

Today’s Tips

Ubuntu는 CentOS와 다른 것들이 많았습니다.
저도 Redhat 기반의 경험이 많아 데비안 환경은 조금 불편할 때가 많았습니다.

  • sudo
    (sudo su – 를 하여 root 계정으로 사용할 수 있지만 사용자 계정 환경에 익숙해져보려고 합니다.)
  • apt-get
    (CentOS에서는 패키지관리자가 yum으로 사용되었지만 Ubuntu에서는 apt-get으로 사용해줍니다. +rpm과 dpkg의 차이)

또한 Ubuntu18 이후 버전부터는 네트워크 설정 파일이 yaml 파일로 설정되어있습니다.
/etc/sysconfig/network-scripts/가 아닌 /etc/netplan/ 아래 yaml 파일을 이용하여 네트워크 설정이 가능합니다.

//편의를 위한 root 권한으로 변경
manvscloud@dkos-master:~$ sudo su -
[sudo] password for manvscloud:

//작업 전 백업
root@dkos-master:~# sudo cp -avp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml_org
'/etc/netplan/00-installer-config.yaml' -> '/etc/netplan/00-installer-config.yaml_org'
root@dkos-master:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      addresses:
      - 192.168.0.30/24
      gateway4: 192.168.0.1
      nameservers:
        addresses:
        - 168.126.63.1
        search:
        - 169.126.63.2
  version: 2

위 yaml 파일을 보면 설치 시 설정했던 IP와 nameserver 등이 들어가있는 것을 볼 수 있습니다.
위 파일 수정 후 적용은 아래 명령어로 적용할 수 있습니다.

root@dkos-master:~# netplan apply

이후 스냅샷으로 생성한 Node들의 IP 설정을 해줄 때 사용하게 될 것입니다.
추가로 Hostname 변경 방법도 추가해두겠습니다.

//현재 hostname 확인
root@dkos-master:~# hostnamectl status

//hostname 변경
root@dkos-master:~# hostnamectl set-hostname dkos-node1

//hosts 파일 변경
root@dkos-master:~# vi /etc/hosts

network 및 hostname 설정간에 큰 어려움 없으시길 바랍니다.


Personal Comments

Kubernetes 시험 등록 후 다른 여러 일정으로 아직까지 시험을 못보고 있었습니다.
CloudNet@에서 진행하는 DKOS로 쿠버네티스 학습에 조금 더 집중을 할 수 있게 될 것같습니다. 2021-08-17 전에 시험 합격을 목표로 하고 있어 “네이버 클라우드에서의 보안” 포스팅을 제외하고는 쿠버네티스에 몰두할 예정입니다.

기회를 주신 CloudNet@ 팀에 다시 한 번 감사의 인사 올리며 포스팅을 마무리 하겠습니다.
긴 글 읽어주셔서 감사합니다.

IT/Linux/Kubernetes

KUBERNETES 1.19 설치 및 APM + WORDPRESS 연동 – 2부

안녕하세요. ManVSCloud 김수현입니다.

1부 “VirtualBox를 이용한 Kubernetes 1.19 설치” 편에 이어
2부에서는 설치된 Kubernetes를 이용하여 APM + WordPress 연동을 작성하겠습니다.

1부 “VirtualBox를 이용한 Kubernetes 1.19 설치”를 못보신 분들을 위해
해당 포스트 하단에 추가로 링크를 추가해두었습니다.

APM + WordPress를 연동하여 wordpress 웹 서비스를 운영할 수 있도록 해보겠습니다.

PV, PVC, Service & Pod Deploy

| PV

1. vi pv_01.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv0001
  labels:
    type: local
spec:
  capacity:
    storage: 25Gi
  accessModes:
    - ReadWriteOnce
  hostPath:

    path: "/data001/pv0001"

2. vi pv_02.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv0002
  labels:
    type: local
spec:
  capacity:
    storage: 25Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data001/pv0002"

위 .yaml 파일을 만든 뒤 아래 명령어를 이용하여 퍼시스턴트 볼륨을 생성하고
정상적으로 생성되었는지 확인 해봅니다.

 kubectl create -f pv_01.yaml
 kubectl create -f pv_02.yaml
 kubectl get pv

| Mysql, PVC + Services + Pod

  • vi mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

| WordPress, PVC + Services + Pod

  • vi wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
  externalIPs:
  - 192.169.0.31
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pvc

위 파일은 PVC와 Pod, Services .yaml 파일입니다.
따로 분리하여 만들어줄 수도 있고, 위 방법과 같이 합쳐서 한 파일로 만들 수도 있습니다.

| Add Secret Generator

  • vi kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=rlatngus1!
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml
  • kubectl apply -k ./

| Confirm Settings

지금까지 설정한 것들을 아래의 방법으로 모두 확인해보시기 바랍니다.
위 wordpress-deployment.yaml에서 External-IP를 Kube-Node1의 IP로 설정해두었습니다.

  • kubectl get secrets
  • kubectl get pvc
  • kubectl get pods
  • kubectl get services

Check Service (192.168.0.31:80)

Kube-Node1 IP인 192.168.0.31로 80포트를 타고 wordpress가 실행되었습니다.
정상적으로 운영되는 것을 웹 페이지에서 볼 수 있었습니다.

C o m m a n d

1 kubectl get svc
2 kubectl get nodes
3 kubectl get pods
–all-namespaces
-o wide
4 kubectl delete pod [pod이름]
namespace가 default가 아닌 다른 것일 때 ex) -n kube-system
5 kubectl describe pod [pod이름]
6 kubectl get events
7 kubectl get pv
8 kubectl get pvc
9 kubectl edit svc [service이름]
10 kubectl create -f [파일] ex) mysql.yaml

마지막으로 자주 쓰이게 됐던 명령어들을 10가지 뽑아 정리하였습니다.
이 포스팅이 실습에 많은 도움이 되셨길 바라며 이론적인 부분은 따로 찾아보시기 바랍니다.

1,2부에 걸쳐 긴 글 읽어주셔서 감사합니다.

IT/Linux/Kubernetes

Kubernetes 1.19 설치 및 APM + WordPress 연동 – 1부

안녕하세요. ManVSCloud 김수현입니다.

오늘은 Kubernetes 1.19 설치 후 APM + WordPress를 연동하여
wordpress 웹 서비스를 운영하는 것이 목표입니다.

1부에서는 VirtualBox를 이용한 Kubernetes 1.19 설치,
2부에서는 설치된 Kubernetes를 이용하여 APM + WordPress 연동을 작성하겠습니다.

설치 환경은 아래와 같습니다.

Environment

  • VirtualBox [각 VM 정보]
    CentOS 7.8 2003 (core) + 3.10.0-1127.19.1.el7.x86_64
    MEMORY : 4G
    CPU : 2
    HDD : 50G
    네트워크 방식 : 어댑터에 브리지

“테스트하는데 저렇게 많은 메모리와 많은 node를 생성할 필요는 없습니다.
그냥 제 노트북 스펙이 괴물이라 퍼줬습니다.”


최소 2G 메모리면 충분히 설치가 가능합니다.

Kubernetes Install & Environment Setup

  • Master – 1
    Kubernetes 설치를 위해서는 기본적인 설치 환경을 만들어주어야 합니다.

    VirtualBox를 이용하여 CentOS 7를 설치해 kube-master를 생성해주고
    Master에서 아래 환경들을 구성합니다.

1 setenforce 0
2 sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/’ /etc/selinux/config
3 sestatus
4 systemctl stop firewalld && systemctl disable firewalld
5 systemctl stop NetworkManager && systemctl disable NetworkManager
6 swapoff -a && sed -i ‘/ swap / s/^/#/’ /etc/fstab
7 cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
8 sysctl –system
9 cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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
EOF
10 yum -y update
11 cat << EOF >> /etc/hosts
192.168.0.30 kube-master
192.168.0.31 kube-node1
192.168.0.32 kube-node2
192.168.0.33 kube-node3
EOF
12 cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.30 kube-master
192.168.0.31 kube-node1
192.168.0.32 kube-node2
192.168.0.33 kube-node3
13 yum install -y yum-utils device-mapper-persistent-data lvm2
14 yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
15 yum update -y && yum install -y docker-ce
16 mkdir /etc/docker
17 cat > /etc/docker/daemon.json <<EOF
{
“exec-opts”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
},
“storage-driver”: “overlay2”,
“storage-opts”: [
“overlay2.override_kernel_check=true”
]
}
EOF
18 mkdir -p /etc/systemd/system/docker.service.d
19 yum install -y kubelet kubeadm kubectl –disableexcludes=kubernetes

여기까지 구성하셨다면 기본적인 노드 복제 전 모든 설정들이 구성된 것입니다.
다음 작업을 진행하기 전에 스냅샷을 생성하시기 바랍니다.

이 스냅샷은 앞으로 당신의 쿠버네티스 모험으로부터 많은 도움을 줄 것입니다.

이제 설정을 마친 Kube-Master를 아래와 같은 방법으로 Kube-Node1,2,3으로 복제할 것입니다.

모든 Kube-Node 복제를 완료하셨다면 이제 아래 작업으로 넘어가셔도 좋습니다.

  • Node – 1
    Master를 복제하여 Node를 만들었기때문에 Node들은 Master와 동일한 IP를 갖고있습니다.
    Node 복제가 완료되면 가장 먼저 IP 변경과 hostname 변경을 해주는 것이 우선입니다.

1 /etc/sysconfig/network-scripts/ifcfg-enp0s3
IPADDR=192.168.0.
2 systemctl restart network
3 hostnamectl set-hostname kube-node

  • Master – 2
    Node의 네트워크 설정이 완료되면 다시 Master로 돌아와서 설정을 마저합니다.
    아래 설정 중에 kubeadm join 값을 반드시 저장해두시기 바랍니다.

20 systemctl daemon-reload
21 iptables -nL
22 systemctl enable –now docker
23 docker run hello-world
24 systemctl enable –now kubelet

25 kubeadm init –pod-network-cidr=20.96.0.0/12

# kubeadm join value 값을 따로 저장해두자.
# –token 7ovjlh.znruevaiqj9cbrk8 \ –discovery-token-ca-cert-hash sha256:77ef7 – 이하 생략

26 mkdir -p $HOME/.kube
27 cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
28 chown $(id -u):$(id -g) $HOME/.kube/config
29 yum install bash-completion -y
30 source <(kubectl completion bash)
31 echo “source <(kubectl completion bash)” >> ~/.bashrc

  • Node – 2
    Master-2 의 작업이 모두 완료되면 Node로 돌아와 아래와 같은 작업을 해줍니다.
    Master에서 저장해둔 본인의 kubeadm join 값을 아래에 추가하여 붙여줍니다.

4 systemctl daemon-reload
5 systemctl enable –now docker
6 systemctl enable –now kubelet
7 kubeadm join 192.168.0.30:6443 –token 7ovjlh.znruevaiqj9cbrk8 \
–discovery-token-ca-cert-hash sha256:77ef7c8c7325d309fa91cab608ce0eb94f30f300bd053db4c08341bf083ef53d

  • Master – 3
    이제 99% 설치가 완료됐다고 보시면 됩니다.
    kubectl get nodes를 하여 Master에서 각 Node들의 상태를 확인해보시기 바랍니다.

    STATUS 값이 READY 상태여야합니다.

32 kubectl get nodes

33 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
34 kubectl get pods –all-namespaces

calico도 설치해줍니다.
calico는 컨테이너 기반에서 사용되는 네트워크 플러그인 중에 하나입니다.

calico가 정상적으로 Running 중이십니까?
여기까지 성공하셨다면 Kubernetes 1.19 설치가 정상적으로 완료되었습니다.

많은 도움이 되셨길 바라며,
함께 Kubernetes 자격증 도전중인 용사님들 화이팅입니다!

2부에 이어서 설치된 Kubernetes로 APM + WordPress 연동하여
서비스를 운영해보도록 하겠습니다.

읽어주셔서 감사합니다.

Certificate

CKA (Certified Kubernetes Administrator) 시험 도전

안녕하세요? ManVSCloud (김수현)입니다.
다음 자격증 시험 준비는 CKA(Certified Kubernetes Administrator)로 정했습니다.

CKA (Certified Kubernetes Administrator) 시험이 올해 9월 1일 새로 개편되어 나온다는
소식을 듣고 새로 바뀐 시험에 도전해보기로 했습니다.

시험에 대한 자세한 내용은 다음과 같습니다.

CKA (Certified Kubernetes Administrator)

CKA 2020 : 2020 년 9 월 1 일 00:00 UTC에 사용 가능
시험 기간 : 2 시간
소프트웨어 버전 : Kubernetes v1.19

◈  클러스터 아키텍처, 설치 및 구성 – 25 %

☞ 역할 기반 액세스 제어(RBAC) 관리
☞ Kubeadm을 사용하여 기본 클러스터 설치
☞ 고 가용성 Kubernetes 클러스터 관리
☞ Kubernetes 클러스터를 배포하기위한 기본 인프라 프로비저닝
☞ Kubeadm을 사용하여 Kubernetes 클러스터에서 버전 업그레이드 수행
☞ etcd 백업 및 복원 구현

◈ 서비스 및 네트워킹 – 20 %

☞ 클러스터 노드의 호스트 네트워킹 구성 이해
☞ 포드 간의 연결 이해
☞ Cluster IP, NodePort, LoadBalancer 서비스 유형 및 엔드 포인트 이해
☞ 수신(Ingress) 컨트롤러 및 수신(Ingress) 리소스 사용 방법 파악
☞ CoreDNS 구성 및 사용 방법 이해
☞ 적절한 컨테이너 네트워크 인터페이스 플러그인 선택 


◈ 문제 해결 – 30 %

☞ 클러스터 및 노드 로깅 평가
☞ 응용 프로그램 모니터링 방법 이해
☞ 컨테이너 stdout 및 stderr 로그 관리
☞ 응용 프로그램 오류 문제 해결
☞ 클러스터 구성 요소 오류 문제 해결
☞ 네트워킹 문제 해결 


◈ 워크로드 및 일정 – 15 %

☞ 배포 및 롤링 업데이트 및 롤백 수행 방법 이해
☞ ConfigMaps 및 Secrets를 사용하여 애플리케이션 구성
☞ 애플리케이션 확장 방법 파악
☞ 강력한 자가 복구 애플리케이션 구현에 사용되는 기본 요소 이해
☞ 리소스 제한이 포드 스케줄링에 미치는 영향 이해
☞ 매니페스트 관리 및 일반적인 템플릿 도구에 대한 인식

◈ 저장 – 10 %

☞ 스토리지 클래스, 영구 볼륨 이해
☞ 볼륨 모드, 액세스 모드 및 볼륨 회수 정책 이해
☞ 영구 볼륨 클레임 기본 이해
☞ 영구 스토리지로 애플리케이션 구성 방법 이해

시험 준비 기간은 9~10월 정도로 예정 중이며,
튜토리얼을 참고하여 차근차근 하나씩 실습해볼 예정입니다.

▶ https://kubernetes.io/ko/docs/tutorials/

CKA (Certified Kubernetes Administrator) 시험은 실기 시험이라 매우 흥미를 느끼고 있습니다.
저 같은 경우 이론 시험이라도 실습을 해보지 않으면 이해하는 데에 어려움을 겪는 편이라
이번 쿠버네티스 시험은 상당히 재밌을 것 같고 기대가 됩니다.

9월 1일부터 공부를 시작할 예정이며,
CKA (Certified Kubernetes Administrator) 시험도 합격 후 개편 시험 후기로 찾아뵙도록 하겠습니다.

읽어주셔서 감사합니다.