Kubernetes – 서비스 도메인(svc.cluster.local) 에 https 적용하기

By | 2022년 12월 8일
Table of Contents

Kubernetes – 서비스 도메인(svc.cluster.local) 에 https 적용하기

서비스 DNS 에 사설 인증서를 붙여줍니다.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

rootCA 인증서 생성

참조

위 링크를 참조하여 rootCA 인증서를 생성합니다.

Common Namesvc.cluster.local 로 지정해야 합니다.

Common Name (e.g. server FQDN or YOUR name) []:svc.cluster.local

rootCA 등록

필요한 namespace 모두에 각각 등록해 줍니다.

# kubectl get configmap -n default
# kubectl get configmap -n repository

# kubectl delete configmap private-rootca.crt -n default
# kubectl delete configmap private-rootca.crt -n repository

kubectl create configmap private-rootca.crt --from-file=rootCA.crt -n default
kubectl create configmap private-rootca.crt --from-file=rootCA.crt -n repository
kubectl create configmap private-rootca.crt --from-file=rootCA.crt -n argocd

서버 인증서 생성

서버 인증서 생성

아래 내용은 repository 네임스페이스용 서버인증서를 생성합니다.

Common Namerepository.svc.cluster.local 로 지정해야 합니다.

Common Name (e.g. server FQDN or YOUR name) []:repository.svc.cluster.local
openssl ecparam -out repository.key -name prime256v1 -genkey
openssl req -new -sha256 -key repository.key -out repository.csr

wildcard 인증서를 생성합니다.

vi repository-extention.ext
---------------------------
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.repository.svc.cluster.local
---------------------------
openssl x509 -req -sha256 -days 999999 -in repository.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out repository.crt -extfile repository-extention.ext
rm -rf repository/
mkdir repository
mv repository.* repository/

디렉토리를 configmap 에 등록합니다.

# kubectl delete configmap repository-pemstore -n repository
kubectl create configmap repository-pemstore --from-file=repository/ -n repository

Deployment 생성

nginx 설정파일 생성

vi test.repository.conf
---------------------------
server {
    listen       80;
    server_name  test.repository;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {
    listen       443 ssl;
    server_name  test.repository;

    ssl_certificate /ssl/repository.crt;
    ssl_certificate_key /ssl/repository.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
---------------------------
kubectl create configmap test.repository.conf --from-file=test.repository.conf -n repository

Deployment 생성

vi test.repository.yaml
---------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: repository
  labels:
    app: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test-repository
  template:
    metadata:
      labels:
        app: nginx-test-repository
    spec:
      containers:
      - name: nginx-test-repository
        image: nginx:1.14.2
        volumeMounts:
        - name: private-rootca-crt
          mountPath: /etc/ssl/certs/repository.pem
          subPath: rootCA.crt
          readOnly: true
        - name: repository-pemstore
          mountPath: /ssl/
          readOnly: true
        - name: test-repository-conf     # 여기
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: test.repository.conf
          readOnly: true
        ports:
        - containerPort: 80
      volumes:
      - name: private-rootca-crt
        configMap:
          name: private-rootca.crt
      - name: repository-pemstore
        configMap:
          name: repository-pemstore
      - name: test-repository-conf       # 여기
        configMap:
          name: test.repository.conf
---------------------------
kubectl apply -f test.repository.yaml
kubectl get pods -n repository

Service 생성

vi test-repository-svc.yaml
---------------------------
apiVersion: v1
kind: Service
metadata:
  name: test
  namespace: repository
  labels:
    app: nginx-service
spec:
  type: ClusterIP    # 서비스 타입
  ports:
  - name: http
    port: 80         # 서비스 포트
    targetPort: 80   # 컨테이너 포트(pod 포트)
    protocol: TCP
  - name: https
    port: 443        # 서비스 포트
    targetPort: 443  # 컨테이너 포트(pod 포트)
    protocol: TCP
  selector:
    app: nginx-test-repository
---------------------------
kubectl apply -f test-repository-svc.yaml
kubectl get svc -n repository
kubectl describe svc test -n repository

확인하기

Worker 노드에서 테스트하기 위해서는 여기 를 참조하여 인증서를 서버에 추가해 줍니다.

kubectl get svc -n repository
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
test                ClusterIP   10.96.241.144   <none>        80/TCP,443/TCP   29h
sudo vi /etc/hosts
---------------------------
10.96.241.144   test.repository.svc.cluster.local
---------------------------
curl http://test.repository.svc.cluster.local/
curl https://test.repository.svc.cluster.local/

ingress-nginx 에 https 적용하기

여기 를 참조해서 ingress-nginx 에 https 를 적용하면 간편하다

Pod 에 루트인증서 적용하기

여기 를 참조해서 루트인증서를 Pod 에 적용할 수 있다.

Docker 이미지에 루트인증서 적용하기

여기 를 참조하여 루트인증서를 Docker 에 적용할 수 있다.

도커로 생성한 이미지를 docker repository 로 push 하려할 때 https 통신이 정상적으로 이루어지려면 필요하다.

답글 남기기