Kubernetes에서 Knative 배포하기

1. Knative 개요

Knative는 컨테이너 기반의 서빙 및 이벤트 처리 플랫폼으로, 자동 스케일링, 서비스 관리, 이벤트 기반 워크로드를 지원합니다. 공식 리포지토리는 GitHub - knative이며, 문서는 공식 사이트에서 확인할 수 있습니다.

2. 설치 절차

2.1 Knative Serving 설치

(1) 환경 사전 준비

  • Go 1.19 이상 설치
    다음 명령어로 Go 환경을 구성합니다:
    mkdir -p /opt/go
        wget https://dl.google.com/go/go1.19.5.linux-amd64.tar.gz
        tar -xzf go1.19.5.linux-amd64.tar.gz -C /usr/local/
        
        # 환경 변수 설정
        export GOROOT=/usr/local/go
        export PATH=$PATH:$GOROOT/bin
        export GOPATH=/opt/go
        
        source /etc/profile
  • jq 설치
    yum install -y jq
  • cosign 설치 (신뢰성 검증 도구)
    네트워크 연결 가능 시: go install github.com/sigstore/cosign/cmd/cosign@latest
    또는 오프라인 설치 시:
    wget https://github.com/sigstore/cosign/releases/download/v1.6.0/cosign-linux-amd64
        mv cosign-linux-amd64 /usr/local/bin/cosign
        chmod +x /usr/local/bin/cosign

(2) 이미지 추출 및 서명 검증

다운로드한 구성 파일에서 사용되는 이미지를 추출하고, 각 이미지의 서명을 검증합니다:

curl -fsSLO https://github.com/knative/serving/releases/download/knative-v1.9.0/serving-core.yaml
cat serving-core.yaml | grep 'gcr.io/' | awk '{print $2}' > image_list.txt

while IFS= read -r img; do
  COSIGN_EXPERIMENTAL=1 cosign verify -o text "$img" | jq -r '.signatures[0].keyid'
done < image_list.txt

(3) Knative Serving 설치

먼저 커스텀 리소스 정의를 적용합니다:

kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.9.2/serving-crds.yaml

이후 핵심 컴포넌트를 설치하기 위해 사전에 미리 이미지를 다운로드하고 재태깅합니다. 아래 예시는 알리바바 클라우드 레지스트리에서 가져온 이미지를 사용하는 경우입니다:

docker login --username=your_account registry.cn-hangzhou.aliyuncs.com
docker pull registry.cn-hangzhou.aliyuncs.com/your_repo/knative:activator1.9.2
docker pull registry.cn-hangzhou.aliyuncs.com/your_repo/knative:autoscaler1.9.2
docker pull registry.cn-hangzhou.aliyuncs.com/your_repo/knative:controller1.9.2
docker pull registry.cn-hangzhou.aliyuncs.com/your_repo/knative:domain-mapping1.9.2
docker pull registry.cn-hangzhou.aliyuncs.com/your_repo/knative:domainmapping-webhook1.9.2
docker pull registry.cn-hangzhou.aliyuncs.com/your_repo/knative:webhook1.9.2

# 재태깅
docker tag registry.cn-hangzhou.aliyuncs.com/your_repo/knative:activator1.9.2 gcr.io/knative-releases/knative.dev/serving/cmd/activator:1.9.2
docker tag registry.cn-hangzhou.aliyuncs.com/your_repo/knative:autoscaler1.9.2 gcr.io/knative-releases/knative.dev/serving/cmd/autoscaler:1.9.2
docker tag registry.cn-hangzhou.aliyuncs.com/your_repo/knative:controller1.9.2 gcr.io/knative-releases/knative.dev/serving/cmd/controller:1.9.2
docker tag registry.cn-hangzhou.aliyuncs.com/your_repo/knative:domain-mapping1.9.2 gcr.io/knative-releases/knative.dev/serving/cmd/domain-mapping:1.9.2
docker tag registry.cn-hangzhou.aliyuncs.com/your_repo/knative:domainmapping-webhook1.9.2 gcr.io/knative-releases/knative.dev/serving/cmd/domain-mapping-webhook:1.9.2
docker tag registry.cn-hangzhou.aliyuncs.com/your_repo/knative:webhook1.9.2 gcr.io/knative-releases/knative.dev/serving/cmd/webhook:1.9.2

