최종판을 여기에 매번 업데이트를 할 예정이다.
가급적 서버를 재부팅해도 쓸 수 있도록 꼼꼼하게 명령어를 셋팅할 예정이다.
---- 2023 09 19 버전 ----
구성하기
3개 aws 만들기
chmod 600 ~/.ssh/k8s-key.pem chmod 600 ~/.ssh/config
키랑 컨피그 파일 권한추가해주기
도커설치
sudo apt-get update sudo apt-get install -y docker.io
sudo systemctl start docker sudo systemctl enable docker
크리도커 설치
**wget <https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.0/cri-dockerd_0.3.0.3-0.ubuntu-bionic_amd64.deb>
dpkg -i cri-dockerd_0.3.0.3-0.ubuntu-bionic_amd64.deb
systemctl status cri-docker
ls /var/run/cri-dockerd.sock**
인증서 업뎃
apt update apt install -y apt-transport-https ca-certificates curl
curl -fsSL <https://packages.cloud.google.com/apt/doc/apt-key.gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] <https://apt.kubernetes.io/> kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
#Update apt package index, install kubelet, kubeadm and kubectl, and pin their version:
apt update
apt install -y kubelet=1.26.0-00 kubeadm=1.26.0-00 kubectl=1.26.0-00
apt-mark hold kubelet kubeadm kubectl
kubeadm join 172.31.10.115:6443 --token mfutvo.m6z4zqoh2mwajdt3 --discovery-token-ca-cert-hash sha256:9871ec598d5e76d23301a74d6138911c2c55a32ff6ab1ea953a7dfb7b6e9bc2e --cri-socket unix:///var/run/cri-dockerd.sock
—cri-socket 꼭하기
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
칼리코설치
**kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml**
호스트 이름을 변경하기 위해 호스트 운영 체제에 따라 다른 방법을 사용할 수 있습니다. 이 예에서는 Linux 운영 체제에서 호스트 이름을 변경하는 방법을 설명하겠습니다. 호스트 이름을 변경한 후에는 해당 호스트를 다시 부팅하여 변경 사항을 적용해야 합니다.
참고: 호스트 이름 변경은 관리자 권한이 필요하며 주의해서 진행해야 합니다.
- 호스트 이름 확인:
출력으로 현재 호스트 이름을 확인할 수 있습니다.bashCopy code hostname
- 현재 호스트 이름을 확인하려면 다음 명령을 실행합니다.
- 호스트 이름 변경:
- Ubuntu 및 Debian 기반 시스템:
- bashCopy code sudo hostnamectl set-hostname new-hostname
- CentOS 및 RHEL 기반 시스템:
- bashCopy code sudo hostnamectl set-hostname new-hostname
- 호스트 이름을 변경하려면 다음 단계를 따릅니다. 예를 들어 새로운 호스트 이름을 "new-hostname"으로 변경하는 경우입니다.
- 호스트 파일 수정:
호스트 파일 내에 새로운 호스트 이름과 해당 IP 주소를 추가합니다. 예를 들어:호스트 이름과 IP 주소는 실제 환경에 맞게 설정합니다.bashCopy code sudo nano /etc/hosts
- plaintextCopy code 127.0.0.1 localhost 192.168.1.10 new-hostname.example.com new-hostname
- 호스트 파일을 수정하여 새로운 호스트 이름을 추가합니다. 호스트 파일은 **/etc/hosts**에 위치합니다. 텍스트 편집기를 사용하여 호스트 파일을 엽니다.
- 호스트 재부팅:
호스트가 다시 부팅되면 새로운 호스트 이름이 적용됩니다.bashCopy code sudo reboot
- 호스트 이름 변경을 완료하고 호스트 파일을 수정한 후, 호스트를 다시 부팅하여 변경 사항을 적용합니다.
호스트 이름을 변경한 후에는 변경 사항이 모든 클러스터 노드에 적용되었는지 확인하고, 필요한 경우 다른 노드에서도 호스트 이름을 변경하십시오. 호스트 이름 변경은 클러스터 내의 호스트 식별을 용이하게 만들며, 쿠버네티스 클러스터 설정 및 관리에 중요합니다.
칼리코 라우팅설치
curl -L https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64 -o calicoctl
권한넣기
chmod +x calicoctl mv calicoctl /usr/bin
# 적용 꼭하기
calicoctl apply -f ipipmode.yaml
calicoctl get ippool -o wide
해보면 never이라고 되어있을거고
이후 아래 복붙
cat << END > ipipmode.yaml apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: blockSize: 26 cidr: 192.168.0.0/16 ipipMode: Always natOutgoing: true nodeSelector: all() vxlanMode: Never END
# 루트 권한이 아닌 우분투 사용자도 kubectl 명령 실행 설정
mkdir -p ~ubuntu/.kube
cp -i /etc/kubernetes/admin.conf ~ubuntu/.kube/config
chown -R ubuntu:ubuntu ~ubuntu/.kube
재부팅하고나서는
sudo systemctl restart kubelet
이거만 해주면 된다
# master node
sudo mkdir -p /data/cka /var/CKA2022/
sudo apt update
sudo apt install wget curl tree -y
# 워커 노드 라벨 설정
kubectl label node worker1 disktype=ssd gpu=true
kubectl label node worker2 disktype=std
kubectl get node -L disktype,gpu
# 각 워커노드에 폴더 생성
mkdir -p /data/{app-data,volume,storage,cka} /app/storage/storage{1,2,3}
다하고나서 환경구성
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Namespace
metadata:
name: migops
labels:
team: migops
---
apiVersion: v1
kind: Namespace
metadata:
name: devops
labels:
team: devops
---
apiVersion: v1
kind: Namespace
metadata:
name: presales
labels:
team: presales
---
## namespcae customera
apiVersion: v1
kind: Namespace
metadata:
name: customera
labels:
partition: customera
---
## namespcae customera
apiVersion: v1
kind: Namespace
metadata:
name: customerb
labels:
partition: customerb
---
## deploy and service-port추가해서
## k8s
apiVersion: apps/v1
kind: Deployment
metadata:
name: front-end
spec:
selector:
matchLabels:
run: nginx
replicas: 2
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: http
image: nginx
---
## storage class를 가진 PV 생성준비
## 문제 : pvc생성 - pod 마운트 - pvc size 확장
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
- ReadOnlyMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: app-hostpath-sc
hostPath:
path: /data/storage
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
- ReadOnlyMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: app-data-sc
hostPath:
path: /data/volume
---
## sidecar container
apiVersion: v1
kind: Pod
metadata:
name: eshop-cart-app
spec:
containers:
- image: busybox
name: cart-app
command: ['/bin/sh', '-c', 'i=1;while :;do echo -e "$i: Price: $((RANDOM % 10000 + 1))" >> /var/log/cart-app.log; i=$((i+1)); sleep 2; done']
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- emptyDir: {}
name: varlog
---
## rolling update
## k8s
## replicas 수를 5개로 확장
apiVersion: apps/v1
kind: Deployment
metadata:
name: eshop-order
namespace: devops
spec:
replicas: 2
selector:
matchLabels:
name: order
template:
metadata:
name: order
labels:
name: order
spec:
containers:
- name: nginx-container
image: nginx:1.14
---
# NetworkPolicy
kind: Pod
apiVersion: v1
metadata:
name: web
namespace: migops
labels:
app: webwas
tier: frontend
spec:
containers:
- name: web
image: smlinux/cent-mysql:v1
command: ["/bin/bash"]
args: ["-c", "while true; do echo hello; sleep 10;done"]
---
kind: Pod
apiVersion: v1
metadata:
name: was
namespace: migops
labels:
app: webwas
tier: application
spec:
containers:
- name: was
image: smlinux/cent-mysql:v1
command: ["/bin/bash"]
args: ["-c", "while true; do echo hello; sleep 10;done"]
---
kind: Pod
apiVersion: v1
metadata:
name: db
namespace: migops
labels:
app: webwas
tier: database
spec:
containers:
- name: db
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: pass
---
## init container
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- name: nginx
image: nginx
command: ['sh', '-c', 'if [ ! -e "/opt/test" ];then exit;fi;']
volumeMounts:
- name: workdir
mountPath: /opt
volumes:
- name: workdir
emptyDir: {}
---
## log exam
apiVersion: v1
kind: Pod
metadata:
name: custom-app
namespace: default
spec:
containers:
- name: app
image: busybox
command: ['/bin/sh', '-c', 'while :;do echo -e "find files\\nerror: file not found\\nToday: $(date)\\nHostname: $(hostname)"; sleep 60; done']
---
## sidecar exam
apiVersion: v1
kind: Pod
metadata:
name: cka-webserver
namespace: default
spec:
containers:
- image: nginx:1.14
name: webserver
volumeMounts:
- mountPath: /var/log/nginx
name: log
volumes:
- name: log
emptyDir: {}
---
## cpu load :
apiVersion: v1
kind: Pod
metadata:
labels:
name: overloaded-cpu
name: campus-01
spec:
containers:
- name: campus
image: smlinux/vish-stress
resources:
limits:
cpu: "0.4"
memory: "300Mi"
requests:
cpu: "0.4"
memory: "250Mi"
args:
- -cpus
- "1"
- -mem-total
- "150Mi"
- -mem-alloc-size
- "100Mi"
- -mem-alloc-sleep
- "1s"
---
apiVersion: v1
kind: Pod
metadata:
labels:
name: overloaded-cpu
name: fast-01
spec:
containers:
- name: fast
image: smlinux/vish-stress
resources:
limits:
cpu: "0.2"
memory: "300Mi"
requests:
cpu: "0.2"
memory: "250Mi"
args:
- -cpus
- "1"
- -mem-total
- "250Mi"
- -mem-alloc-size
- "100Mi"
- -mem-alloc-sleep
- "1s"
---
#multi-container
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do sleep 1000; done"]
EOF
etcd 설치
# master
export RELEASE=$(curl -s <https://api.github.com/repos/etcd-io/etcd/releases/latest|grep> tag_name | cut -d '"' -f 4)
wget <https://github.com/etcd-io/etcd/releases/download/${RELEASE}/etcd-${RELEASE}-linux-amd64.tar.gz>
tar xf etcd-${RELEASE}-linux-amd64.tar.gz
cd etcd-${RELEASE}-linux-amd64
sudo mv etcd etcdctl etcdutl /usr/local/bin
etcd --version
cd
sudo ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \\
--cacert=/etc/kubernetes/pki/etcd/ca.crt \\
--cert=/etc/kubernetes/pki/etcd/server.crt \\
--key=/etc/kubernetes/pki/etcd/server.key \\
snapshot save /data/etcd-snapshot-previous.db
metric 서버 설치
# master
wget <https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml>
# vi components.yaml 수정
...
129 metadata:
130 labels:
131 k8s-app: metrics-server
132 spec:
133 containers:
134 - args:
135 - --cert-dir=/tmp
136 - --secure-port=4443
137 - --kubelet-insecure-tls # 추가
...
...
175 dnsPolicy: ClusterFirst # 추가
176 hostNetwork: true # 추가
177 nodeSelector:
178 kubernetes.io/os: linux
...
# yaml 파일 실행
kubectl apply -f components.yaml
# 메트릭 Pod 실행 확인
kubectl get pods -A
# 메모리, CPU 사용량 확인
kubectl top nodes
이거 잘 수정해야됨 이렇게
마지막
sudo apt-get install resolvconf
sudo vi /etc/resolvconf/resolv.conf.d/base
...
search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
options ndots:5
sudo /etc/init.d/resolvconf start
echo "nameserver 10.96.0.10" | sudo tee /etc/resolvconf/resolv.conf.d/head
마지막으로 이제 하면 끝!
kubectl top nodes
'ETC > CKA, CKAD, CKS' 카테고리의 다른 글
CKA 자격증 준비 2 - 도커엔진, 쿠버네티스 설치하기 (에러 해결법 포함) (0) | 2023.09.15 |
---|---|
CKA 자격증 준비 1 - 환경설정하기 (0) | 2023.09.13 |