Table of Contents
Kubernetes – 서비스 도메인(svc.cluster.local) 에 https 적용하기
서비스 DNS 에 사설 인증서를 붙여줍니다.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
rootCA 인증서 생성
위 링크를 참조하여 rootCA 인증서를 생성합니다.
단 Common Name
은 svc.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 Name
은 repository.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 통신이 정상적으로 이루어지려면 필요하다.