2020. 10. 23. 11:10ㆍcloud&platform
※ CentOS 7 기준으로 작성됨.
※ 내부 베어메탈 서버에 쿠버네티스를 설치하는 가이드이며, 1.11.3 버전에 특화되었다. kubernetes.io 의 공식 가이드를 참조한 방식이며 100% 수동이다. 추후에는 분명 자동화된 설치방법이 나오겠지..
※ 최소 요구 서버 수
- master를 single로 구성시에는 최소 master 1대, node 1대 총 2대.
- master를 HA구성시에는 최소 master 3대, node 3대 총 6 대. (node가 3대 이하여도 설치도 되고 동작도 되나, 실제 서비스에는 그렇게 하지 말자)
1. Docker Install
- kubernetes의 모든 host는 container 기반. docker는 가장 인기있고 보편적인 container.
- verion : 17.03 (1.12 이후에는 17.06, 17.09, 18.06 까지 지원)
- 대상 : master, node 모든 서버
// YUM 유틸리티 설치
# yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
// repository 등록
# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
// docker repository list 확인
# yum list docker-ce --showduplicates | sort -r
// docker install
# yum install --setopt=obsoletes=0 \
docker-ce-17.03.3.ce \
docker-ce-selinux-17.03.3.ce
# systemctl enable docker && systemctl start docker
# docker version // 설치 및 실행 확인
※ docker 설치 후 daemon.json 적용
daemon.json은 docker의 로그 파일 규칙 등의 설정 가능.
# cd /etc/docker
# vi daemon.json // daemon.json 설정
//example
{
"insecure-registries": [
"xxx.xxx.xxx.xxx:11111"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
# echo 'DOCKER_OPTS="--config-file=/etc/docker/daemon.json"' > /etc/default/docker
# systemctl daemon-reload
# systemctl restart docker
Configure logging drivers
docs.docker.com
※ docker 삭제
다시 처음부터 설치하고 싶을때..
kubenetes 설치 이후라면, kubeadm init 이후에 해야 한다.
// install docker 확인
# yum list installed | grep docker
# yum list installed | grep container-selinux
# systemctl stop docker
# yum remove docker-ce
# yum remove docker-ce-selinux
# ps –ef | grep docker // 살아 있는 프로세스가 있는지 확인 (보통 없다)
# kill -9 <ps-id> // 만약 있다면 kill!
# rm -rf /var/lib/docker // container 폴더 삭제
2. kubeadm, kubelet, kubectl 설치
- 대상 : master, node 모든 서버
# swapoff -a //swap memory 비활성 (필수)
// yum repository 등록
# 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
exclude=kube*
EOF
// Set SELinux in permissive mode (effectively disabling it)
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
// 가용 버전 확인
# curl -s https://packages.cloud.google.com/apt/dists/kubernetes-xenial/main/binary-amd64/Packages | grep Version
// 설치
# yum install -y kubelet-1.11.3 kubeadm-1.11.3 kubectl-1.11.3 --disableexcludes=kubernetes
# systemctl enable kubelet && systemctl start kubelet
# systemctl status kubelet // Fail 나옴 -> /var/lib/kubernetes/config.yaml이 없기 때문이며, 이는 Master init에 생성됨
※ Some users on RHEL/CentOS 7 have reported issues with traffic being routed incorrectly due to iptables being bypassed. You should ensure net.bridge.bridge-nf-call-iptables is set to 1 in your sysctl config, e.g. (in kubernetes 공식 문서)
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
# systemctl daemon-reload
# systemctl restart kubelet
※ yum install 시 https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/repodata/repomd.xml:[Errno 14] curl#22 - "The requested URL returned error: 403" 에러 날 경우
# vi /etc/yum.conf
-> proxy=http://<이상한 IP address> 주석 처리
# yum clean metadata
# yum install -y kubelet-1.11.3 kubeadm-1.11.3 kubectl-1.11.3 --disableexcludes=kubernetes 다시 실행
Installing kubeadm
This page shows how to install the kubeadm toolbox. For information how to create a cluster with kubeadm once you have performed this installation process, see the Using kubeadm to Create a Cluster page. Before you begin One or more machines running one of
kubernetes.io
3. Master 설치 (Single 구성일 경우)
- 대상 : master 서버
# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# kubeadm init // master 초기화. 결과 출력물에 node join 정보가 있으므로 copy 해둬야 한다.
// pod network 대역을 지정할 경우는 아래와 같이 초기화
# kubeadm init --pod-network-cidr=0.0.0.0/0 // network add-on설정에 따른 대역대
Creating a cluster with kubeadm
Creating a minimum viable Kubernetes cluster that conforms to best practices. In fact, you can use kubeadm to set up a cluster that will pass the Kubernetes Conformance tests. kubeadm also supports other cluster lifecycle functions, such as bootstrap token
kubernetes.io
4. Master 설치 (HA 구성일 경우)
- 대상 : master 서버
1) SSH 설정
- 이작업은 master ha구성 대상 서버간의 ssh 접속 허용 설정이 필요하다.
# ssh-keygen -t rsa // key generation. master 1,2,3 모두 실행
# ls -al ~/.ssh/ // ssh 확인. authorized_keys 파일은 최초 없다.
※ SSH 잠깐 참고
id_rsa | private key, 절대로 타인에게 노출되면 안된다. |
id_rsa.pub | public key, 접속하려는 리모트 머신의 authorized_keys에 입력한다. |
authorized_keys | 리모트 머신의 .ssh 디렉토리 아래에 위치하면서 id_rsa.pub 키의 값을 저장한다. |
- SSH Server의 authorized_keys 의 내용이 SSH Client의 id_rsa.pub 파일과 같아야 한다.
- 그래서 ssh 접속을 할 때 id_rsa 파일과 authorized_keys 파일의 내용을 비교 할 수 있다. 일반적으로 SCP를 사용한다 .
- SCP는 파일을 전송하는 프로그램인데, 아래와 같은 형식을 갖는다.
- scp $HOME/.ssh/id_rsa 리모트 머신의 아이디@리모트 머신의 호스트 주소:저장할 파일
// master 1번에서 실행. id_rsa.pub 파일을 마스터 2,3번의 홈디렉토리로 전송
# scp /root/.ssh/id_rsa.pub root@<master2 ip>:id_rsa.pub
# scp /root/.ssh/id_rsa.pub root@<master3 ip>:id_rsa.pub
// master 2, 3 서버에서 실행. authorized_keys 생성
# cat /root/id_rsa.pub >> /root/.ssh/authorized_keys
// master 1번에서 노드 간 SSH를 사용하여 연결이 올바르게 작동하는지 체크
# ssh -A <master2 ip>
# exit // 성공하면 ssh 접속한 것이므로 반드시 exit!
# ssh -A <master3 ip>
# exit
// sshs host allow 설정 확인 (master 1 예, 2,3 서버도 상호 연결 위해 추가)
# cat /etc/hosts.allow
sshd:<master2 ip>,<master3 ip>
2) kube-apiserver Load Balancer 설정
- HA 구성을 위해, master 1,2,3의 api server를 load balaning 하기 위한 설정.
- 이 Load Balancer가 api server의 게이트웨이 역활을 하게 된다.
- 사전 준비 : 실제 방화벽에서 허용되는 사용되지 않는 IP 1개. (api server의 가상 IP로 사용) 이 후로 이 IP를 '대표가상IP'라고 하겠다.
// 모든 master node에 haproxy 와 keepalived 설치 (haproxy는 1.5 버전 이상부터 SSL 지원)
# yum install haproxy
# haproxy -v // 설치 확인
# yum install keepalived
// 부팅시 자동 실행 설정
# chkconfig haproxy on && chkconfig keepalived on && chkconfig | egrep 'haproxy|keepalived
// 모든 master ndoe에 non-local Virtual IPs binding
# echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf && sysctl -p
//-------------------------------------------------
// keepalived 설정
# cd /etc/keepalived
# mv keepalived.conf keepalived.conf.org // 원본 백업(모든 master 동일)
# vi /etc/keepalived/keepalived.conf
// master 1번 example
global_defs {
notification_email {
test@test.com #email 설정 가능?
test2@test.com
}
notification_email_from lb1@test .com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_script chk_haproxy { # haproxy 살아있는지 체크
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 사용할 인터페이스 설정 (ifconfig 로 확인 가능)
virtual_router_id 51 # 셋다 같아야 한다. (중요! - 다른 keepalived 구성 군이 사용하는 아이디와 달라야 한다. 충돌난다. 즉, 관리를 해줘야 한다!!)
priority 101 # 우선순위 설정
advert_int 1 #VRRP패킷 송신 간격. 초단위로 지정
authentication {
auth_type PASS # 평문 인증 설정
auth_pass 1111 # 인증을 위한 키 (모두 동일값)
}
virtual_ipaddress {
xxx.xxx.xxx.xxx # 대표가상IP
}
track_script {
chk_haproxy
}
}
// master 2번 example
~ 동일 ~
vrrp_instance VI_2 { #instance 이름은 다르게 하여, 로그에서 구분 가능하게 한다.
state BACKUP #BACKUP으로 설정
interface eth0
virtual_router_id 51
priority 100 #우선순위를 조절 한다.
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
xxx.xxx.xxx.xxx
}
track_script {
chk_haproxy
}
}
// master 3번 example
~ 동일 ~
vrrp_instance VI_3 { #instance 이름은 다르게 하여, 로그에서 구분 가능하게 한다.
state BACKUP #BACKUP으로 설정
interface eth0
virtual_router_id 51
priority 99 #우선순위를 조절 한다.
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
xxx.xxx.xxx.xxx
}
track_script {
chk_haproxy
}
}
// keepalived 실행 (모든 master 동일)
# systemctl enable keepalived
# systemctl start keepalived
// master 1에서 대표가상IP 추가 확인 (BACKUP서버에는 안보인다.)
# ip addr show eth0
//-------------------------------------------------
// haproxy 설정 (모든 master 공통)
# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.org // 원본 백업
# vi /etc/haproxy/haproxy.cfg
// examples
global
log 127.0.0.1 local2
maxconn 2000
uid 0
gid 0
daemon # background process
defaults
log global # global 설정 사용
mode tcp # SSL 통신을 위해서는 tcp 모드로 (http모드는 SSL 안됨)
option tcplog
option dontlognull # 데이터가 전송되지 않은 연결 로깅 제외 (This is not recommended for environments such as web applications over the Internet where null connections could indicate malicious activities such as open port-scanning for vulnerabilities)
retries 3 # 연결 요청 재 시도 횟수
#option redispatch
maxconn 2000
#timeout http-request 10s
#timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
frontend ssl_front
bind xxx.xxx.xxx.xxx:16443 #대표가상IP (kube-master 와 같은 머신을 사용하므로 port를 kube-apiserver와 다르게 설정)
default_backend ssl_backend
backend ssl_backend
balance roundrobin
option tcp-check # ssl-hello-chk option 사용하지 말것 - ssl3.0 protocol 이라 k8s api 서버 오류 유발 (TLS 1.2 이상만 지원)
server <master1 hostname> <master1 ip>:6443 check
server <master2 hostname> <master2 ip>:6443 check
server <master3 hostname> <master3 ip>:6443 check
//haproxy 실행
# systemctl enable haproxy
# systemctl start haproxy
// keepalived & haproxy 상태 확인 (모든 master)
# systemctl status keepalived
# systemctl status haproxy
// keepalived는 MASTER상태 외에는 전부 BACKUP으로 표시되어야 한다. 아니라면, keepalived를 모두 재시작해주고 다시 확인하자.
3) Master Node 구성
3-1) master 1번
- HA를 구성하는 Master의 kubeadm, kubelet 버전이 같음을 확인하자.
- # kubeadm version
//1) kubeadm-config.yaml 파일 생성 (작업 경로 무관)
# vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.3 // 버전 확인 (kubeadm version)
apiServerCertSANs:
- "xxx.xxx.xxx.xxx" // LoadBalancer 대표가상IP
api:
controlPlaneEndpoint: "xxx.xxx.xxx.xxx:16443" // LoadBalancer 대표가상IP:지정PORT
etcd:
local:
extraArgs:
listen-client-urls: "https://127.0.0.1:2379,https://<master1 ip>:2379"
advertise-client-urls: "https://<master1 ip>:2379"
listen-peer-urls: "https://<master1 ip>:2380"
initial-advertise-peer-urls: "https://<master1 ip>:2380"
initial-cluster: "<master1 hostname>=https://<master1 ip>:2380" // hostname은 반드시 소문자로만!
serverCertSANs:
- <master1 hostname>
- <master1 ip>
peerCertSANs:
- <master1 hostname>
- <master1 ip>
networking:
podSubnet: "<x.x.x.x/x>" //network add-on 설정한 pod network 지정 가능
//2) kubeadm init 실행
# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# kubeadm init --config kubeadm-config.yaml // 결과 출력 copy 저장 (node join 정보)
//3) 다른 master 2, 3 서버로 파일 복사
// 대상 파일
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/sa.key
/etc/kubernetes/pki/sa.pub
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/admin.conf
// copy 실행 (.sh 파일로 만들면 '# sh sh파일명' 으로 실행 가능)
# USER=ubuntu // root 일경우는? (/root/ 경로로 복사됨)
# CONTROL_PLANE_IPS="<master2 ip> <master3 ip>"
# for host in ${CONTROL_PLANE_IPS}; do
scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
scp /etc/kubernetes/admin.conf "${USER}"@$host:
done
3-2) master 2번
//1) kubeadm-config.yaml 파일 생성
# vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.3
apiServerCertSANs:
- "xxx.xxx.xxx.xxx" // LoadBalancer 대표가상IP
api:
controlPlaneEndpoint: "xxx.xxx.xxx.xxx:16443"
etcd:
local:
extraArgs:
listen-client-urls: "https://127.0.0.1:2379,https://<master2 ip>:2379"
advertise-client-urls: "https://<master2 ip>:2379"
listen-peer-urls: "https://<master2 ip>:2380"
initial-advertise-peer-urls: "https://<master2 ip>:2380"
initial-cluster: "<master1 hostname>=https://<master1 ip>:2380,<master2 hostname>=https://<master2 ip>:2380"
initial-cluster-state: existing
serverCertSANs:
- <master2 hostname>
- <master2 ip>
peerCertSANs:
- <master2 hostname>
- <master2 ip>
networking:
podSubnet: "<x.x.x.x/x>" //network add-on 설정한 pod network 지정 가능
// ip_forward 확인
# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
//2) copy된 파일을 정확한 경로로 복사
# USER=ubuntu # customizable //root 일경우는 /root/
# mkdir -p /etc/kubernetes/pki/etcd
# mv /home/${USER}/ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/ca.key /etc/kubernetes/pki/
# mv /home/${USER}/sa.pub /etc/kubernetes/pki/
# mv /home/${USER}/sa.key /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/
# mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
# mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf
//3) kubelet bootstrap을 위한 명령 실행
# kubeadm alpha phase certs all --config kubeadm-config.yaml
# kubeadm alpha phase kubelet config write-to-disk --config kubeadm-config.yaml
# kubeadm alpha phase kubelet write-env-file --config kubeadm-config.yaml
# kubeadm alpha phase kubeconfig kubelet --config kubeadm-config.yaml
# systemctl start kubelet
//4) etcd cluster 에 node 등록
# export CP0_IP=<master1 ip>
# export CP0_HOSTNAME=<master1 hostname> //hostname은 언제나 반드시 소문자!
# export CP1_IP=<master2 ip>
# export CP1_HOSTNAME=<master2 hostname>
# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl exec -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://${CP0_IP}:2379 member add ${CP1_HOSTNAME} https://${CP1_IP}:2380
# kubeadm alpha phase etcd local --config kubeadm-config.yaml
//5) node를 Master로 배포
# kubeadm alpha phase kubeconfig all --config kubeadm-config.yaml
# kubeadm alpha phase controlplane all --config kubeadm-config.yaml
# kubeadm alpha phase mark-master --config kubeadm-config.yaml
3-3) master 3번
//1) kubeadm-config.yaml 파일 생성
# vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.3
apiServerCertSANs:
- "xxx.xxx.xxx.xxx" // LoadBalancer 대표가상IP
api:
controlPlaneEndpoint: "xxx.xxx.xxx.xxx:16443"
etcd:
local:
extraArgs:
listen-client-urls: "https://127.0.0.1:2379,https://<master3 ip>:2379"
advertise-client-urls: "https://<master3 ip>:2379"
listen-peer-urls: "https://<master3 ip>:2380"
initial-advertise-peer-urls: "https://<master3 ip>:2380"
initial-cluster: "<master1 hostname>=https://<master1 ip>:2380,<master2 hostname>=https://<master2 ip>:2380,<master3 hostname>=https://<master3 ip>:2380"
initial-cluster-state: existing
serverCertSANs:
- <master3 hostname>
- <master3 ip>
peerCertSANs:
- <master3 hostname>
- <master3 ip>
networking:
podSubnet: "<x.x.x.x/x>" //network add-on 설정한 pod network 지정 가능
// ip_forward 확인
# cat /proc/sys/net/ipv4/ip_forward
// 결과 1이 아니면,
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
//2) copy된 파일을 정확한 경로로 복사
# USER=ubuntu # customizable
# mkdir -p /etc/kubernetes/pki/etcd
# mv /home/${USER}/ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/ca.key /etc/kubernetes/pki/
# mv /home/${USER}/sa.pub /etc/kubernetes/pki/
# mv /home/${USER}/sa.key /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
# mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/
# mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
# mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf
//3) kubelet bootstrap을 위한 명령 실행
# kubeadm alpha phase certs all --config kubeadm-config.yaml
# kubeadm alpha phase kubelet config write-to-disk --config kubeadm-config.yaml
# kubeadm alpha phase kubelet write-env-file --config kubeadm-config.yaml
# kubeadm alpha phase kubeconfig kubelet --config kubeadm-config.yaml
# systemctl start kubelet
//4) etcd cluster 에 node 등록
# export CP0_IP=<master1 ip>
# export CP0_HOSTNAME=<master1 hostname>
# export CP2_IP=<master3 ip>
# export CP2_HOSTNAME=<master3 hostname>
# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl exec -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://${CP0_IP}:2379 member add ${CP2_HOSTNAME} https://${CP2_IP}:2380
# kubeadm alpha phase etcd local --config kubeadm-config.yaml
//5) node를 Master로 배포
# kubeadm alpha phase kubeconfig all --config kubeadm-config.yaml
# kubeadm alpha phase controlplane all --config kubeadm-config.yaml
# kubeadm alpha phase mark-master --config kubeadm-config.yaml
5. pod network add on 설치
- pod 들간의 communication 을 위한 container networks interface 설치 (NCI) 필수.
- 설치되는 add-on을 통해 pod의 가상 네트워크 ip 대역대를 설정할 수 있다.
- 이 add-on을 통해 CoreDNS 가 활성화 된다.
- 대상 : master 1번 (single구성은 그냥 master)
# cat /proc/sys/net/bridge/bridge-nf-call-iptables // 1 세팅 확인
# sysctl net.bridge.bridge-nf-call-iptables=1 // 1이 아니면 실행
// add-on install (weave net)
# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
// master 상태 확인
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 15h v1.11.3
master2 Ready master 15h v1.11.3
master3 Ready master 15h v1.11.3
# kubectl get pods --all-namespaces
kube-system coredns-78fcdf6894-969pp 1/1 Running 0 15h //-> core dns 실행 확인
6. Worker Node Join
- Kubernetes Master에 노드를 추가하기 위해서는 Master에서 kubeadm init을 했을 때, 출력된 join 명령을 사용 한다.
- 대상 : 모든 worker node
# cat /proc/sys/net/ipv4/ip_forward // 1 세팅 확인
# echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward // 1이 아니면 실행
# kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
// ---------------------
// 아래의 경우 master 서버에서 확인 가능
// token을 잊은 경우
# kubeadm token list
// token이 만료된 경우 (default 24시간)
# kubeadm token create
// --discovery-token-ca-cert-hash 값 확인 방법
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
※ Master Isolation (Optional)
- 기본적으로 kubernetes는 Master에 pod을 배포하지 않음. 이를 제거하고 Master에도 pod을 배포하고 싶은 경우
# kubectl taint nodes --all node-role.kubernetes.io/master-
- Daemon Set도 마찬가지이나, 이 유형은 배포 yaml에 다음의 옵션을 추가함으로써 Master독립모드에서도 Master에 배포 가능하다.
tolerations:
- effect: NoSchedule
operator: Exists
※ 초기화
// 먼저 노드를 해제하고, 노드를 종료하기 전에 노드가 비어 있는지 확인해야 한다.
// master ha 모드에서도 모든 마스터 노드를 drain하고, 모든 master, 및 노드 에서 reset 한다.
# kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
# kubectl delete node <node name>
// 모든 Master,노드에서 kubeadm 설치 상태를 재설정
# kubeadm reset
// kubernetes를 shutdown/reset 후에 Network add-on 삭제 수행
# weave reset
# rm /opt/cni/bin/weave-*
// kubeadm 부터 다시 install 하려고 하면, 다음과 같이 삭제
# yum remove -y kubelet kubeadm kubectl
초기화를 하고 나면, kubelet이 stop상태가 되므로, start 하고 Master 세팅을 해야 한다. 하지만, 그 전에 먼저 kubelet을 설치할때의 설정들을 다시 확인해보고 start 하자.
※ 마스터가 죽어서 reboot 되었을때, kubelet이 재시작 Fail 나면 (Node Not Ready)
# /var/log/containers 에서 kubelet log 확인
//재시작 되면, swapoff 가 리셋됨
# swapoff -a
# cat /proc/sys/net/ipv4/ip_forward 1 인지 확인 -> # echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
//SELinux disable도 확인
# setenforce 0
# systemctl daemon-reload
# systemctl restart kubelet
'cloud&platform' 카테고리의 다른 글
Kafka 기본 개념 (0) | 2020.11.09 |
---|---|
Docker 기본 개념 (0) | 2020.10.26 |
Spring Core - IoC, DI, Context And Bean (0) | 2020.10.22 |
Spring Overview (0) | 2020.10.20 |
Kubectl command (0) | 2020.10.16 |