월 55,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
gcePersistentDisk 대체
제가 사용하고 있는 cloud(NBP)는 gcpPersistentVolume같은게 없는거 같은데 gcePersistentDisk: pdName: mongodb fsType: ext4이 부분을 nfs: server: 172.23.13.13 path: /home/nfs 혹은 local: path: /home/local혹은 hostPath: path: /home/hostpath대체 해도 되는거죠?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
우분투 설치(쿠버네티스 설치를 위한)
Oracle VM 사용하지 않고 VM ware 사용해야 하나요 ? 도커 연습 시 Oracle VM 우분투 18버전 같은데 이 버전으로 쿠버네티스 실습이 불가능한지요 ?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
cluster <-> 외부 통신
안녕하세요 cluster를 외부에서 접근하려하는데요, 궁금한 것들을 질문드립니다. 1) 운영환경에서는 NodePort는 비효율적이라서 LB혹은 인그레스를 사용하는것이 맞을까요? 2) 모든 서비스를 각각 LB 타입으로 사용하기보다는 규모가 크지 않다면 ingress하나로 사용하는 것이 효율적인게 맞을까요? 3) 만약 node ip만 public이고 추가적인 ip를 사용할 수 없는 경우에는 어떤 방식으로 cluster를 외부에 노출시키는 것이 좋을까요?? LB는 metalLB를 사용하고 있습니다. 바쁘시겠지만 답변주시면 감사하겠씁니다.
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
gasbugs/http-go:ingress 와 기존 http-go:v3 와 차이가 있나요?
기존에 있던 http-go:v3를 docker tag http-go:v3 jjcheon1/http-go:ingress docker push jjcheon1/http-go:ingress 한다음에 jjcheon1/http-go:ingress를 사용해서 해봤는데 ingress path '/welcome/test' 가 적용이 안되어서 선생님께서 알려주신 gasbugs/http-go:ingress 를 이미지로 하니까 정상적으로 결과가 보였는데 http-go:ingress는 기존 version과 차이가 있나요? 인그레스를 적용하는 것만으로 http-go를 실행시키는 것으로 이해했는데, 뭔가 실행시키는 프로그램 상에도 차이가 있는지가 궁금합니다.
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
인그레스의 위치
Ingress는 도메인이름을 해석해서, 서브도메인이나 웹요청의 디렉토리를 탐지해서 어디로 서비스를 나누어줄 것인지를 결정한다고 하셨는데, 여기서의 서비스는 clusterIP를 가지고 있는 서비스 객체를 말씀하시는 게 맞나요? LB가 NodePort로 리다이렉션을 하고, Ingress가 Nodeport로 들어온 도메인을 가지고 서비스로 분배를 하는건가요? 자체로는 이해를 했는데, LB와 Ingress의 위치가 어떻게 되는지 궁금합니다.
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
replicaset 질문
안녕하세요 rollout은 결국, 기존의 replicaset은 유지한채 scale만 0으로 바꾸고 새로운 replicaset을 만들고 사용하는 것 같은데요 만약 histroy 개수가 20개 이러면, replicaset만 20개가 될텐데 이는 성능상 문제가 되진 않나요??
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
sessionAffinity 동작관련
실습에 보여주신 것처럼 kubectl edit svc http-go-svc 를 해서 ........ selector: app: http-go sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 '''''''' sessionAffinity를 ClientIP로 수정하고 root@master0:~/network# kc run -it --rm --image=busybox sh 실행을 하고 선생님께서 하신것처럼 wget을 실행하면 If you don't see a command prompt, try pressing enter. / # wget -O- -q 10.106.148.16 Welcome! v3 http-go-5dc4cdbff7-czrd7 / # wget -O- -q 10.106.148.16 Welcome! v3 http-go-5dc4cdbff7-czrd7 / # wget -O- -q 10.106.148.16 Welcome! v3 http-go-5dc4cdbff7-jk5gr / # wget -O- -q 10.106.148.16 Welcome! v3 http-go-5dc4cdbff7-jsxrg / # wget -O- -q 10.106.148.16 Welcome! v3 http-go-5dc4cdbff7-czrd7 보여주신 것처럼 pod가 고정이 안되고 로드밸런싱이 이루어지는데, 제가 잘못 한 곳이 있을까요? kubectl version: v1.24.0 pod와 svc 정보는 아래와 같습니다. # pod 정보 root@master0:~/network# kc get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES bash 1/1 Running 1 (21m ago) 21m 10.0.1.46 node0 <none> <none> http-go-5dc4cdbff7-czrd7 1/1 Running 0 30m 10.0.1.106 node0 <none> <none> http-go-5dc4cdbff7-f75n5 1/1 Running 0 30m 10.0.1.94 node0 <none> <none> http-go-5dc4cdbff7-jk5gr 1/1 Running 0 31m 10.0.1.153 node0 <none> <none> http-go-5dc4cdbff7-jsxrg 1/1 Running 0 30m 10.0.1.174 node0 <none> <none> http-go-5dc4cdbff7-mk4fm 1/1 Running 0 30m 10.0.1.223 node0 <none> <none> # svc 정보 root@master0:~/network# kc get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR http-go-svc ClusterIP 10.106.148.16 <none> 80/TCP 31m app=http-go kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 36m <none>
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
인증서 갱신 후 적용 방식에 대해 질문있습니다.
강의 14:40부터 말씀하시는 내용은 인증서 갱신만 진행하면 자동으로 적용이 된다고 하신것 같은데, 쿠버네티스 문서(https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/)에서 보면 "명령을 실행한 후에는 컨트롤 플레인 파드를 재시작해야 한다. 이는 현재 일부 구성 요소 및 인증서에 대해 인증서를 동적으로 다시 로드하는 것이 지원되지 않기 때문이다." 라고 되어있는데, 이부분에 대해 설명좀 부탁드립니다!
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
안녕하세요 선생님
먼저 알찬 강의 감사드립니다. kubectl create -f http-go-deploy.yaml 명령어 이후 kubectl describe svc 로 확인할 경우 http-go-svc의 Endpoints ip가 <none>으로 설정이 되어있습니다. 그래서 그런지 busybox로 wget을 서비스 clusterIP에 보내도 응답이 없더라구요. 강사님께서는 따로 Endpoints IP를 설정해주지 않았는데, kubectl describe svc 시 Endpoints IP:port가 보이던데 혹시 무엇이 문제일까요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
local registry의 image를 이용해서 deploy 생성시 에러
http-go를(저는 main-test) local registry에 넣고, deploy를 생성할때, 이미지를 --image=localhost:5000/main-test 해서 했는데 생성이 되는 것처럼 보이는데 root@master0:~# kubectl get pods NAME READY STATUS RESTARTS AGE main-test-6b8b9df5f9-qtb6k 0/1 ImagePullBackOff 0 26m 이미지를 가져오는데 실패했다고 나와서요.. local registry의 image에 있는지 확인을 해봤는데 잘 들어가 있었습니다. # image list root@master0:~/http-go# curl -X GET http://localhost:5000/v2/_catalog {"repositories":["main-test"]} 확인 좀 부탁드립니다.
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
ArgoCD에서 Helm Package 배포 하는것 질문드립니다..
안녕하세요.. 관련 자료를 찾아보았는데, 명확한 이야기가 없어서 혹시나 하고 질문을 드립니다. Kustomize나 kubenetes yaml 파일을 commit으로 auto symc를 하는방법은 잘 나와있는데 Helm Sync하는 부분은 공식문서에도 어디에도 안보입니다. 그래서 Github Actions로 Helm value의 image tag 이름만 변경시키고, Helm repository로 사용하고있는 Github Page의 패키지를 업데이트 하고, index.yaml을 변경하여 배포하는 형식으로 만들어 놓고. 이 Github Page를 ArgoCD의 repository연결을 한후, Application을 생성하여 Sync를 시도하니, 첫 연결시의 리소스와 Value만 고정되어있고, 이후 변경하는 Value에 대해서는 manual Sync로도 이미지 태그값이 변경되지 않습니다.. Github Page의 helm package와 index.yaml이 변경되어도 auto sync는 작동하지 않구요.. 혹시 관심이 있으시다면 답변 부탁드리겠습니다.. 긴글 읽어주셔서 감사합니다. ㅠ
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
argocd 로 배포한 것 삭제 질문 있어요
argoCd 를 이용해 CD를 구성했습니다. sync 하여 예제 app 을 배포한 후 해당 app의 CD 를 제거 했습니다. 제가 생각했던 결과물은 "CD를 제거 하면 worker node에서 예제 app이 제거 되는 것" 이었습니다. 하지만 deploy, svc, pod 전부 그대로 떠 있더라구요. 원인이 무엇일까요? 제가 잘못 한 부분이 있는 것일까요 아니면 argoCd에선 CD를 삭제해도 CD만 제거될 뿐 worker node에 띄워진 app은 건드리지 않는 것인가요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
실습환경 문의드립니다.
실습 환경문의드립니다. 기존 사용하던 Oracle VM / VMware / MobaXterm 에서 모두 오류 발생하여 문의드립니다. 우분투에서 새로 쿠버네티스 설치하여 진행하는 것인가요? gedit은 별도로 설치하여 진행하면될까요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
netplan apply 수행시 오류발생
netplan apply 수행시 오류 발생합니다 [8:8:8:8:8:8:4:4] 로 수정해도될까요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
SSH 접속시에 Connection timed out 발생합니다.
SSH 접속시에 Connection timed out 발생합니다. 어떻게 해결할수있을까요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
프로메테우스
강사님, 안녕하세요. 이전에 프로메테우스 질문 글 남겼는데추가적으로 질문하고 싶어 댓글을 달았다가 새로 글을 작성합니다. 질문이 두서가 없고 정신없지만 양해부탁드립니다... 늘 감사합니다. 현재 미니큐브 인스턴스에 프로메테우스와 그라파나를 올린 상황입니다. 그래서 다른 mongodb 인스턴스를 모니터링하고, alert manager로 슬랙 알림을 주고 싶습니다. 1. alertmanager로 슬랙을 연동시키고자 강사님이 작성하신 values-prometheus.yaml 파일을 수정하였습니다. 헬름 차트 깃허브에 있는 야믈 파일을 참고했습니다. cat <<EOF > values-prometheus.yaml alertmanager: # 30~33 enabled: true persistentVolume: ## If true, alertmanager will create/use a Persistent Volume Claim ## If false, use emptyDir enabled: true accessModes: - ReadWriteOnce size: 2Gi replicaCount: 1 service: type: LoadBalancer ## alertmanager ConfigMap entries # 1360 alertmanagerFiles: alertmanager.yml: global: resolve_timeout: 5m slack_api_url: 'https://hooks.slack.com/services/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' route: group_by: ['monitoring'] group_wait: 30s repeat_interval: 1h receiver: default-receiver routes: - match: alertname: DeadMansSwitch receiver: 'null' - match: receiver: 'slack' continue: true receivers: - name: 'null' - name: 'slack' slack_configs: - channel: 'test' username: 'prometheus' send_resolved: true icon_url: https://avatars3.githubusercontent.com/u/3380462 title: |- [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }} text: >- {{ range .Alerts -}} *Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - {{ end }} *Description:* {{ .Annotations.description }} *Details:* {{ range .Labels.SortedPairs }} • *{{ .Name }}:* {{ end }} {{ end }} server: enabled: true persistentVolume: enabled: true accessModes: - ReadWriteOnce mountPath: /data size: 100Gi replicaCount: 1 ## Prometheus data retention period (default if not specified is 15 days) retention: "15d" # 15일간 데이터를 보존함 serverFiles: alerting_rules.yml: groups: - name: example rules: - alert: HighRequestLatency expr: sum(rate(container_network_receive_bytes_total{namespace="kube-logging"}[5m]))>20000 for: 1m labels: severity: page annotations: summary: High request latency prometheus.yml: rule_files: - /etc/config/alerting_rules.yml - /etc/config/alerts EOF 문제는 helm install 하였더니 alertmanager 파드에서 Crash Loop BackOff 오류가 납니다... (exit code : 1) 이미지가 이미 존재한다는데 구글링을 했음에도 명확한 해결책을 찾지 못했습니다. 제가 야믈파일을 작성하는 과정에서 문제가 생긴 것 같은데 잘 모르겠어서 질문 드립니다.. 2. mongoDB인스턴스를 타겟으로 설정해주고자 헬름차트 깃허브에 있었던 mongodb-exporter.yaml 파일을 그대로 가져왔습니다. cat <<EOF > mongodb.yaml mongodb: uri: "mongodb://mongodb0.example.com:27017" existingSecret: name: "MONGO_INITDB_ROOT_PASSWORD" key: "secret" port: "80" readinessProbe: httpGet: path: / port: metrics initialDelaySeconds: 10 metrics: enabled: true serviceMonitor: enabled: true interval: 30s scrapeTimeout: 10s namespace: additionalLabels: {} targetLabels: [] metricRelabelings: [] EOF 저장 후 helm install mongodb prometheus-community/prometheus-mongodb-exporter -f mongodb.yaml -n prometheus해주었는데 이렇게 하는 것이 과연 맞을지 궁금합니다...
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
안녕하세요 ingress 동작 관련 확인이 필요합니다.
안녕하세요 아래 첨부된 내용은 실습을 진행하면서 ingress 접속 동작 확인 시 전혀 다른 동작이 발생하여 문의 들빈다. 십습에서는 svc의 뒤의 포트를 통해 curl을 진행하도록 되어 있습니다. 아래 첨부 사진에서는 47302 port 입니다. 여기서 발생한 문제는 curl:10.10.2.24.10:47302 를 수행할 경우 timeout이 발생합니다. 단 80포트로 직접 질의할 경우는 잘 수행이 됩니다... 47302 portf로 질의를 하면 80port로 패킷이 넘겨지는 동작이 아닌가요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
pv와 pvc에 대한 궁금증을 질문드립니다. :)
1. spec.capacity.storage 와 spec.accessModes가 동일할시에 자동으로 연결 시켜준다고 강의에서 확인하였습니다. 그런데 제가 본 다른 글중에서 labelSelect 로 선택하는 경우도 있고, stoarage의 양이 pv가 pvc보다 더 높은경우도 보았습니다. ``` apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 8Gi storageClassName: slow selector: matchLabels: release: "stable" matchExpressions: - {key: environment, operator: In, values: [dev]} ``` pv와 pvc가 연결되는 경우가 사실 여러가지가 있는건가요? 2. 아마 storageClass를 사용하지 않을때는, pvc에서 spec.storageClassName을 ""로 명시하는 경우가 있는것같습니다. 그 경우는 ""로 명시하지 않을경우, 기본 스토리지 클래스가 잡혀서 PV가 없어도 자동으로 생성이 되어서 그런걸까요? 3. 기본 스토리지 클래스는, 제가 설정한적도 만든적도 없는데, 언제 어떤것이 만들어 진건가요? 4. 그리고 storageClass를 사용하지 않는 경우에도, Pv와 pvc에 storageClass를 명시하는 경우도 보았는데, 이 경우는 어떤 경우일까요? 항상 강의 잘보고 있습니다. 감사합니다. :)
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
프로메테우스
안녕하세요. 강의 잘 들었습니다. 여쭤보고 싶은 것은 1. PV는 왜 Prometheus yaml 파일에 적어주고 PVC는 왜 Grafana yaml 파일에 각자 따로 적어주나요? PVC는 PV와 같이 있어야 할 것 같은데 따로 적어주는 이유가 궁금합니다. 2. 타겟을 따로 exporter로 지정해주고 싶은데 values-prometheus.yaml 파일이 프로메테우스 설정 파일이라고 봐도 되나요? 아니면 따로 야믈 파일을 생성해서 프로메테우스 타겟을 설정해주어야 하나요?
- 미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
워커노드 join 실패
마스터 노드에서는 아래와 같이 kubeadm init 명령어가 잘 성공 했는데 NAME STATUS ROLES AGE VERSION master0 Ready control-plane,master 6m33s v1.22.2 워커노드에서는 아래와 같이 조인이 안되네요 ㅠㅠ 해결방법을 알 수 있을까요? 전에는 됐었는데 한 번 지웠다가 다시 하려니 안되네요 ㅠ.. root@node0:~# kubeadm join 192.168.52.128:6443 --token 9frfjm.xc4s3qp1a8k6qc9c --discovery-token-ca-cert-hash sha256:f944e91ef3b4e47c9e08e62d50c7a066279c86c6e0c0250ce6e8013af1016d8b [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... [kubelet-check] Initial timeout of 40s passed. error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition To see the stack trace of this error execute with --v=5 or higher root@node0:~# journalctl -xeu kubelet Apr 10 16:22:34 node0 kubelet[3601]: E0410 16:22:34.951232 3601 kubelet_node_status.go:93] "Unable to register node with API server" err="Unauthorized" no> Apr 10 16:22:35 node0 kubelet[3601]: E0410 16:22:35.051636 3601 kubelet.go:2407] "Error getting node" err="node \"node0\" not found" Apr 10 16:22:35 node0 kubelet[3601]: E0410 16:22:35.171824 3601 kubelet.go:2407] "Error getting node" err="node \"node0\" not found"