본문 바로가기

DevOps/쿠버네티스

쿠버네티스 설치


준비물

  • 8 hours
  • 4 server for kubernetes

===총 4개의 쿠퍼네티스 노드

$ sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux


$ setenforce 0


$ cat <<EOF >  /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

EOF


$ sysctl --system


$ swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab


$ reboot


$ yum install -y kubelet-1.9.3-0.x86_64 kubeadm-1.9.3-0.x86_64 kubectl-1.9.3-0.x86_64 git

$ systemctl enable kubelet && systemctl start kubelet


##kublet, kubeadmin, kubectl 설치를 위한 명령어


$ sed -i 's/systemd/cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf


##도커와 cgroup을 동일하게 맞추기 위해서 변경


$ systemctl daemon-reload && systemctl restart kubelet


$ yum install -y keepalived


$ systemctl enable keepalived && systemctl restart keepalived




======= 3개의 마스터노드

$ cd kubeadm-ha


##github로 부터 설치 config파일을 가져와서 설치. yml이 생성됨


$ ./setting.sh

#!/bin/bash

# local machine ip address
export K8SHA_IPLOCAL=10.10.12.##

# local machine etcd name, options: etcd1, etcd2, etcd3
export K8SHA_ETCDNAME=etcd1

# local machine keepalived state config, options: MASTER, BACKUP. One keepalived cluster only one MASTER, other's are BACKUP
export K8SHA_KA_STATE=MASTER

# local machine keepalived priority config, options: 102, 101, 100. MASTER must 102
export K8SHA_KA_PRIO=102

# local machine keepalived network interface name config, for example: eth0
export K8SHA_KA_INTF=ens192

#######################################
# all masters settings below must be same
#######################################

# master keepalived virtual ip address
export K8SHA_IPVIRTUAL=10.10.12.#6

# master01 ip address
export K8SHA_IP1=10.10.12.#1

# master02 ip address
export K8SHA_IP2=10.10.12.#2

# master03 ip address
export K8SHA_IP3=10.10.12.#3

# master01 hostname
export K8SHA_HOSTNAME1=host##-1.cloud.com

# master02 hostname
export K8SHA_HOSTNAME2=host##-2.cloud.com

# master03 hostname
export K8SHA_HOSTNAME3=host##-3.cloud.com

# keepalived auth_pass config, all masters must be same
export K8SHA_KA_AUTH=4cdf7dc3b4c90194d1600c483e10ad1d

# kubernetes cluster token, you can use 'kubeadm token generate' to get a new one
export K8SHA_TOKEN=7f276c.0741d82a5337f526

# kubernetes CIDR pod subnet, if CIDR pod subnet is "10.244.0.0/16" please set to "10.244.0.0\\/16"
export K8SHA_CIDR=10.244.0.0\\/16



# kubernetes CIDR service subnet, if CIDR service subnet is "10.96.0.0/12" please set to "10.96.0.0\\/12"
export K8SHA_SVC_CIDR=10.96.0.0\\/12

# calico network settings, set a reachable ip address for the cluster network interface, for example you can use the gateway ip address

export K8SHA_CALICO_REACHABLE_IP=10.10.12.1



##############################
# please do not modify anything below
##############################


# set etcd cluster docker-compose.yaml file

sed \
-e "s/K8SHA_ETCDNAME/$K8SHA_ETCDNAME/g" \
-e "s/K8SHA_IPLOCAL/$K8SHA_IPLOCAL/g" \
-e "s/K8SHA_IP1/$K8SHA_IP1/g" \
-e "s/K8SHA_IP2/$K8SHA_IP2/g" \
-e "s/K8SHA_IP3/$K8SHA_IP3/g" \
etcd/docker-compose.yaml.tpl > etcd/docker-compose.yaml

echo 'set etcd cluster docker-compose.yaml file success: etcd/docker-compose.yaml'


# set keepalived config file
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

cp keepalived/check_apiserver.sh /etc/keepalived/

