온프레 GitLab에 MicroK8s 연결하여 GitLab Auto DevOps 체험 (전반)

매번 구구도 나오지 않는 작은 재료를 취급하고 있습니다.
본 기사는 개인적인 견해이며, 필자가 소속하는 어떠한 단체에도 관계가 없습니다.

0. 소개



GitLab에는 Kubernetes를 연계하여 편리하게 여러가지 기능이 붙어 있습니다.



Kubernetes clusters | GitLab
htps : // / cs. 기 t b. 코 m / 네 / 우세 r / p 로지 ct / c ㎅ s rs /

그러나 문제가 있습니다. GKE로 해도 EKS로 해도 나름대로 좋은 가격입니다.
앱을 조금 배포하는 환경은 비쌉니다.
그러나 본격적으로 Kubernetes를 세우는 것도 힘들고. . . .

그래서 가상 머신에 MicroK8s를 움직여 온프레 GitLab에 연동해 보겠습니다.

길어졌기 때문에 전반과 후반으로 나누었습니다. 후반은 이쪽입니다.

후반: 온프레 GitLab에 MicroK8s 연결하여 GitLab Auto DevOps 체험 (후반) - Qiita



1. VMware에서 가상 머신 시작



medium의 인스턴스를 적당히 하나 움직입니다.
리소스는 CPU:4vCPU, Mem:4GB입니다.
OS는 우분투 18.04 LTS로 만들었습니다.

2. MicroK8s를 달린다



2-1. MicroK8s 설치


sudo update && sudo upgrade -y && sudo reboot
sudo install snap && sudo snap install microk8s --classic
sudo usermod -a -G microk8s <ユーザー名>

2-2. MicroK8s의 기동 상태를 확인한다


$ microk8s.status
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    ha-cluster           # Configure high availability on the current node
  disabled:
    ambassador           # Ambassador API Gateway and Ingress
    cilium               # SDN, fast with full network policy
    dashboard            # The Kubernetes dashboard
    dns                  # CoreDNS
    fluentd              # Elasticsearch-Fluentd-Kibana logging and monitoring
    gpu                  # Automatic enablement of Nvidia CUDA
    helm                 # Helm 2 - the package manager for Kubernetes
    helm3                # Helm 3 - Kubernetes package manager
    host-access          # Allow Pods connecting to Host services smoothly
    ingress              # Ingress controller for external access
    istio                # Core Istio service mesh services
    jaeger               # Kubernetes Jaeger operator with its simple config
    keda                 # Kubernetes-based Event Driven Autoscaling
    knative              # The Knative framework on Kubernetes.
    kubeflow             # Kubeflow for easy ML deployments
    linkerd              # Linkerd is a service mesh for Kubernetes and other frameworks
    rbac                 # Role-Based Access Control for authorisation
    storage              # Storage class; allocates storage from host directory
    metallb              # Loadbalancer for your Kubernetes cluster
    metrics-server       # K8s Metrics Server for API access to service metrics
    multus               # Multus CNI enables attaching multiple network interfaces to pods
    portainer            # Portainer UI for your Kubernetes cluster
    prometheus           # Prometheus operator for monitoring and logging
    registry             # Private image registry exposed on localhost:32000
    traefik              # traefik Ingress controller for external access

kubectl에서 노드를 검색할 수 있는지 확인
$ microk8s.kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
ip-10-x-y-z   Ready    <none>   48m   v1.17.0

2-3. microk8s의 addon를 달린다



