Containerd 에서 인증서 에러 발생시 인증서가 있는 경우와 없는 경우 설정하는 방법이다.
참고로 containerd 를 설정했다고 ctr 명령어 까지 같이 적용되는건 아니다. crictl 만 적용된다.
ctr 의 경우 인증서가 있으면 --tlscacert, --tlscrt, --tlskey 3개옵션을 적용하여 사용하면 되며
인증서가 없을 경우 --skip-verify 옵션을 사용하면된다.
1. containerd 설정파일을 수정한다.
$ vi /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
2. certs.d 폴더를 생성한다.
$ cd /etc/containerd/
$ mkdir certs.d
3. 내부에 인증서 연결할 서버 폴더생성
$ cd certs.d
$ mkdir registry.wky.kr
$ cd registry.wky.kr
$ pwd
/etc/containerd/certs.d/registry.wky.kr
4. hosts.toml 파일 생성
인증서가 있는 경우.
$ vi hosts.toml
server = "https://registry.wky.kr"
[host."https://registry.wky.kr"]
capabilities = ["pull", "resolve"]
# pemfile 이 있는 경로 및 파일 입력
ca = pemfile.pem
# crt, key, pem 파일이 있는 경로 및 파일 입력
client = [[crtfile.crt, keyfile.key], [pemfile.pem]]
인증서가 없는 경우
$ vi hosts.toml
server = "https://registry.wky.kr"
[host."https://registry.wky.kr"]
capabilities = ["pull", "resolve"]
skip_verify = true
'ctr image mount imagename:tag 폴더' 명렁어를 통해 확인할 수 있다.
먼저 이미지가 서버 내에 있어야함.
$ crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/library/busybox latest 63cd0d5fb10d7 1.86MB
$ mkdir busybox
$ ctr -n=k8s.io image mount docker.io/library/busybox:latest ./busybox/
sha256:66ccab9b46d8f9daffd6e24c69ab2d6c5a5b44e9d0e39991985a910a2775755e
./busybox/
$ ls busybox/
bin dev etc home lib lib64 root tmp usr var
사설 인증서를 생성하고, 사설인증서이기 때문에 해당 registry를 실제 사용할 서버를 위해 ca파일도 생성한다.
# 사설 인증서 생성
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -subj "/CN=registry.wky.kr" -addext "subjectAltName=DNS:registry.wky.kr" -x509 -days 365 -out domain.crt
# 이미지 push 또는 pull 위한 ca 파일 생성
$ cat domain.crt domain.key > domain.pem
$ helm install opensearch-dashboards opensearch-dashboards-2.24.1.tgz --create-namespace --namespace logging
# 실행 후 확인
$ kubectl get pods -n logging
NAME READY STATUS RESTARTS AGE
opensearch-dashboards-649d556895-r4vwn 1/1 Running 0 2m13s
Host는 oepnsearch가 statefulset으로 동작하므로 opensearch service의 headless service로 연결한다.
$ kubectl edit cm fluent-bit
# [OUTPUT] 에 stdout이 있으면 해당 부분 제거 후 아래 부분 추가
[OUTPUT]
Name opensearch
Match kube.*
Host opensearch-cluster-master-headless.logging
Port 9200
tls On
tls.verify Off
HTTP_User admin
HTTP_Passwd wkyKr!2024
Retry_Limit False
Suppress_Type_Name On
fluent-bit 의 config map hot reload 를 설정하지 않았으므로, fluent-bit pod를 전체 재기동한다.
11. 연동 후 OpenSearch에서 확인을 위해 서비스를 통한 로깅 테스트 후 Fluent-Bit 확인
$ kubectl apply -f k8s.yaml
deployment.apps/stdout-node created
service/stdout-node-service created
ingress.networking.k8s.io/stdout-node-ingress created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
stdout-node-6f945d7989-6xjp2 1/1 Running 0 20s
3. fluent-bit install
$ helm repo add fluent https://fluent.github.io/helm-charts
$ helm upgrade --install fluent-bit fluent/fluent-bit
# namespace 를 주지않으면 default namespace에 생성된다
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
fluent-bit-67blm 0/1 ContainerCreating 0 5s
fluent-bit-vvt7c 0/1 ContainerCreating 0 5s
4. 현재 elasticsearch 나 opensearch 를 설치하지 않았으므로 stdout테스트를 진행한다. (테스트 후 opensearch 설치 예정)
기존에 있던 OUTPUT인 elasticsearch를 삭제하고 [OUTPUT]으로 stdout 을 추가한다.
(해당 Name의 경우 이름이 정해져있으며, 이름마다 사용할 수 있는 변수?가 다르다. 공식 가이드에서 확인 가능하다.)
$ kubectl edit cm fluent-bit
기존에 있던 elasticsearch OUTPUT 삭제
[OUTPUT]
Name es
Match host.*
Host elasticsearch-master
Logstash_Format On
Logstash_Prefix node
Retry_Limit False
아래 stdout OUTPUT 추가
[OUTPUT]
Name stdout
Match kube.*
# config map 수정 후 fluent-bit pod 삭제를 통해 재기동한다.
$ kubectl delete pods fluent-bit-67blm fluent-bit-vvt7c
pod "fluent-bit-67blm" deleted
pod "fluent-bit-vvt7c" deleted
5. 1번에서 설치한 테스트 pod 위치를 확인 후 같은 위치의 fluent-bit pod 의 로그를 f option을 통해 확인한다.