sed \
-e "s/K8SHA_KA_STATE/$K8SHA_KA_STATE/g" \
-e "s/K8SHA_KA_INTF/$K8SHA_KA_INTF/g" \
-e "s/K8SHA_IPLOCAL/$K8SHA_IPLOCAL/g" \
-e "s/K8SHA_KA_PRIO/$K8SHA_KA_PRIO/g" \
-e "s/K8SHA_IPVIRTUAL/$K8SHA_IPVIRTUAL/g" \
-e "s/K8SHA_KA_AUTH/$K8SHA_KA_AUTH/g" \

keepalived/keepalived.conf.tpl > /etc/keepalived/keepalived.conf

echo 'set keepalived config file success: /etc/keepalived/keepalived.conf'

# set nginx load balancer config file

sed \
-e "s/K8SHA_IP1/$K8SHA_IP1/g" \
-e "s/K8SHA_IP2/$K8SHA_IP2/g" \
-e "s/K8SHA_IP3/$K8SHA_IP3/g" \
nginx-lb/nginx-lb.conf.tpl > nginx-lb/nginx-lb.conf



echo 'set nginx load balancer config file success: nginx-lb/nginx-lb.conf'



# set kubeadm init config file
sed \
-e "s/K8SHA_HOSTNAME1/$K8SHA_HOSTNAME1/g" \
-e "s/K8SHA_HOSTNAME2/$K8SHA_HOSTNAME2/g" \
-e "s/K8SHA_HOSTNAME3/$K8SHA_HOSTNAME3/g" \
-e "s/K8SHA_IP1/$K8SHA_IP1/g" \
-e "s/K8SHA_IP2/$K8SHA_IP2/g" \
-e "s/K8SHA_IP3/$K8SHA_IP3/g" \
-e "s/K8SHA_IPVIRTUAL/$K8SHA_IPVIRTUAL/g" \
-e "s/K8SHA_TOKEN/$K8SHA_TOKEN/g" \
-e "s/K8SHA_CIDR/$K8SHA_CIDR/g" \
-e "s/K8SHA_SVC_CIDR/$K8SHA_SVC_CIDR/g" \
kubeadm-init.yaml.tpl > kubeadm-init.yaml

echo 'set kubeadm init config file success: kubeadm-init.yaml'

# set canal deployment config file

sed \
-e "s/K8SHA_CIDR/$K8SHA_CIDR/g" \
-e "s/K8SHA_CALICO_REACHABLE_IP/$K8SHA_CALICO_REACHABLE_IP/g" \
kube-canal/canal.yaml.tpl > kube-canal/canal.yaml


echo 'set canal deployment config file success: kube-canal/canal.yaml'


$ docker-compose --file etcd/docker-compose.yaml up -d

## etcd설치


$ docker exec -ti etcd etcdctl cluster-health

## etcd 3개 health check. etcd는 3개 이상 잘 도착해야한다.


$ docker exec -ti etcd etcdctl member list

## etcd 멤버 확인, etcd 설치 완료





# master 01 에서 다음 작업 수행

$ kubeadm init --config=kubeadm-init.yaml

## 셀프 인증서 설치, config파일 생성, 컨테이너 올리는중. -> master 1 server 설치 완료


$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.141:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067

## 나중을 위해서 잠깐 master 1 토큰 저장


$ scp -r /etc/kubernetes/pki host##-2.cloud.com:/etc/kubernetes/

## 인증서를 2번으로 복사


$ scp -r /etc/kubernetes/pki host##-3.cloud.com:/etc/kubernetes/

## 인증서를 3번으로 복사

# master 02, master 03에서 다음 작업 수행

$ kubeadm init --config=kubeadm-init.yaml

##인증서 복사 후 master1과 같은 인증서로 2번, 3번도 설치 완료


$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.142:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067

##master 2 token(master 1 과 같은지 확인!!)


$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.143:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067

##master 3 token(master 1 과 같은지 확인!!)


##master1, 2, 3 token이 같으면 etcd가 묶인것

# all master nodes: set kubectl client environment variable

$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc

## 환경변수 설정


$ source ~/.bashrc

## 모든것이 정상적으로 되면 아래와 같이 명령어가 먹힘