필요한 Addon은 다음과 같습니다.
GitLab측에서 ingress등은 넣기 때문에 Addon은 최저한으로 합시다.
Dashboard 등은 문제 없다고 생각합니다.
  • rbac
  • dns
  • storage
  • metallb

  • 2-3-1. rbac,dns,storage 사용



    rbac, dns는 기본적으로 필요합니다.
    storage는 pv가 필요한 응용 프로그램에 필요합니다.
    $ sudo microk8s.enable rbac
    $ sudo microk8s.enable dns storage
    

    2-3-2. metallb



    metallb는 ingress가 사용하는 LoadBalancer에 필요합니다.
    enable시에 사용할 수 있는 IP 주소를 a.b.c.d-a.b.c.e 의 형식으로 지정해 주세요.
    $ sudo microk8s.enable metallb
    Enabling MetalLB
    Enter each IP address range delimited by comma (e.g. '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'): 192.168.10.20-192.168.10.30
    Applying Metallb manifest
    namespace/metallb-system created
    secret/memberlist created
    podsecuritypolicy.policy/controller created
    podsecuritypolicy.policy/speaker created
    serviceaccount/controller created
    serviceaccount/speaker created
    clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
    clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
    role.rbac.authorization.k8s.io/config-watcher created
    role.rbac.authorization.k8s.io/pod-lister created
    clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
    clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
    rolebinding.rbac.authorization.k8s.io/config-watcher created
    rolebinding.rbac.authorization.k8s.io/pod-lister created
    daemonset.apps/speaker created
    deployment.apps/controller created
    configmap/config created
    MetalLB is enabled
    

    2-3-3. 애드온이 활성화되었는지 확인


    $ microk8s.status
    microk8s is running
    high-availability: no
      datastore master nodes: 127.0.0.1:19001
      datastore standby nodes: none
    addons:
      enabled:
        dns                  # CoreDNS
        ha-cluster           # Configure high availability on the current node
        metallb              # Loadbalancer for your Kubernetes cluster
        rbac                 # Role-Based Access Control for authorisation
        storage              # Storage class; allocates storage from host directory
    <以下略>
    

    2-5. (선택 사항) coredns 다시 쓰기



    사내 온프레 GitLab의 IP 주소를 사내 DNS측으로부터 취득하고 싶었으므로, DNS 서버의 참조처를 변경했습니다.
    $ kubectl edit configmaps coredns -n kube-system -o yaml
    

    너무 깨끗한 방법은 아니지만 직접 다시 작성했습니다.
    data:
      Corefile: ".:53 {\n    errors\n    health {\n      lameduck 5s\n    }\n    ready\n
        \   log . {\n      class error\n    }\n    kubernetes cluster.local in-addr.arpa
        ip6.arpa {\n      pods insecure\n      fallthrough in-addr.arpa ip6.arpa\n    }\n
        \   prometheus :9153\n    forward . <社内DNSサーバー> \n    cache 30\n    loop\n    reload\n
        \   loadbalance\n}\n"
    

    다음과 같이 DNS를 그릴 수 있는지 확인합시다.
    $ kubectl run busybox --restart=Never --image=busybox:1.28 -- sleep 3600
    $ kubectl exec busybox -- nslookup <オンプレGitLab FQDN>
    

    2-6. (선택 사항) 외부에서 kubectl로 연결할 수 있도록 config 가져 오기



    (GitLab에서 연결하는 데 필수는 아닙니다)

    kubeconfig를 가져옵니다.
    $ microk8s.config | tee gitlab-microk8s.config
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: LS0tLS1CRUdJxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        server: https://10.x.y.z:16443
      name: microk8s-cluster
    contexts:
    - context:
        cluster: microk8s-cluster
        user: admin
      name: microk8s
    current-context: microk8s
    kind: Config
    preferences: {}
    users:
    - name: admin
      user:
        username: admin
        password: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    

    3. GitLab과 협력하는 데 필요한 정보를 얻습니다.



    GitLab과 협력하려면 다음 정보가 필요합니다.
    1. API URL
    2. CA 인증서
    3. 서비스 토큰
    각각 취득해 둡니다.

    3-1. API URL



    2-6에서 얻은 kubeconfig server: https://10.x.y.z:16443 https://10.x.y.z:16443 부분입니다

    3-2. CA 인증서


    kubectl get secrets 에서 나온 default-token에서 인증서를 가져옵니다.
    $ kubectl get secrets
    NAME                  TYPE                                  DATA   AGE
    default-token-78r9t   kubernetes.io/service-account-token   3      46h
    
    default-token-78r9t 로부터 증명서를 취득합니다.
    $ kubectl get secret default-token-78r9t -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
    -----BEGIN CERTIFICATE-----
    MIIDATCCAemgAwIBAgIJANFqxpnmuSSZMA0GCSqGSIb3DQEBCwUAMBcxFTATBgNV
    <中略>
    -----END CERTIFICATE-----
    

    3-3. 서비스 토큰



    서비스 토큰을 얻으려면 먼저 다음과 같은 매니페스트에서 서비스 계정 gitlab을 만듭니다.

    gitlab-admin-service-account.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: gitlab
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: gitlab-admin
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
      - kind: ServiceAccount
        name: gitlab
        namespace: kube-system
    

    만든 파일을 kubectl apply합니다.
    $ kubectl apply -f gitlab-admin-service-account.yaml
    

    서비스 계정이 생겼으므로 토큰을 받습니다.
    마지막 token: 이후의 문자열 (아래의 예에서는 eyJhbGciOiから最後 까지)을 어딘가에 보존해 둡니다.
    $ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab | awk '{print$1}')
    Name:         gitlab-token-dqjlx
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  kubernetes.io/service-account.name: gitlab
                  kubernetes.io/service-account.uid: 7e73e750-4bfc-4718-9ee0-ebe83da58c36
    
    Type:  kubernetes.io/service-account-token
    
    Data
    ====
    ca.crt:     1103 bytes
    namespace:  11 bytes
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IjVURFF<以下略>
    

    후반에 계속

    후반: 온프레 GitLab에 MicroK8s 연결하여 GitLab Auto DevOps 체험 (후반) - Qiita

    좋은 웹페이지 즐겨찾기