일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- django
- DFS와BFS
- 코딩테스트
- vuejs
- Python
- 개발
- AndroidStudio
- Flutter
- 코테
- cos
- DFS
- C++
- 분할정복
- DART
- 동적계획법과최단거리역추적
- cos pro
- codingtest
- Vue
- android
- issue
- 안드로이드
- 동적계획법
- 코드품앗이
- 알고리즘
- cos pro 1급
- 백준
- Algorithm
- BAEKJOON
- 파이썬
- 안드로이드스튜디오
- Today
- Total
Development Artist
[Centos 7, Kubernetes] 설치 본문
1. Kubernetes 사전 준비사항 (공통)
- Worker 노드 개수 정책 설정.
용도에 맞게 Worker 노드의 수를 결정할 수 있다.
테스트 환경에서는 일단 master(Control-plane) 노드 1개와 worker 노드 1개로 설정하겠다. (why? 사용 가능한 VM 자원이 2대 뿐이다!ㅠㅠ)
Reference: https://learnk8s.io/kubernetes-node-size
- selinux Off
getenforce
Enforcing이라면,
vi /etc/selinux/config
SELINUX=enforcing을 SELINUX=disabled 로 적어주기.
이후 재시작(reboot or init 6)
- firewalld Off
방화벽을 꺼준다.
systemctl stop firewalld
systemctl disable firewalld
Docs에서는 master노드와 worker노드 각각 열어줘야 하는 포트들이 있는데 이번 테스트에서는 편의상 방화벽을 끄고 다 열어주도록 하겠다. 아래는 각각 열어줘야 하는 포트 정보이다.
> Master(Control-plane) 노드
TCP | Inbound | 6443* | Kubernetes API server | All |
TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP | Inbound | 10250 | Kubelet API | Self, Control plane |
TCP | Inbound | 10251 | kube-scheduler | Self |
TCP | Inbound | 10252 | kube-controller-manager | Self |
> Worker 노드
CP | Inbound | 10250 | Kubelet API | Self, Control plane |
TCP | Inbound | 30000-32767 | NodePort Services† | All |
- swap Off
swap은 메모리가 가득차게 되면 추가적으로 사용 할 수 있는 여분의 공간(파티션)을 말한다. free 명령어로 swap 부분을 확인해볼 수 있습니다. 확인 후 swap를 꺼준다.
swapoff -a
- Docker 설치
https://jmcunst.tistory.com/292
※ kubernetes 1.20 부터 Docker를 런타임으로 사용하는 것을 지원하지 않고 있다. 대체제로 containerD가 있다. Docker를 설치하면 containerD도 자동적으로 설치가 되지만, 따로 설치하는 것이 좋을 것이다.
이번 실습은 Docker를 설치하여 진행하였다.
- containerD 설치
containerd를 설치하기 위한 레포를 등록.
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Linux-*
containerd 설치
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install containerd.io
2. Kubernetes 설치
- br_netfilter 모듈 설정
lsmod | grep br_netfilter
모듈 확인. 부팅 시 모듈이 올라 올 수 있게끔 /etc/modules-load.d에 kubernetes.conf 파일을 만들어 해당 모듈 넣어두기. systemd-modules-load 서비스가 active 상태여야 가능하다.
cat << EOF | tee /etc/modules-load.d/kubernetes.conf
br_netfilter
EOF
여기서 br_netfilter이 있어야 docker가 default bridge driver를 사용하여 Pod들간 통신이 가능하게 한다. 해당 모듈을 아래 명령어로 적재한다.
modprobe overlay
modprobe br_netfilter
br_netfilter 모듈을 iptables가 사용할 수 있도록 sysctl.d 아래에 설정파일을 만들어 준다. 해당 디렉터리에는 부팅시 커널 매개변수를 설정한다.
또한, ipv4.ip_forward 옵션은 커널이 처리하는 패킷에 대해 외부로 forwarding을 가능하게 한다.
cat << EOF | tee /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
설정을 완료하면 시스템 구성 파일을 로드한다.
sysctl --system
해당 명령어는 각 /etc, /run, /usr/local, /usr/lib, /lib 디렉터리 하위 sysctl.d 디렉터리의 하위 모든 .conf 파일과 /etc/sysctl.conf를 읽고 로드한다.
- Master 노드에 Worker 노드 리졸빙.
사전준비에서 결정했듯이, 마스터노드 한개, 워커노드 한개로 구성을 해볼 것이다. 따라서, etc/hosts에 해당 서버의 ip와 hostname을 등록해준다.
cat << EOF >> /etc/hosts
[MASTER_NODE_IP] [hostname]
[WORKER_NODE_IP] [hostname]
EOF
- Kubernetes 레포 등록 및 설치.
exclude 옵션으로 'kubelet', 'kubeadm', 'kubectl'을 주었는데, 따로 이후에 패키지를 설치해준다.
cat << EOF | 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
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
설치 이후, kubelet을 활성화 시켜준다. 여기서 --now는 활성화를 하겠다는 의미이다.
systemctl enable --now kubelet
- dockerd의 디폴트 config 파일 설정
dockerd는 디폴트로 /etc/docker/daemon.json 파일을 찾는다. 따라서, docker 데몬이 실행 될때 설정하고 싶은 옵션들이 있다면 이곳에 설정을 해주면 된다. 여기에 cgroup driver에 대한 설정을 넣어준다.
kubeadm이 해당 설정을 찾아서 kubelet이 실행되면 config.yaml에 cgroup driver를 세팅해주게 된다.
cat << EOF | tee /etc/docker/daemon.json
{
"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
- Containerd cri 플러그인 활성화
기본적으로 containerd는 cri 플러그인을 비활성화 한다. k8s를 사용하기 위해서는 해당 cri 플러그인을 활성화 시켜줘야 한다.
sed -i '/"cri"/ s/^/#/' /etc/containerd/config.toml
3. 초기화
3.1. Master 노드
- Master 노드 초기화.
kubeadm init
뒤에 옵션을 줄 수 있다. optional이다.
--apiserver-advertise-address [MASTER_NODE_IP] : 수신 대기 중임을 알릴 IP 주소. default는 기본 네트워크 인터페이스.
--apiserver-cert-extra-sans [MASTER_NODE_IP] : API 서버에 인증 할때 사용할 이름.
--pod-network-cidr=[NETWORK_IP/CIDR] : Pod들의 네트워크 주소.
kubeadm init --apiserver-advertise-address [MASTER_IP] --apiserver-cert-extra-sans [MASTER_IP] --pod-network-cidr=172.16.0.0/16 --ignore-preflight-errors=all
혹시 실수로 되돌려야 한다면,
kubeadm reset
- 초기화 결과 및 가이드 메모
클러스트를 사용하기 위해 Path를 잡아주고, 제일 아래의 kubeadm join ~ 명령어는 Worker 노드에서 사용할 것이다.
[root@server-master containerd]# kubeadm init --apiserver-advertise-address 192.168.10.145 --apiserver-cert-extra-sans 192.168.10.145 --pod-network-cidr=172.16.0.0/16 --ignore-preflight-errors=all
[init] Using Kubernetes version: v1.26.0
[preflight] Running pre-flight checks
[WARNING NumCPU]: the number of available CPUs 1 is less than the required 2
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local server-master] and IPs [10.96.0.1 192.168.10.145]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost server-master] and IPs [192.168.10.145 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost server-master] and IPs [192.168.10.145 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 13.505252 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node server-master as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node server-master as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: g1y7jl.vymtxcecpew356vv
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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 192.168.10.94:6443 --token ug98br.bgv7e1l2j9ytvxds \
--discovery-token-ca-cert-hash sha256:b87eb3cc61cb29267bec89158337a6b2ce9479259ded23a28caefb412bf5efbd
- kubelet 사용 환경 잡아주기
루트로 진행하겠다.
export KUBECONFIG=/etc/kubernetes/admin.conf
3.2. Worker 노드
- Join 시키기.
master 노드를 초기화 하고 나온 결과에 있는 명령어 사용.
kubeadm join 192.168.10.94:6443 --token ug98br.bgv7e1l2j9ytvxds \
--discovery-token-ca-cert-hash sha256:b87eb3cc61cb29267bec89158337a6b2ce9479259ded23a28caefb412bf5efbd
4. 클러스터
- master 노드 상태 확인
kubectl get nodes
kubectl get pods --all-namespaces
- CNI(Container Network Interface) 플러그인 설치
CNI 종류가 여러개 있지만 Calico가 보편적이다.
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml -O
Callico를 apply 하기 전에, ip 풀을 확인해야 한다. Calicosms 실행 중인 구성을 기반으로 자동으로 CIDR을 감지해서 풀을 정한다. 하지만, calico.yaml의 CALICO_IPV4POOL_CIDR 주석을 해제하고 커스텀 할 수도 있다.
calico.yaml을 편집한 후 apply 한다.
kubectl apply -f calico.yaml
'Research > Devops' 카테고리의 다른 글
[AWS RDS, MySQL, DBeaver, Mac] Connection Timed Out (0) | 2023.07.09 |
---|---|
[Centos 7, Postgresql 15] 설치. ( version 11 or later ) (0) | 2022.12.29 |
[Centos 7, Docker] 설치 (0) | 2022.12.20 |
[Summary, Openssl] SSL 인증서 파일 포맷 종류 - crt, cer, csr, pem, der, pfx, p12, jks, key (0) | 2022.05.11 |
[Linux] 데몬 종류 정리 (0) | 2022.04.15 |