# master 01 에서 다음 작업 수행

$ kubectl apply -f kube-canal/

##다음 명령으로 설치가 완료되기를 기다린다. network중에 canal을 사용할 것임. ACI NSX 같은 유료 엔터프라이즈 네트워크 시스템 사용해도 무관함.



$ watch kubectl get pods --all-namespaces

## 잘 깔렸는지 확인 0이 있으면 안됨!



$ kubectl get no

##아까와 다르게 이제 네트워크가 설정되면서 READY로 변했다.



$ kubectl taint nodes --all node-role.kubernetes.io/master-

##master에도 pod를 배포할수 있게끔 설정



$ kubectl apply -f kube-dashboard/

##gui 대시보드를 깔아보자


$ kubectl get pods --all-namespaces

##대시보드 깔렸는지 확인


kubectl apply -f kube-heapster/influxdb/

kubectl apply -f kube-heapster/rbac/

kubectl get pods --all-namespaces

##heapster


##대시보드, heapster깔리면 아래와 같이 보임


# all master nodes



$ systemctl restart keepalived

##keepalived service 확인

ping <VIP:10.10.12.#6>


$ docker-compose -f nginx-lb/docker-compose.yaml up -d

$ curl -k https://<VIP>:16443

##install nginx load balancer 로드밸런서 구성


##nignx가 설치잘되면 아래와 같이 보인다.



# any master nodes

kube-proxy configuration

set kube-proxy server settings

## 모든 kubectl이 연결되었기때문에 아무 마스터 node에서 실행하면됨.


$ kubectl edit -n kube-system configmap/kube-proxy

## 다음 값을 수정:  server: https://10.10.12.#4:16443


## delete all kube-proxy pod to restart it

$ kubectl get pods --all-namespaces -o wide | grep proxy

$ kubectl delete pod -n kube-system kube-proxy-XXX


##pod을 지우더라도 다시 생성됨을 볼 수 있음

# All Worker node 

$ kubeadm join --token 7f276c.0741d82a5337f526 10.10.12.141:6443 --discovery-token-ca-cert-hash sha256:1ad322228910b27a60c0998f7b20d0a67de7aa96177a8a5fa2dd7bc075768067

## 아까 1번 토큰으로 멤버 추가됨.

## 아래와 같이 간단하게 worker node를 추가 가능하다.



$ systemctl status kubelet.service

## kubelet은 데몬으로 돌고 있는 모습을 볼 수 있다. 다른 서비스들은 모두 도커로 돌림.


##kubectl을 사용하지 않고 k라는 약자로 사용하고 자동완성 기능 사용하려면 아래와 같이 설정하면 됨. - 나갔다 와도 잘됨

$ echo "alias k=kubectl" >> ~/.bashrc

$ echo "source <(kubectl completion bash | sed s/kubectl/k/g)" >> ~/.bashrc



$ k cordon <host>

$ k get no

## 특정 host가 이상증상이 있어서 신규에서 제외하고자 한다면 cordon하면 스케쥴링에서 제외되게 된다.(반대는 uncordon)


$ k drain <host> --ignore-daemonsets

$ k get no

## node를 제거 또는 재부팅 등을 위해서 pod들을 쫙 빼주는 역할


$ k delete no <host>

## drain 이후에 제거가능



$ kubeadm reset

## 빼진 member에는 반드시 위와 같이 reset을 해줘야함.. not master node



$ kubeadm token list

$ kubeadm token create

##member join할 일이 있을 때는 토큰을 사용한다.(expire time은 보통 23시간)


$ kubeadm join --token bdbe75.fc8510448b496a36 10.10.12.146:16443 --discovery-token-unsafe-skip-ca-verification

## member node에서 마스터의 토큰을 사용해서 join을 건다.(조인이 된 이후에는 token을 지우는게 보안에 좋다.)





## 다음 파일 편집-vip:16443

$ vi /etc/kubernetes/bootstrap-kubelet.conf

$ vi /etc/kubernetes/kubelet.conf


$ grep 10.10.12 /etc/kubernetes/*.conf


$ systemctl restart docker && systemctl restart kubelet