GitLab Container Registry 이미지에서 Kubernetes 포드 생성을 위해

스킬 습득을 위해 GitLab의 컨테이너 레지스트리 이미지에서 Kubernetes 포드를 만들려고 할 때의 단계를 정리합니다. ※아래 그림 적색 부분.
시험에 pull하는 대상의 이미지는 nginx를 포함한 것입니다.


전제 조건



· Kubernetes 클러스터 구축이 완료되었습니다.
· GitLab 구축이 완료되었습니다.
· 시도한 환경의 버전은 다음과 같습니다.
CentOS:7.3
 Kubernetes: 1.18.2
Calico: 3.13.3
Docker:1.13.1-109
GitLab: 11.6.8

참고 자료



htps : // / cs. 도 c r. 코 m/레기 스트리/인세쿠레/
htps : // 곰팡이 s. 이오 / 드 cs / 타 sks / 곤푸 쿠레 포 드 콘 r / 뿌 루 낫게 p ゔ ぁ 테레기 스트리 /

1.Docker와 K8s에 사전 설정



준비로서 인증서의 배치나 컨테이너 레지스트리에의 액세스 정보의 설정을 실시합니다.

Docker에 인증서 배포



Docker에서 컨테이너 레지스트리에 액세스하기 위한 인증서를 배치합니다.

K8s 각 노드에서 구현
# sudo mkdir -p /etc/docker/certs.d/registry.test01.com
# sudo cp cert.crt /etc/docker/certs.d/registry.test01.com/ca.crt

cert.crt ... GitLab Container Registry에 액세스하는 데 사용되는 인증서

Docker 비보안 레지스트리 설정



배포한 인증서가 자체 서명된 인증서인 경우 Docker에서 이를 허용하는 설정이 필요했습니다.

/etc/docker/daemon.json
{
  "insecure-registries": ["registry.test01.com"]
}

반영하기 위해 Docker를 다시 시작합니다.
systemctl restart docker

K8s에 컨테이너 레지스트리 액세스 정보 등록



컨테이너 레지스트리에 액세스 할 때 정보를 K8s에 등록합니다.
먼저 Docker에서 컨테이너 레지스트리에 로그인합니다.

k8s 마스터 노드
#docker login registry.test01.com
Username: <コンテナレジストリにアクセスする時のユーザ名>
Password: <上記ユーザ名に対応するパスワード>
Login Succeeded

위의 로그인으로 생성된 config.json 파일을 확인합니다.
# cat ~/.docker/config.json
{
    "auths": {
        "registry.test01.com": {
            "auth": "***************************="
        }
    }

인증 토큰을 포함한 cluster 연결용 Secret을 작성합니다.
# kubectl create secret docker-registry regcred --docker-server=registry.test01.com --docker-username=<コンテナレジストリユーザ名> --docker-password=<コンテナレジストリユーザ名に対応するパスワード>
secret/regcred created

2. 컨테이너 레지스트리 이미지를 사용하는 포드 만들기



컨테이너에 네트워크를 통해 액세스하기 위한 서비스 설정과 컨테이너 이미지를 사용하는 pod를 설정합니다.

클러스터 외부에서 액세스하기 위한 서비스(nodePort) 설정



다음과 같이 pod에 대한 액세스 정보를 작성합니다. 외부 30080 포트와 컨테이너 측 nginx의 80번 포트를 연결합니다.

testapp01-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: testapp01-np
spec:
  selector:
   app: testapp01 ←これをpodの方の定義と一致させる
  ports:
  - targetPort: 80 ←コンテナの受けポート(nginx)
    port: 8080
    nodePort: 30080 ←外部からのアクセス時に使うポート。外部からのアクセス時に「ノードIP:ここで指定したポート番号」と指定する。
    protocol: "TCP"
  type: NodePort

위의 파일을 적용합니다.
# kubectl apply -f testapp01-svc.yaml

적용 결과를 확인합니다.
# kubectl get services testapp01-np
NAME           TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
testapp01-np   NodePort   xx.xx.xx.xx      <none>        8080:30080/TCP   4d2h

컨테이너 레지스트리 이미지를 사용하여 Pod 만들기



다음과 같이 포드 매뉴페스트 파일을 만듭니다.

testapp01.yaml

apiVersion: v1
kind: Pod
metadata:
  name: testapp01
  labels:
    app: testapp01 ←サービスと紐づけるためのラベル
spec:
  containers:
  - name: testapp01-container
    image: registry.test01.com/test/testapp01:latest ←適用するイメージ
    ports:
    - containerPort: 80 ←コンテナで使われているアプリポート
  imagePullSecrets:
  - name: regcred ←デプロイ準備で作成したSecret

위의 파일을 적용합니다.
# kubectl create -f testapp01.yaml
pod/testapp01 created

pod가 "Running"이 되는지 확인합니다.
# kubectl get pod testapp01
NAME        READY   STATUS    RESTARTS   AGE
testapp01   1/1     Running   0          4s

마지막으로 앱에 액세스하여 동작을 확인합니다.
이번에는 외부 브라우저에서 다음 URL에 액세스하여 확인했습니다.

http://[pod가 시작된 노드의 IP]:30080

요약



자기 서명 증명서를 사용하고 있었던 것에 의한 대응이 필요해 조사에 시간을 필요로 해 버렸습니다만, 비교적 간단하게 GitLab와 컨테이너 레지스트리와 K8s의 제휴를 할 수 있었습니다.

좋은 웹페이지 즐겨찾기