설치용 YAML 파일 내부의 이미지 태그를 변경합니다:

sed -i 's/activator@sha256:.*/activator:1.9.2/g' serving-core-1.9.2.yaml
sed -i 's/autoscaler@sha256:.*/autoscaler:1.9.2/g' serving-core-1.9.2.yaml
sed -i 's/controller@sha256:.*/controller:1.9.2/g' serving-core-1.9.2.yaml
sed -i 's/domain-mapping@sha256:.*/domain-mapping:1.9.2/g' serving-core-1.9.2.yaml
sed -i 's/domain-mapping-webhook@sha256:.*/domain-mapping-webhook:1.9.2/g' serving-core-1.9.2.yaml
sed -i 's/webhook@sha256:.*/webhook:1.9.2/g' serving-core-1.9.2.yaml

노드 선택자 설정 (예: 마스터 노드에 배포):

kubectl label node 10.45.80.26 app=knative-node

# 각 Deployment에 노드 선택자 추가
spec:
  nodeSelector:
    app: knative-node

최종 설치:

kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.9.2/serving-core.yaml

(4) 네트워크 인프라 구성 (Kourier)

Kourier를 통해 인그레스를 활성화합니다:

kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.9.2/kourier.yaml

# Knative가 Kourier를 기본 인그레스로 사용하도록 설정
kubectl patch configmap/config-network \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'

외부 접근 주소 확인:

kubectl get service -n kourier-system kourier

(5) DNS 설정

기본 도메인을 설정하여 헤더 없이 요청할 수 있도록 합니다:

kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.9.2/serving-default-domain.yaml

이 설정은 외부 IPv4 주소가 노출된 경우에만 유효하며, IPv6 환경이나 minikube와 같은 로컬 환경에서는 작동하지 않습니다.

2.2 Knative Eventing 설치

이벤트 처리 기능을 활성화하기 위해 다음 구성 파일을 적용합니다:

kubectl apply -f https://github.com/knative/eventing/releases/download/knative-v1.9.2/eventing.yaml

이벤트 소스 및 전달 메커니즘을 위한 컴포넌트도 함께 설치됩니다. 설치 후 상태를 확인하려면:

kubectl get pods -n knative-eventing

이벤트 처리 파이프라인을 사용하려면 해당 리소스를 구성하고, 트리거 규칙을 정의해야 합니다.

2.3 Knative CLI 설치 및 검증

CLI 도구는 공식 릴리스 페이지에서 제공되며, 서명 검증을 통해 신뢰성을 확보할 수 있습니다:

wget https://github.com/knative/client/releases/download/knative-v1.9.2/checksums.txt
wget https://github.com/knative/client/releases/download/knative-v1.9.2/kn-linux-amd64
wget https://github.com/knative/client/releases/download/knative-v1.9.2/checksums.txt.sig
wget https://github.com/knative/client/releases/download/knative-v1.9.2/checksums.txt.pem

# 서명 검증
COSIGN_EXPERIMENTAL=1 cosign verify-blob \
  --cert checksums.txt.pem \
  --signature checksums.txt.sig \
  checksums.txt

# 해시 검증
sha256sum --ignore-missing -c checksums.txt

검증 완료 후, 실행 파일을 경로에 복사하고 권한을 부여합니다:

sudo mv kn-linux-amd64 /usr/local/bin/kn
sudo chmod +x /usr/local/bin/kn

태그: knative serving eventing kubernetes kourier

5월 31일 05:14에 게시됨