쿠버네티스 환경 구축
(1) 쿠버네티스란?
도커는 컨테이너를 규모에 맞게 늘려가도록 배치하는 기능이 부족
컨테이너 애플리케이션을 배포하는 오케스트레이터를 구글이 개발
구글은 내부 서비스를 클라우드와 컨테이너 환경으로 오래전부터 사용
구글이 2014년 6월 오픈소스 프로젝트로 발표
2015년 7월 버전 1.0을 기반으로 CNCF(Cloud Native Computing Foundation)을 설립
레드햇, 이베이, AT&T, 시스코, IBM, 인텔, 트위터, VMware 등 다수 회사참여 개발
(2) 쿠버네티스 설치
1) 설치 환경
[1] 개발 용도의 쿠버네티스
Minikube
Docker for Windows에 내장
* 로컬 환경에서 스탠드 얼론 방식으로 동작, 마스터와 노드가 동일한 호스트에 실행,
기본 작동 방식을 이해 하기 유리하지만, 실제 환경에 적용하기 적절치 못함
[2] 서비스 테스트 또는 운영 용도의 쿠버네티스
kuberspray (자체 서버)
kubeadm (자체 서버)
EKS,GEK (퍼블릭 클라우드 이용)
쿠버네티스 클러스터 : 하나의 마스터와 최소 두 개 이상의 노드로 구성, 각각 별도의 시스템에서 구동, 필요할 때마다 노드를 추가해 용량을 늘려야
하는 실제 환경에서의 구성 방식
(3) Centos 8에 설치 진행 (가상머신 3대 준비, CPU 2, MEM 4GB)
1) 방화벽 설정
[1] master
[2] node1
[3] node2
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --reload
modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
init 6
2) 호스트 이름 설정
[1] master
[2] node1
[3] node2
vi /etc/hostname
각 이름에 맞게 설정
vi /etc/hosts
[master IP] master
[node1 IP] node1
[node2 IP] node2
3) 도커 설치
[1] master
[2] node1
[3] node2
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-nightly
yum-config-manager --enable docker-ce-test
yum install -y docker-ce docker-ce-cli containerd.io --allowerasing
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
4) k8s 설치
[1] master
[2] node1
[3] node2
firewall-cmd --add-masquerade --permanent
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --reload
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system 확인하는 명령어, 위 내용이 추가되어 있어야 함
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
systemctl start kubelet
이때 status 확인하면 active 안뜨는 게 정상이다.
5) k8s swap 설정
[1] master
[2] node1
[3] node2
swapoff -a
vi /etc/fstab
/dev/mapper/cl-swap none swap defaults 0 0 이걸 다음처럼 변경, 주석 처리
#/dev/mapper/cl-swap none swap defaults 0 0
6) 마스터 설정
[1] master 이거는 다른 네트워크 대역에서 추가할 때 사용 이거 추가하려면 6443 포트 포트포워딩
kubeadm init --pod-network-cidr [컨테이너의 네트워크 대역]/24 --control-plane-endpoint "192.168.0.100" <- 윈도우 컴퓨터 IP
ex) kubeadm init --pod-network-cidr 100.100.100.0/24
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes 로 확인, 일단 마스터만 나옴
아래의 에러가 나면
Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")이걸 실행
unset KUBECONFIG
export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):(id -g) $HOME/.kube/config
7) 워커 설정
[2] node1
[3] node2
firewall-cmd --zone=public --permanent --add-port={10250,30000-32767}/tcp
firewall-cmd --reload
위 명령어는 마스터에서 복사했던 명령어, 강사꺼 그대로 복사하면 안됨
위 명령어는 마스터에서 복사했던 명령어, 강사꺼 그대로 복사하면 안됨
위 명령어는 마스터에서 복사했던 명령어, 강사꺼 그대로 복사하면 안됨
kubeadm join 192.168.100.10:6443 --token 2k7pts.1nqukldqk31y27dq \
--discovery-token-ca-cert-hash sha256:657576c167484ce6df1b09bd84c9ec95a5752cce108fe82e2bbe43b63e8091e3
위 명령어는 마스터에서 복사했던 명령어, 강사꺼 그대로 복사하면 안됨
위 명령어는 마스터에서 복사했던 명령어, 강사꺼 그대로 복사하면 안됨
위 명령어는 마스터에서 복사했던 명령어, 강사꺼 그대로 복사하면 안됨
8) 확인
kubectl get pod -n kube-system 다 Running으로 잘 되는지 확인
kubectl get nodes 다 Ready로 뜨는지 확인
9) 네트워크 CNI 설정
https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-50-nodes-or-less
curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml -O
vi calico.yaml
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
- name: CALICO_IPV4POOL_CIDR
value: "200.200.200.0/24"
kubectl apply -f calico.yaml
10) 대시보드 설정
[1] master
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
vi recommended.yaml
45번 라인을 추가
39 spec:
40 ports:
41 - port: 443
42 targetPort: 8443
43 selector:
44 k8s-app: kubernetes-dashboard
45 type: NodePort
kubectl apply -f recommended.yaml
kubectl get services -n kubernetes-dashboard
443:포트번호
포트번호를 확인
firewall-cmd --permanent --add-port=확인한포트번호/tcp
firewall-cmd --reload
윈도우의 웹 브라우저로 https://마스터노드IP:확인한포트번호 접속
크롬에서 안전하지 않은페이지 뜰 때 브라우저 아무 곳에나 thisisunsafe 입력
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
EOF
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
kubectl -n kube-system create token admin-user
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') 명령어로 토큰 확인 후 웹브라우저에서 로그인
kubectl get pods -A
관리자 세션 타임아웃 설정
kubectl edit deployment kubernetes-dashboard -n kubernetes-dashboard
spec:
containers:
- args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
- --token-ttl=0 # <-- add this with your timeout
image: kubernetesui/dashboard:v2.0.0