Kubernetes 설치
Kubernetes 설치에 대해서 다룬다. 이번에는 Ubuntu 20.04 LTS, Centos 8.2 기반으로 진행했으며 이전에 설치에서 CNI 를 Calico 로 진행 했다. 더 나가 Helm, Metric Server 까지 진행 한다.
설치 환경은 다음과 같다.
- Master
- Distribution: Ubuntu 20.04
- IP: 192.168.96.31
- Hostname: kmaster
- account: systemv
- Worker Node
- Distribution: CentOS 8.2
- IP: 192.168.96.32
- Hostname: knode
- account: systemv
- CNI: Calico
- Helm 설치
- Metric Server 설치
공통 설정 부분
Master, Node 두 서버 모두 Static IP 주소를 가지고 있어야 한다. 그리고 모두 일반 계정을 가지고 있어야 하며 이 일반 계정은 sudo 사용 권한을 가지고 있어야 한다.
sudo 권한 부여
CentOS 8.2 의 경우에 일반 계정을 생성한 후에 sudo 권한을 주고 싶다면 다음과 같이 하면 된다.
1 |
usermode -aG wheel systemv |
CentOS 8.2 에는 wheel 라고 하는 특수한 그룹이 존재하는데, sudo 설정에는 이 그룹에 한해 sudo 사용 권한을 부여하고 있어 일반 계정 systemv 에 sudo 를 사용하게하고 싶다면 wheel 그룹에 포함시키면 된다.
Ubuntu 20.04 에서는 다음과 같이 일반계정에 sudo 권한을 부여할 수 있다.
1 |
usermode -aG sudo systemv |
br_netfilter 모듈 로딩
br_netfilter 커널 모듈을 로딩해 줘야 한다. 기존에는 modprobe 설정으로 했지만 이제는 systemd 를 활용하면 되는데 ubuntu 20.04, CentOS 8.2 이 모두 이를 사용하고 있어서 적용 가능하다.
다음과 같이 모듈이름으로 conf 파일을 생성해 준다.
1 2 3 4 |
]$ sudo vim /etc/modules-load.d/br_netfilter.conf # Load br_netfilter.ko at boot br_netfilter ]$ sudo systemctl restart systemd-modules-load.service |
물론 이렇게 하면 시스템을 재부팅을 하더라도 자동으로 모듈이 로딩 된다.
커널 네트워크 파라메터
다음과 같이 커널 파라메터를 수정해 줘야 한다.
1 2 3 4 5 6 7 |
]# cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-arptables = 1 net.ipv4.ip_forward = 1 EOF ]# sysctl --system |
/etc/hosts 파일 편집
Master, Node 서버 양쪽 모두에 /etc/hosts 파일에 각 서버 정보를 다음과 같이 입력해준다.
1 2 3 |
]# vim /etc/hosts 192.168.96.31 kmaster 192.168.96.32 knode |
swapoff 설정
kubernetes 는 swap 파티션이 존재할 경우에 동작하지 않을 수 있다. 예를들어, kubeadm 명령어로 뭔가를 할려고 할경우에 swap 파티션이 존재할 경우에 오류를 내면서 작동되지 않는다.
Master, Worke 양쪽 모두에 swap 을 off 로 해준다.
1 |
]# swapoff -a |
이렇게 하면 swap 이 비활성화 된다. 그리고 반드시 /etc/fstab 에서 swap 관련 마운트 설정을 주석처리 해준다.
CentOS 8.2 에서 설정
SELinux off
CentOS 8.2 에서 설정은 SELinux 설정이다. 다음과 같이 해준다.
1 2 |
]# setenforce 0 ]# sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config |
firewalld 비활성화
이것은 systemctl 로 다음과 같이 가능하다.
1 2 |
]# systemctl stop firewalld ]# systemctl disable firewalld |
패키지 설치
1 2 3 |
]# dnf install -y yum-utils \ device-mapper-persistent-data \ lvm2 |
Ubuntu 에서 설정
패키지 설치
1 2 3 4 5 6 |
]# apt install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common |
Docker 설치 및 설정
Kubernetes 는 Docker 를 기반으로하는 서비스다. 당연히 설치를 해줘야 하는데, 설치 관련 내용은 다음에 링크에서 각 배포판마다 잘 설명되어 있다.
한가지, Docker 설치를 위한 패키지 저장소는 명령어와 파일을 생성하는 방법 두가지가 있다.
Ubuntu 20.04
ubuntu 에서는 add-apt-repository 명령어로 저장소 URL 을 추가 가능하다. 예를 들면 다음과 같다.
1 2 3 4 5 |
]# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - ]# add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" |
저장소 추가가 되었다면 다음과 같이 Docker 를 설치해 준다.
1 2 |
]# apt update ]# apt install docker-ce docker-ce-cli containerd.io |
CentOS 8.2
CentOS 8.2 에서는 yum-config-manager 명령어를 이용해서 추가할 수 있다. 이 명령어는 yum-utils 패키지에 포함되어 있어 설치하면 사용할 수 있다.
1 2 3 4 |
]# dnf install dnf-utils ]# yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo |
저장소 추가가 되었다면 다음과 같이 Docker 를 설치해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
]# dnf install docker-ce docker-ce-cli containerd.io Docker CE Stable - x86_64 275 kB/s | 25 kB 00:00 오류: 문제: package docker-ce-3:19.03.12-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed - cannot install the best candidate for the job - package containerd.io-1.2.10-3.2.el7.x86_64 is filtered out by modular filtering - package containerd.io-1.2.13-3.1.el7.x86_64 is filtered out by modular filtering - package containerd.io-1.2.13-3.2.el7.x86_64 is filtered out by modular filtering - package containerd.io-1.2.2-3.3.el7.x86_64 is filtered out by modular filtering - package containerd.io-1.2.2-3.el7.x86_64 is filtered out by modular filtering - package containerd.io-1.2.4-3.1.el7.x86_64 is filtered out by modular filtering - package containerd.io-1.2.5-3.1.el7.x86_64 is filtered out by modular filtering - package containerd.io-1.2.6-3.3.el7.x86_64 is filtered out by modular filtering (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages) |
현시점에서 위와같은 오류가 발생한다. CentOS 8 에 대한 containerd 저장소가 존재하지 않기 때문에 필요한 정보만 출력하고 오류를 낸다. 수동으로 필요한 패키지를 다운받아서 해결한다.
1 2 |
]# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm ]# dnf localinstall containerd.io-1.2.13-3.2.el7.x86_64.rpm |
수동으로 설치는 정상적으로 진행된다. 그리고 다음과 같이 Docker 를 설치해 준다.
1 |
]# dnf install docker-ce docker-ce-cli iproute-tc |
CentOS 8.2 에서 Docker 를 설치하면 필요한 서비스가 자동으로 시작되지 않는다. 이를 위해서 다음과 같이 systemd 를 설정해주고 시작해준다.
1 2 3 4 |
]# systemctl enable containerd ]# systemctl start containerd ]# systemctl enable docker ]# systemctl start docker |
CGroup Driver 설정
Ubuntu, CentOS 모두 공통으로 Docker 를 설정해 주는 부분이 존재한다. 바로 Driver 를 systemd 로 바꿔줘야 한다.
Kubernetes 를 설치할때에 Cgroup driver 를 systemd 로 추천하고 있다. 그래서 Kubernetes 만 systemd 로 드라이버를 교체하면 docker 와 통신이 되지 않는다. 이것을 위해서 Docker 에서도 드라이버를 systemd 로 교체해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
]# cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "dns": ["8.8.8.8", "8.8.4.4"] } EOF ]# systemctl daemon-reload ]# systemctl restart docker |
다음과 같이 확인이 가능하다.
1 2 3 4 |
]$ docker info Logging Driver: json-file Cgroup Driver: systemd Plugins: |
Kubernetes 설치
Ubuntu 20.04
Master 로 사용될 Ubuntu 20.04 에서 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.
1 2 |
]# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - ]# apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" |
xenial 은 Ubuntu 16.04 를 말하는데 Ubuntu 20.04 에 설치하는데 아무런 문제가 없다.
다음과 같이 kubeadm, kubelet, kubectl 을 설치해 준다.
1 |
]# apt install -y kubelet kubeadm kubectl |
CentOS 8.2
CentOS 8.2 에서는 다음과 같이 Kubernetes 패키지 저장소를 추가 한다.
1 2 3 4 5 6 7 8 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 |
그리고 다음과 같이 Kubernetes 를 설치해 준다.
1 2 3 |
]# dnf install -y kubeadm --disableexcludes=kubernetes ]# systemctl enable kubelet ]# systemctl start kubelet |
Master 설정
Master 를 다른 말로 Control Plaine 이라고도 한다. 이것을 만드는 것은 kubeadm 을 이용한다. 일반 계정으로 실행 한다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
]$ sudo kubeadm init --apiserver-advertise-address=192.168.96.31 --pod-network-cidr=10.31.0.0/16 [sudo] password for systemv: W0725 07:13:28.938671 1458 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io] [init] Using Kubernetes version: v1.18.6 [preflight] Running pre-flight checks [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' [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 [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 [kmaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.96.31] [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 [kmaster localhost] and IPs [192.168.96.31 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [kmaster localhost] and IPs [192.168.96.31 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 [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" W0725 07:14:17.257414 1458 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC" [control-plane] Creating static Pod manifest for "kube-scheduler" W0725 07:14:17.259815 1458 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC" [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 28.510647 seconds [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config-1.18" 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 kmaster as control-plane by adding the label "node-role.kubernetes.io/master=''" [mark-control-plane] Marking the node kmaster as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] [bootstrap-token] Using token: 5azn6k.npyqsyongk3rsmqq [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 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.96.31:6443 --token 5azn6k.npyqsyongk3rsmqq \ --discovery-token-ca-cert-hash sha256:743df4adaa7bace459250fa858ed07f587f6f40c4f5cd0898e3407c5ae6505a4 |
Kubernetes Master 명령은 전부 일반계정으로 하도록 되어 있어 있다. 일반계정이 kube api 통신을 위한 설정을 위 출력에 나온데로 실행해주면 된다.
1 2 3 |
]$ mkdir -p $HOME/.kube ]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config |
하지만 문제가 있다. 다음을 보자.
1 2 3 4 5 6 7 8 9 10 11 12 |
systemv@kmaster:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION kmaster NotReady master 6m49s v1.18.6 systemv@kmaster:~$ kubectl get pods -o wide --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-66bff467f8-7c8hr 0/1 Pending 0 6m57s <none> <none> <none> <none> kube-system coredns-66bff467f8-7t9z4 0/1 Pending 0 6m57s <none> <none> <none> <none> kube-system etcd-kmaster 1/1 Running 0 7m6s 192.168.96.31 kmaster <none> <none> kube-system kube-apiserver-kmaster 1/1 Running 0 7m6s 192.168.96.31 kmaster <none> <none> kube-system kube-controller-manager-kmaster 1/1 Running 0 7m6s 192.168.96.31 kmaster <none> <none> kube-system kube-proxy-x76xr 1/1 Running 0 6m57s 192.168.96.31 kmaster <none> <none> kube-system kube-scheduler-kmaster 1/1 Running 0 7m6s 192.168.96.31 kmaster <none> <none> |
kmaster 가 ‘NotReady’ 나오고 coredns 상태가 ‘Pending’ 이다. kubelet 로그를 보자.
1 2 3 |
Aug 30 00:29:03 kmaster kubelet[9751]: W0830 00:29:03.096595 9751 cni.go:213] Unable to update cni config: No networks found in /etc/cni/net.d Aug 30 00:29:05 kmaster kubelet[9751]: E0830 00:29:05.155336 9751 kubelet.go:2169] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not read Aug 30 00:29:08 kmaster kubelet[9751]: W0830 00:29:08.096862 9751 cni.go:213] Unable to update cni config: No networks found in /etc/cni/net.d |
NetworkPlugin 이 없어 오류가 나오는 것으로 이는 CNI(Container Network Interface) 를 필요로 한다.
Calico 설치
Calico 는 Flannel 처럼 Kubernetes Cluster 에 네트워킹을 가능하도록 해준다. CNI 를 위한 컴포넌트중에 하나라고 보면 되는데, 한가지 주의해야 할 것은 반드시 메뉴얼을 읽어보고 해야 한다는 것이다.
Calico 는 Kubernetes 가 운영되는 환경에 따라 설치과정에 차이가 있으며 심지여 같은 운영환경이라고 할지라도 node 의 수에 따라서 설치해줘야하는 것도 다르다.
이 메뉴얼은 OnPremise 환경이며, 50 node 이하를 가지고 있음으로 아주 간단하게 다음과 같이 yaml 파일 하나만 다운로드 받아서 적용해주면 된다.
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 |
$ curl https://docs.projectcalico.org/manifests/calico.yaml -O $ kubectl apply -f calico.yaml configmap/calico-config created customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-node created clusterrolebinding.rbac.authorization.k8s.io/calico-node created daemonset.apps/calico-node created serviceaccount/calico-node created deployment.apps/calico-kube-controllers created serviceaccount/calico-kube-controllers created |
이제 시간을 조금 기달려서 모든 pods 가 정상으로 Running 인지를 확인해 본다.
1 2 3 4 5 6 7 8 9 10 11 |
$ kubectl get pods -o wide --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system calico-kube-controllers-578894d4cd-892sz 1/1 Running 0 91s 10.31.189.3 kmaster <none> <none> kube-system calico-node-8btl4 1/1 Running 0 91s 192.168.96.31 kmaster <none> <none> kube-system coredns-66bff467f8-7c8hr 1/1 Running 0 8h 10.31.189.2 kmaster <none> <none> kube-system coredns-66bff467f8-7t9z4 1/1 Running 0 8h 10.31.189.1 kmaster <none> <none> kube-system etcd-kmaster 1/1 Running 0 8h 192.168.96.31 kmaster <none> <none> kube-system kube-apiserver-kmaster 1/1 Running 0 8h 192.168.96.31 kmaster <none> <none> kube-system kube-controller-manager-kmaster 1/1 Running 0 8h 192.168.96.31 kmaster <none> <none> kube-system kube-proxy-x76xr 1/1 Running 0 8h 192.168.96.31 kmaster <none> <none> kube-system kube-scheduler-kmaster 1/1 Running 0 8h 192.168.96.31 kmaster <none> <none> |
그리고 nodes 의 상태를 확인해 본다.
1 2 3 |
$ kubectl get nodes NAME STATUS ROLES AGE VERSION kmaster Ready master 8h v1.18.6 |
“Ready” 상태가 되었음으로 이제 Worker Node 를 추가해 보자.
Worker Node 추가.
Worker Node 는 knode 서버에서 다음과 같이 Kubernetes Cluster 에 join 하겠다는 것으로 실현된다. join 을 위한 파라메터는 kmaster 에서 kubeadm 으로 cluster 를 생성할때 보여준 값을 입력하면 된다.
1 2 |
$ sudo kubeadm join 192.168.96.31:6443 --token 5azn6k.npyqsyongk3rsmqq \ > --discovery-token-ca-cert-hash sha256:743df4adaa7bace459250fa858ed07f587f6f40c4f5cd0898e3407c5ae6505a4 |
이렇게 한 다음에 kmaster 서버에서 다음과 같이 knode 가 추가되고 상태가 Ready 된다면 Worker Node 추가가 완료된 것이다.
1 2 3 4 |
$ kubectl get nodes NAME STATUS ROLES AGE VERSION kmaster Ready master 9h v1.18.6 knode Ready <none> 5m49s v1.18.6 |
Helm 3 설치하기
Helm 은 Kubernetes 에서 작동하는 많은 Application 들을 손쉽게 설치하도록 도와주는 프로그램이다. 마치 Ubuntu 의 APT 나 CentOS 의 Yum 이 프로그램 설치를 손쉽게 해주는것과 같다.
한가지 변화가 있다. Helm 2 와 Helm 3 은 완전히 다르다고 생각해야 한다. Helm 2 는 Tiller 라고 해서 Helm 서버가 필요했지만 Helm 3 에서는 이것이 없어졌다.
Helm 3 는 설치 스크립트를 제공함으로 이것을 이용하면 손쉽게 설치할 수 있다. 설치 Node는 kubectl 을 사용할 수 있는 곳이라면 어디선든 사용이 가능하다.
Helm 3 설치
Helm 3 설치는 스크립트로 제공한다.
1 2 3 |
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 $ chmod 700 get_helm.sh $ ./get_helm.sh |
설치는 그냥 바이너리를 다운로드 받아서 /usr/bin 에 helm 바이너리를 설치하는 것으로 끝난다.
정상적으로 설치됐는지 확인은 다음과 같이 한다.
1 2 |
$ helm version version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"} |
한가지 문제는 기본 repository 주소가 없어서 뭐든 설치할려면 설치가 안된다. 이를 위해서 다음과 같이 저장소를 추가해 준다.
1 2 3 4 5 6 7 8 |
$ helm search repo Error: no repositories configured $ helm repo add stable https://kubernetes-charts.storage.googleapis.com/ "stable" has been added to your repositories $ helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈ |
Helm 3 은 이것으로 끝이다. 이전 Helm 2 버전에 비해 해줘야 하는 것이 없다.
Metric Server 설치
Kubernetes 를 설치하게 되면 자원에 대한 모니터링이 필요하다. 과거에는 Heapster 를 이용했지만 이것은 이제 더 이상 개발이 되지 않고 있으며 이를 대체하는 것이 Metric Server 이다.
Kubernetes 에서 뭔가를 설치하는 것은 대부분 Pods 를 설치하는 것이며 이것에 대한 Rules, Datastore 등도 한꺼번에 설정을 해준다.
Metric Server 를 설치하게 되면 Kubernetes 의 컴포넌트들에 대한 자원 모니터링이 가능해지며 이것을 이용해 Autoscaling 에도 사용이 가능해진다.
Downloads
Metric Server 를 다음과 같이 다운로드를 한다.
1 |
]$ wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml |
TLS 수정
Metric Server 를 설치할때에 주의해야 할 것은 Kube API 서버와의 통신에서 사용할 TLS 를 수정하는 것이다. Metric Server 는 Public TLS 를 기본으로 하지만 Kube API 는 Kube 자체의 TLS 를 사용하기 때문에 그냥 설치하면 문제가 된다.
1 2 3 4 5 6 7 8 |
]$ vim components.yaml .... args: - --cert-dir=/tmp - --secure-port=4443 - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname .... |
Deploy
이제 이것을 Deploy 해준다. Kubernetes 에서는 설치라는게 없다. 모두 다 pods 로 다 올라가기 때문에 Deploy 라고 한다.
1 2 3 4 5 6 7 8 9 10 |
$ kubectl apply -f components.yaml clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created serviceaccount/metrics-server created deployment.apps/metrics-server created service/metrics-server created clusterrole.rbac.authorization.k8s.io/system:metrics-server created clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created |
위와같이 관련된 설정과 pods, deploy, service 등이 생성이 된다.
확인
Metric Server 의 확인은 pods, deploy 가 제대로 되었는지를 살펴보면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
]$ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-578894d4cd-892sz 1/1 Running 0 67m calico-node-8btl4 1/1 Running 0 67m calico-node-kp5gm 1/1 Running 0 58m coredns-66bff467f8-7c8hr 1/1 Running 0 9h coredns-66bff467f8-7t9z4 1/1 Running 0 9h etcd-kmaster 1/1 Running 0 9h kube-apiserver-kmaster 1/1 Running 0 9h kube-controller-manager-kmaster 1/1 Running 0 9h kube-proxy-2nklp 1/1 Running 0 58m kube-proxy-x76xr 1/1 Running 0 9h kube-scheduler-kmaster 1/1 Running 0 9h metrics-server-5f4ffd464c-s98nr 1/1 Running 0 77s ]$ kubectl get deploy -n kube-system NAME READY UP-TO-DATE AVAILABLE AGE calico-kube-controllers 1/1 1 1 68m coredns 2/2 2 2 9h metrics-server 1/1 1 1 92s |
그리고 1~2분을 기다리면 후에 다음과 같이 자원이 출력이 되는지를 보면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
NAME CPU(cores) MEMORY(bytes) calico-kube-controllers-578894d4cd-892sz 1m 6Mi calico-node-8btl4 24m 26Mi calico-node-kp5gm 21m 45Mi coredns-66bff467f8-7c8hr 4m 6Mi coredns-66bff467f8-7t9z4 3m 6Mi etcd-kmaster 20m 28Mi kube-apiserver-kmaster 39m 325Mi kube-controller-manager-kmaster 14m 41Mi kube-proxy-2nklp 1m 12Mi kube-proxy-x76xr 1m 9Mi kube-scheduler-kmaster 4m 12Mi metrics-server-5f4ffd464c-s98nr 1m 13Mi |
CPU, Memory 등과 같은 자원 현황이 출력이 되면 정상적으로 작동하는 것이다.
정확한 자료 정말 감사합니다.
다른 사이트들에 있는 내용들은 잘 안되거나 오래된 버전이어서 계속 실패했는데 덕분에 잘 설치했습니다.