개요
쿠버네티스 설치를 완료했다면, 실사용하기 위해 필요한 것들을 설치할 차례입니다. NFS로 볼륨을 구성하기 위한 csi-driver-nfs, (정확하지 않은 표현이지만) 리버스 프록시 역할을 해줄 Ingress-Nginx, 온프레미스 환경의 로드밸런서 MetalLB, 쿠버네티스 Dashboard, 도커를 통해 친숙해진 Portainer등을 구성해 보겠습니다.
CSI-Driver-NFS
설치
쿠버네티스에서 NFS를 사용하기 위해선 NFS CSI Driver라는 플러그인이 필요합니다. 이 플러그인이 유일한 것은 아니고, 몇 가지 종류가 있는데, 스냅샷 기능을 지원하는 NFS CSI Driver for Kubernetes를 설치하겠습니다
이를 위해선 호스트에 먼저 nfs-utils 패키지가 설치되어 있어야 합니다(데비안 계열의 경우 nfs-common).
dnf install -y nfs-utils
단일 노드라면 이 과정으로 끝나겠지만, 여러 대의 노드가 모두 이 패키지를 설치해야 하므로 Ansible을 이용해 일괄 설치하면 편하겠죠.
Ansible 제어 노드에서 아래 명령어를 사용해 모든 노드에 nfs-utils 패키지를 설치해 줍니다.
ansible all -i inventory/k8s_fenta/hosts.yaml -m shell -a "dnf install -y nfs-utils" -b --become-user root
패키지 설치가 완료되었다면, 쿠버네티스 마스터 노드로 돌아와서 helm chart로 설치합니다.
–set controller.replicas=3의 경우 제가 필요에 의해 워커 노드 수만큼 레플리카를 늘린 것으로, 없어도 무방합니다.
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm repo update
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version v4.7.0 --set externalSnapshotter.enabled=true --set controller.replicas=3
"csi-driver-nfs" has been added to your repositories
NAME: csi-driver-nfs
LAST DEPLOYED: Thu Jun 13 17:07:41 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The CSI NFS Driver is getting deployed to your cluster.
To check CSI NFS Driver pods status, please run:
kubectl --namespace=kube-system get pods --selector="app.kubernetes.io/instance=csi-driver-nfs" --watch
로그 마지막의 명령어를 통해 파드가 모두 설치된 것을 확인할 수 있습니다.
kubectl --namespace=kube-system get pods --selector="app.kubernetes.io/instance=csi-driver-nfs" --watch
StorageClass 생성
마운트할 NFS서버로부터 공유폴더의 경로를 가져와야 합니다.
저는 사용중인 TrueNAS에서 NFS공유를 설정하고 Maproot를 지정해 클라이언트의 root에게 권한을 주었습니다.
홈서버에서 많이 사용하는 헤놀로지를 사용해도 좋습니다.
이제, 쿠버네시트 마스터 노드에서 파일을 하나 생성합니다. 이 파일은 쿠버네티스의 파드들이 사용할 저장소를 동적으로 할당할 수 있도록 해 줍니다.
nano nfs-storage.yaml
아래의 내용을 붙여넣고 강조 표시된 부분은 개별 환경에 맞추어 수정해 주세요.
- metadata.name : 이 저장소의 이름
- parameters.server : NFS서버(이 글에서는 TrueNAS)의 IP주소
- parameters.share : NFS서버에서 공유된 폴더의 경로(이 글에서는 /mnt/apps/k8s)
- nfsver : NFS프로토콜 버전 지정(생략 가능)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-truenas-apps
provisioner: nfs.csi.k8s.io
parameters:
server: 10.50.10.50
share: /mnt/apps/k8s
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
mountOptions:
- nfsvers=4.2
그 외의 옵션에 대해 간략하게 나열해 놓겠습니다.
- reclaimPolicy : 컨테이너가 종료될 경우 바인딩 된 볼륨의 내용을 결정 (Retain – 유지, Recycle – 볼륨 유지 및 데이터 삭제, Delete – 볼륨 삭제)
- allowVolumeExpansion : 볼륨 확장 가능 여부 (NFS에서는 파일 시스템의 크기를 따라가므로 크게 의미 없음)
- volumeBindingMode : 동적 프로비저닝(이 글의 방식)에서 볼륨이 컨테이너에 바인딩되는 시점(WaitForFirstConsumer – 바인딩 시도하는 컨테이너가 있을 때, Immediate – 즉시)
작성이 완료되면 편집기를 닫고 나와 쉘에서 아래와 같이 입력합니다.
kubectl apply -f nfs-storage.yaml
storageclass.storage.k8s.io/nfs-truenas-apps created
아래 명령을 통해 생성된 StorageClass(sc)를 확인할 수 있습니다.
kubectl get sc -A
이후 파드가 사용할 볼륨을 생성하고 바인딩하는 것을 통해 사용할 수 있습니다.
문서의 아래에서 Portainer설치를 예시로 사용해볼 예정입니다.
MetalLB
설치
현재 상태에서 그냥 어플리케이션을 배포할 경우 쿠버네티스 내부의 Cluster IP만 갖게 됩니다. 외부에서도 접속 가능한 서비스를 계획하고 있다면, MetalLB를 설치하고 서비스에 IP를 할당해야 합니다.
(이 과정 없이, 파드가 작동되는 워커노드에서 포트를 열어 서비스하는 방법도 가능하지만, 쿠버네티스 외적으로 관리해야 합니다.)
우선, 공식 홈페이지에서 helm repo를 확인하고 추가합니다.
helm repo add metallb https://metallb.github.io/metallb
helm repo update
이전 단락처럼, 설치할 때 환경설정 값을 명시해서 설치할 수도 있지만, docker의 env처럼 쿠버네티스도 필요한 값을 따로 지정하여 사용할 수 있습니다.
helm에는 기본적으로 values.yaml이라는 이름으로 사용자가 값을 정의할 수 있는 부분이 따로 만들어져 있기 때문에, 해당 파일만 확인하면 됩니다.
방금 추가한 metallb의 values.yaml을 확인하려면 아래 명령어를 사용하면 됩니다.
helm show values metallb/metallb
전체의 내용을 저장하려면
helm show values metallb/metallb >> metallb-values.yaml
와 같이 명령하시면, metallb-values.yaml이란 파일로 저장됩니다.
해당 파일을 편집기로 열어 개별환경에 필요한 값을 설정할 수 있습니다.
예를 들어 loadBalancerClass를 설정 시(예시: metallb), 다른 서비스를 생성할 때 loadBalancerClass: metallb를 지정하면 metallb가 관리하고, 그렇지 않으면 다른 LoadBalancer가 관리하게 됩니다.
아래 명령어를 사용해 MetalLB를 설치하겠습니다(values를 별도로 건들지 않았다면 -f metallb-values.yaml은 제외하고 사용할 수 있습니다).
kubectl create namespace metallb
kubectl label namespace metallb pod-security.kubernetes.io/enforce=privileged
kubectl label namespace metallb pod-security.kubernetes.io/audit=privileged
kubectl label namespace metallb pod-security.kubernetes.io/warn=privileged
helm install metallb metallb/metallb -f metallb-values.yaml --namespace metallb
NAME: metallb
LAST DEPLOYED: Fri Jun 14 13:36:21 2024
NAMESPACE: metallb
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MetalLB is now running in the cluster.
Now you can configure it via its CRs. Please refer to the metallb official docs
on how to use the CRs.
정상적으로 파드생성이 완료되었는지 확인합니다.
kubectl get pods -n metallb -o wide
controller파드는 직접적으로 External IP를 부여하고 관리하는 역할, speaker는 k8s내에서 네트워크 정보를 광고(advertise)하고 수집하여 파드 간 경로를 제공하는 역할입니다.
IP Pool 설정
MetalLB에서 사용할 IPPool을 지정하기 위해 아래와 같은 파일을 하나 생성해 줍니다.
nano metallb-config.yaml
중간에 강조표시된 addresses:의 IP대역은 실제로 접근가능한 IP영역을 사용해야 합니다.
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ip-pool
namespace: metallb
spec:
addresses:
- 10.20.10.150-10.20.10.190
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2-network
namespace: metallb
spec:
ipAddressPools:
- ip-pool
작성이 끝나면 해당 파일을 적용합니다.
kubectl apply -f metallb-config.yaml
ipaddresspool.metallb.io/ip-pool created
l2advertisement.metallb.io/l2-network created
만일 아래같은 에러(‘failed to call webhook’)가 발생한다면
Error from server (InternalError): error when creating "metallb-config.yaml": Internal error occurred: failed calling webhook "ipaddresspoolvalidationwebhook.metallb.io": failed to call webhook: Post "https://metallb-webhook-service.metallb.svc:443/validate-metallb-io-v1beta1-ipaddresspool?timeout=10s": context deadline exceeded
Error from server (InternalError): error when creating "metallb-config.yaml": Internal error occurred: failed calling webhook "l2advertisementvalidationwebhook.metallb.io": failed to call webhook: Post "https://metallb-webhook-service.metallb.svc:443/validate-metallb-io-v1beta1-l2advertisement?timeout=10s": context deadline exceeded
아래처럼 webhook 요소를 삭제하고 재실행하면 됩니다.
kubectl delete validatingwebhookconfigurations metallb-webhook-configuration
kubectl apply -f metallb-config.yaml
validatingwebhookconfiguration.admissionregistration.k8s.io "metallb-webhook-configuration" deleted
ipaddresspool.metallb.io/ip-pool created
l2advertisement.metallb.io/l2-network created
이후부터, metallb가 관리하는 서비스에는 지정된 IP Pool 내에서 IP가 할당됩니다.
마지막으로 방화벽에서 포트를 오픈합니다.
firewall-cmd --add-port=7472/tcp --permanent
firewall-cmd --add-port=7472/udp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --reload
마스터와 워커 모두 열어주어야 하므로 ansible을 이용해 편하게 실행할 수 있습니다.
ansible all -i inventory/k8s_fenta/hosts.yaml -m shell -a "firewall-cmd --add-port=7472/tcp --permanent&&firewall-cmd --add-port=7472/udp --permanent&&firewall-cmd --add-port=7946/tcp --permanent&&firewall-cmd --add-port=7946/udp --permanent&&firewall-cmd --reload" -b --become-user root
Ingress-Nginx
helm repo를 공식 홈페이지에서 확인하고 추가합니다.
values.yaml도 가져오겠습니다.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm show values ingress-nginx/ingress-nginx >> ingress-nginx-values.yaml
편집기로 열어 IP주소와 loadBalanceClass를 지정합니다.
IP는 실제로 사용할 IP를 기입하고, Class를 지정하지 않았다면 해당 값은 수정하지 않아도 됩니다.
그 외 defaultBackend도 활성화했습니다.
...
controller:
...
service:
...
external:
loadBalancerIP: 10.20.10.150
...
defaultBackend:
enabled: true
기타 옵션은 일단 넘기겠습니다.
작성이 끝났다면 해당 파일을 이용해 설치합니다.
helm install ingress-nginx ingress-nginx/ingress-nginx -f ingress-nginx-values.yaml --namespace ingress-nginx --create-namespace
설치 완료 이후 Ingress-Nginx를 사용하기 위한 샘플 서비스 구문을 출력해 줍니다.
아래에서 Portainer를 설치하며 이 샘플 구문을 사용해볼 예정입니다.
NAME: ingress-nginx
LAST DEPLOYED: Fri Jun 14 19:49:25 2024
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the load balancer IP to be available.
You can watch the status by running 'kubectl get service --namespace ingress-nginx ingress-nginx-controller --output wide --watch'
An example Ingress that makes use of the controller:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example
namespace: foo
spec:
ingressClassName: nginx
rules:
- host: www.example.com
http:
paths:
- pathType: Prefix
backend:
service:
name: exampleService
port:
number: 80
path: /
# This section is only required if TLS is to be enabled for the Ingress
tls:
- hosts:
- www.example.com
secretName: example-tls
If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
apiVersion: v1
kind: Secret
metadata:
name: example-tls
namespace: foo
data:
tls.crt: <base64 encoded cert>
tls.key: <base64 encoded key>
type: kubernetes.io/tls
설치가 완료되면 아래 명령어를 통해 파드를 확인할 수 있습니다.
kubectl get pods -n ingress-nginx -o wide
그리고 아래 명령을 통해 ingress-nginx로 생성된 LoadBalancer와 해당 서비스에 IP가 지정된 것을 확인할 수 있습니다.
kubectl get svc -n ingress-nginx
해당 주소로 접속해보면 default backend가 활성화된 것을 확인할 수 있습니다.
Portainer
설치
Portainer 공식 홈페이지에서 helm repo를 확인합니다.
helm repo add portainer https://portainer.github.io/k8s/
helm repo update
helm show values portainer/portainer >> portainer-values.yaml
저장된 파일을 열어 필요한 부분을 찾아 편집합니다.
Portainer의 데이터를 유지하기 위해 볼륨을 할당해주어야 하므로, 위에서 NFS로 생성한 StorageClass를 지정합니다.
existingClaim은 기존에 생성된 볼륨을 바인딩하기 위한 옵션이므로 “”을 써주어야 합니다(처음 설치이므로).
Portainer는 Helm설치 시 loadBalancerIP 및 externalTrafficPolicy항목을 지원하지 않는 듯 하여(작성해도 반영안됨) 파드 생성 후 편집해야 합니다.
...
image:
repository: portainer/portainer-ce
tag: 2.20.3
...
service:
type: loadBalancer
httpPort: 9000
httpsPort: 9443
#httpNodePort: 30777
#httpsNodePort: 30779
edgePort: 8000
#edgeNodePort: 30776
...
persistence:
enabled: true
size: "10Gi"
annotations: {}
storageClass: nfs-truenas-apps
existingClaim: ""
아래처럼 웹훅과 관련된 에러가 난다면 삭제합니다.
Error: INSTALLATION FAILED: 1 error occurred:
* Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": context deadline exceeded
kubectl delete validatingwebhookconfiguration ingress-nginx-admission
파드가 생성되면 아래와 같은 메세지를 확인할 수 있습니다.
NAME: portainer
LAST DEPLOYED: Sun Jun 16 02:27:36 2024
NAMESPACE: portainer
STATUS: deployed
REVISION: 1
NOTES:
Get the application URL by running these commands:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace portainer svc -w portainer'
export SERVICE_IP=$(kubectl get svc --namespace portainer portainer --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo https://$SERVICE_IP:9443
아래 명령을 통해 portainer에 할당된 external ip를 확인합니다.
kubectl get svc -n portainer
IP를 따로 지정하지 않았으므로 IP Pool에서 순차적으로 할당받은 IP를 사용하게 됩니다.
또한, externalTrafficPolicy도 지정하지 못했으므로, External IP로 접근해도 Portainer에 접속할 수 없죠.
해결하기 위해 아래 명령어를 사용합니다.
kubectl edit svc -n portainer
그리고 spec:밑에 loadBalancerIP: 를 작성해 IP를 고정합니다.
또한, 망 내부에서 External IP:PORT로 접속하고 싶거나, 외부 접속을 Ingress가 아닌 MetalLB를 이용하려 한다면 externalTrafficPolicy도 Cluster → Local로 수정해야 합니다.
해당 편집기는 vi이므로, 키보드의 “I”키를 눌러 입력모드로 변환 후 작성, ESC키를 눌러 편집모드 종료, “:wq!”를 입력해 저장 및 빠져나올 수 있습니다.
...
spec:
...
externalTrafficPolicy: Local
healthCheckNodePort: 32733
internalTrafficPolicy: Cluster
...
loadBalancerIP: 10.20.10.161
...
type: LoadBalancer
...
이후 10.20.10.161:9000을 통해 Portainer에 아래처럼 접속할 수 있게 됩니다.
혹은 NodePort를 지정했다면, 파드가 있는 노드를 특정해 해당 노드의 주소:port로 접속할 수도 있지만, 워커노드가 변경될때마다 접속 주소가 달라지므로 추천하지 않습니다.
외부 접속 설정
- MetalLB를 이용할 경우
리버스 프록시를 구성하는 방법과 똑같이, MetalLB로 할당된 External IP:Port를 이용해 외부에서 접속할 수 있습니다.
예를 들어, 클플 터널을 이용할 경우 아래처럼 구성해 외부에서 접속할 수 있게 됩니다.
추가적인 단계를 더 거칠 필요 없이 바로 연결 가능하다는 장점이 있으나, 서비스마다 할당된 IP와 Port를 기억하고 관리해야 한다는 단점이 있습니다.
- Ingress-Nginx를 이용할 경우
Ingress-Nginx Controller 파드가 작동하는 워커 노드들의 80포트와 443포트를 오픈해야 합니다. Ansible을 이용하겠습니다.
ansible all -i inventory/k8s_fenta/hosts.yaml -m shell -a "firewall-cmd --add-port=80/tcp --permanent &&firewall-cmd --add-port=443/tcp --permanent && firewall-cmd --reload" -b --become-user root -l kube_node
마스터 노드에서 ingress를 작성하고 배포합니다.
nano ingress-portainer.yaml
강조 표시된 줄의 내용을 환경에 맞게 수정합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-portainer
namespace: portainer
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: example.fentanest.com
http:
paths:
- pathType: Prefix
backend:
service:
name: portainer
port:
number: 9000
path: /
kubectl apply -f ingress-portainer.yaml
DNS는 Ingress-Nginx의 External IP를 지정하면 됩니다.
MetalLB(LoadBalancer)와 비교할 때, 하나의 IP로 다수의 서비스를 연결하고, ingress안에 포트를 지정해 놓고 있기 때문에, 다수의 IP와 Port를 관리하지 않아도 되는 장점이 있습니다. 클라우드 환경이라면 공인IP를 적게 운용할 수 있으므로 비용적인 문제에서도 장점이 있다고 합니다.
이렇게 적용된 ingress는 아래 명령어를 통해 확인할 수 있고,
kubectl get ingress -A
제거 시에는 아래 명령어를 통해 제거할 수 있습니다(두 가지 모두 가능).
kubectl delete ingress -n portainer ingress-portainer
kubectl delete -f ingress-portainer.yaml
Ingress-Nginx로 일원화 할 경우 각 서비스의 externalTrafficPolicy를 Local로 수정할 필요는 없습니다.
Dashboard
type 수정
Kubespray에서 addons.yaml을 통해 함께 설치되어 있는 상태입니다.
kubectl get svc -n kube-system
서비스가 생성되어있지만, ClusterIP에 NodePort도 설정되지 않았으므로, 약간의 수정이 필요합니다.
kubectl edit svc -n kube-system kubernetes-dashboard
ClusterIP를 LoadBalacner로 변경하고, IP를 할당하겠습니다. 또, 서비스를 완전히 인터넷망에 노출시킬 것도 아니기 때문에, IP:Port로 내부에서 접속하기 위해 externalTrafficPolicy를 Local로 기입해넣겠습니다(ClusterIP상태였기 때문에 externalTrafficPolicy항목이 없을 수 있습니다. 직접 써 넣으면 됩니다).
spec:
...
type: LoadBalancer
loadBalancerIP: 10.20.10.151
externalTrafficPolicy: Local
저장 후 다시 서비스를 확인해보면 아래처럼 IP를 할당받은 것을 알 수 있습니다.
443포트를 사용하기 때문에 https://10.20.10.151 만 입력해도 바로 대시보드에 접근할 수 있습니다.
토큰 생성
대시보드 접속에 필요한 토큰을 생성하기 위해 Service Account를 생성하고 cluster-admin을 부여합니다.
nano dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
---
apiVersion: v1
kind: Secret
metadata:
name: k8s-dashboard-secret
annotations:
kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
저장 후 실행합니다.
kubectl create -f dashboard-admin.yaml
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
secret/admin-user-secret created
이제 아래 명령을 통해 토큰을 확인할 수 있습니다.
kubectl describe secrets -n kube-system admin-user-secret
Name: admin-user-secret
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 848aa799-82f2-40cc-84e5-ce7b9682f53d
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1107 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjRHcU...
해당 토큰을 복사 붙여넣기해서 대시보드에 접속할 수 있습니다.
보안상 권장하지 않지만, 토큰 수명을 무한대로 설정하고 싶은 경우, 아래 명령어를 입력합니다.
kubectl edit deployments.apps -n kube-system kubernetes-dashboard
내려가다보면 spec.spec.containers에서 아래와 같은 부분을 확인할 수 있습니다.
–token-ttl=900값을 0으로 수정할 경우 토큰이 파기되지 않습니다.
문제 해결(Trouble-Shooting)
MetalLB : 7472, 7946포트를 이미 사용중인 경우
values.yaml에서 port를 수동으로 찾아 변경할 수 있습니다.
prometheus:
...
metricsPort: 7472
...
speaker:
...
memberlist:
...
mlBindPort: 7946
해당 부분을 수정한 파일을 이용해 설치한 뒤, 수정된 port를 방화벽에서 오픈하면 됩니다.
Portainer : Environment Local is Unreachable
제 경우, calico에 필요한 포트가 차단되어 DNS쿼리가 제 기능을 할 수 없었습니다.
vxlan모드로 작동되는 calico의 경우 4789/UDP포트가 오픈되어 있어야 하며, 해당 포트가 열려있지 않을 경우 Portainer뿐만이 아니라 K8S 내부에서 nslookup에 일절 응답하지 못합니다.
해당 포트를 오픈한 후에는 아래처럼 서버주소를 응답받을 수 있습니다.
노드마다 찾아다니며 오픈할 수도 있지만, ansible을 활용하여 한 번에 오픈할 수 있습니다.
ansible all -i inventory/k8s_fenta/hosts.yaml -m shell -a "firewall-cmd --add-port=4789/udp --permanent && firewall-cmd --reload" -b --become-user root
관련 글
2025.01.23 - [Kubernetes] - Kubespray로 쿠버네티스(Kubernetes, K8S) 설치하기
Kubespray로 쿠버네티스(Kubernetes, K8S) 설치하기
개요단일 노드화된 경량 쿠버네티스(k3s)로 구현되어 있는 TrueNAS의 Apps기능을 이용하다가, 순정 쿠버네티스(?)에 관심이 생겨 시작했다가, 수많은 오류를 해결하기 위해 긴 시간 구글링하며 배운
worklazy.net
2025.01.23 - [Kubernetes] - Kubespray를 이용하여 K8S 클러스터 업그레이드 하기
Kubespray를 이용하여 K8S 클러스터 업그레이드 하기
개요최초 Kubespray글을 작성했을 때의 쿠버네티스 버전은 1.29.5였습니다.[root@k8smaster1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONk8smaster1 Ready control-plane 74d v1.29.5k8smaster2 Ready control-plane 74d v1.29.5k8smaster3
worklazy.net
출처
Kubernetes Pod 배치전략, Taint와 Toleration에 대해 이해하고 실습해보기
- Pod 배치전략 중 Taint와 Toleration에 대해 이해하고 실습한다.
velog.io
2. https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements
System requirements | Calico Documentation
Review requirements before installing Calico to ensure success.
docs.tigera.io
3. https://omoknooni.tistory.com/113
[Kubernetes] Ingress & Ingress Controller
앞서 알아보았던 Service 중 외부 요청을 처리하기 위한 것에는 NodePort가 있었다. NodePort는 클러스터 내의 모든 노드에 특정 포트를 오픈시켜 외부로부터 접근할 수 있도록 하는 서비스이다. 이러
blog.omoknooni.me
4. https://www.whatwant.com/entry/Kubernetes-Dashboard
Kubernetes Dashboard 설치/셋팅
Kubernetes 설치를 저와 같이 했다면, addon으로 Dashboard도 설치가 되었을 것이다. - https://www.whatwant.com/entry/Kubernetes-Install-1 그런데, 정말 설치가 잘 되었을까? K8s master 서버에 접속 후 한 번 살펴보자.
www.whatwant.com
쿠버네티스 대시보드 토큰 발행 및 접속
대시보드 토큰 발행 전에 쿠버네티스 대시보드가 설치되지 않았다면 아래 글을 확인하기 바랍니다. https://park-hw.tistory.com/entry/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EB%8C%80%EC%8B%9C%EB%B3%B4%EB%93%9C-%EC%A0
park-hw.tistory.com
Kubernetes DNS lookg not working from worker node - connection timed out; no servers could be reached
I have build new Kubernetes cluster v1.20.1 single master and single node with Calico CNI. I deployed the busybox pod in default namespace. # kubectl get pods busybox -o wide NAME READY STAT...
stackoverflow.com