keycloak 은 콜솔에서 직접 계정 생성/조회/삭제 등여러가지 기능이 가능하지만, API 로도 이를 사용 할 수 있다.

 

[API 문서]

https://www.keycloak.org/docs-api/15.0/rest-api/index.html#_accesstoken

 

Keycloak Admin REST API

This is a REST API reference for the Keycloak Admin Version information URI scheme Host: localhost:8080 BasePath: /auth Schemes: HTTP

www.keycloak.org

이중 대표적인 API 몇가지만 사용해 보자


환경

Keycloak : jboss/keycloak

https://hub.docker.com/r/jboss/keycloak/

 

Docker

 

hub.docker.com


1.  jboss/keycloak docker 설치

[code]
sudo docker run -e KEYCLOAK_USER=<USERNAME> -e KEYCLOAK_PASSWORD=<PASSWORD> jboss/keycloak

[code sample]
sudo docker run -p 8080:8080 -d -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak

- 8080포트로 포트포워딩
- -d 옵션으로 백그라운드 실행
- -e 환경 변수로 IP/PW = admin/admin 설정

 

2. 설치 확인

sudo docker ps | grep keycloak

- 'CONTAINER ID' 를 메모해 두자

[결과값]

 

3.  Keycloak IP 확인

sudo docker exec -it dee207029f5f /bin/bash
> hostname -i

 

4. Container Network Test

curl {keycloak container IP}:8080
curl {localhost IP}:8080

[결과값]

 

5. Keycloak Web Browser 접속

http://[IP]:8080
ID/PW = admin/admin

 

 

6. admin-cli Client 설정 변경

  • Master - Clients - admin-cli  - Settings - Service Accounts Enabled 를 ON 으로 변경 후 저장
  • 저장하고나면 Service Account Roles 탭이 생기는데 이곳에서 권한 설정
  • Service Account Roles - Client Roles - 'master-realm' 에서 권한 추가
  • 필요한 권한만 추가하면 되나, 이 글에서는 모든 권한 추가
  • Master - Clients - admin-cli  - Settings - Access Type 을 confidential 로 변경 후 저장
  • Master - Clients - admin-cli  - Credentials - Secret 을 저장[토큰 발행시 사용]

 

7. 토큰발행 API

curl -k \
-d "client_id=admin-cli" \
-d "client_secret={client_secert}" \
-d "grant_type=client_credentials" \
-X POST "{IP}/auth/realms/master/protocol/openid-connect/token"

[결과값]

  • access_token, expires_in, refresh_expires_in, token_type 등 여러 값이 나오는데 이중 access_token 만 저장
  • expires 같은경우 master-token 에서 설정 변경 가능

8. 전체 유저 확인

curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {TOKEN}" \
-X GET "{IP}/auth/admin/realms/master/users"

 

 

9. 특정 유저 확인

curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {TOKEN}" \
-X GET "{IP}/auth/admin/realms/master/users?username={username}"

 

 

10. 유저 생성

curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {TOKEN}" \
-X POST "{IP}" \
-d "{"email":"test@keycloak.com", "enabled":"true", "username":"app-user", "credentials": [{"type":"password", "value":"1234", "temporary": false}]}"

 



 

이 외 여러 API 들은 keycloak API 에서 확인하여 사용하면 된다.

 

[참고자료]

  • keycloak Token 을 사용하여 특정인원 조회 하는 쉘 스크립트
  • jq -r 구문을 통해서 access_token 값을 val1 에 저장
  • $1 을 사용해서 특정 유저 조회 [쉘 실행시 'sh keycloak.sh username'] 
#!bin/bash

echo ''
val1=`curl -k \
-H "Content_Type: application/json" \
-d "client_id=admin-cli" \
-d "client_secret={secret key}" \
-d "grant_type=client_credentials" \
-X POST "{ip:port}/auth/realms/master/protocol/openid-connect/token" | jq -r '.access_token'`

echo '---------Token value-------'
echo ''
echo $val1
echo ''
echo '---------------------------'


echo ''
echo '---------Search All User-------'
echo ''
curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $val1" \
-X GET "{ip:port}/auth/admin/realms/master/users"
echo ''
echo ''
echo '-------------------------------'


echo ''
echo ''
echo '--------Search One User-------'
echo ''
curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $val1" \
-X GET "{ip:port}/auth/admin/realms/master/users?username=$1"

echo ''
echo ''
echo '-------------------------------'

 

AWS EKS 에서 서비스의 형식으로 LB를 사용하는 경우 여러 옵션 값들을 사용 할 수 있다.

 

각 어플리케이션의 인입으로 LB를 사용할 경우 환경에 맞게 세팅 변경이 필요한데 이때 Annotations 를 사용하여 변경하면 된다.

 

대표적으로 LB의 종류, 서브넷 지정, IP 지정 등 다양한 옵션을 아래 문서에서 찾아서 사용 하면 된다.

 

[AWS Annotations 문서]

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/service/annotations/

 

Annotations - AWS Load Balancer Controller

Annotations Service annotations Annotation keys and values can only be strings. All other types below must be string-encoded, for example: boolean: "true" integer: "42" stringList: "s1,s2,s3" stringMap: "k1=v1,k2=v2" json: "{ \"key\": \"value\" }" Annotati

kubernetes-sigs.github.io

 

'AWS' 카테고리의 다른 글

ECR Multi Region Replication  (0) 2023.06.04
EKS 최초 생성 권한 문제  (0) 2023.04.16
EventBridge 를 사용한 알람 발송  (0) 2023.01.20
AWS EKS nodegroup 생성 시 필요 조건  (0) 2023.01.20
AWS Instance Network Bandwidth  (0) 2022.10.30

EventBridge 는 AWS 및 3rd Party 에서 발생하는 이벤트들을 수집하는 역할을 담당 하고 있다.

AWS 에는 여러가지 많은 서비스 들이 있는데 EventBridge 는 각 서비스들에서 발생 시키는 Event 에 대하여 트리거 설정을 할 수 있다.

 

[이해를 돕기위한 그림]

CloudTrail -----①----- EventBridge -----②----- SNS

설명
CloudTrail 에서 특정 이벤트가 발생 하였을 경우 그에 대한 이벤트 로그가 AWS 내부에 남게 된다
이때 발생한 이벤트 로그중 일부분을 EventBridge 에 설정(트리거 역할)
트리거조건이 충족되면 EventBridge 에서 설정한 다음 동작이 수행된다
SNS 뿐만아니라 Lambda 등 다양한 AWS 서비스를 연계시킬수 있다

설정 방법

 

1. EventBridge 생성

2. 샘플 이벤트 설정

  • 해당 샘플에서는 CloudTrail 에 대한 설정을 진행할 예정
  • 샘플 이벤트에서 CloudTrail 을 입력하면 여러가지가 나오는데 그중 아래와 같이 AWS API Call via CloudTrail 을 선택

 

3. 이벤트 샘플 JSON 확인

  • 이벤트 샘플을 선택하면 나오는 JSON 을 확인하여 필요한 조건을 지정
  • 해당 예시에서는 CloudTrail 을 사용해서 누가 특정한 Role 을 사용하는지 확인 하고 싶을때에 대한 예이다
  • 밑에 Json 구분중 userName 이 적힌 부분이 있을 것이다. 이부분을 트리거로 잡아서 알람을 발생 시킬예정
{
  "version": "0",
  "id": "a1aa69ff-66e8-c3eb-2e47-3776ac5935dd",
  "detail-type": "AWS API Call via CloudTrail",
  "source": "aws.resource-groups",
  "account": "123456789012",
  "time": "2022-02-17T09:42:52Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "eventVersion": "1.08",
    "userIdentity": {
      "type": "AssumedRole",
      "principalId": "XYZZYOR:admin",
      "arn": "arn:aws:sts::123456789012:role/admin",
      "accountId": "123456789012",
      "accessKeyId": "XYZZY",
      "sessionContext": {
        "sessionIssuer": {
          "type": "Role",
          "principalId": "XYZZYOR",
          "arn": "arn:aws:iam::123456789012:role/Admin",
          "accountId": "123456789012",
          "userName": "Admin"
        },
        "webIdFederationData": {},
        "attributes": {
          "creationDate": "2022-02-17T09:41:02Z",
          "mfaAuthenticated": "false"
        }
      }
    },
    "eventTime": "2022-02-17T09:42:52Z",
    "eventSource": "resource-groups.amazonaws.com",
    "eventName": "CreateGroup",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "52.94.133.138",
    "userAgent": "aws-cli/2.2.31 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off command/resource-groups.create-group",
    "requestParameters": {
      "Description": "test6",
      "Name": "test301",
      "ResourceQuery": {
        "Type": "CLOUDFORMATION_STACK_1_0",
        "Query": "{ \"ResourceTypeFilters\": [ \"AWS::AllSupported\" ], \"StackIdentifier\": \"arn:aws:cloudformation:us-east-1:123456789012:stack/test/aa434df0-fe92-11eb-bde9-0a03f460991d\"}"
      }
    },
    "responseElements": {
      "Group": {
        "GroupArn": "arn:aws:resource-groups:us-east-1:123456789012:group/test301",
        "Name": "test301",
        "Description": "test6",
        "OwnerId": "123456789012"
      },
      "ResourceQuery": {
        "Type": "CLOUDFORMATION_STACK_1_0",
        "Query": "{ \"ResourceTypeFilters\": [ \"AWS::AllSupported\" ], \"StackIdentifier\": \"arn:aws:cloudformation:us-east-1:123456789012:stack/test/aa434df0-fe92-11eb-bde9-0a03f460991d\"}"
      }
    },
    "requestID": "31cabb57-0931-4cdb-b66b-137267531dd1",
    "eventID": "4d51d885-3d1f-4579-bf42-96924aadbc3f",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
  }
}

4. 트리거 설정

  • 위에 있는 Json 전체 코드중 userName 만 필요
  • userName 이 User-Name 인경우를 트리거 하는 코드는 아래와 같다
  • 생성방법에서 사용자 지정 패턴을 사용하여 아래 코드를 입력

{
    "source": ["aws.cloudtrail"],
    "detail": {
        "userIdentity": {
            "sessionContext": {
                "sessionIssuer": {
                    "userName": ["User-Name"]
                }
            }
        }
    }
}

5. 대상 동작 설정

  • 위와같은 트리거가 발생 하였을때 실행할 대상을 선택하는 곳

 

6. 결과 확인

  • 위와같이 설정을 하게되면 CloudTrail 에서 이벤트 발생시 EventBridge 가 작동해서 SNS 를 보내게 된다
  • SNS 메일로 오는 결과 값은 CloudTrail 전체 Json 에 있던 내용을 받게 된다

※참고자료

  • AWS 에서 발생하는 이벤트들은 AWS 에서 자체적으로 이벤트를 발생시켜 주기때문에 샘플을 사용하여 확인하면됨
  • AWS가 아닌 3rd Party 에서 발생하는 이벤트는 Lambda 를 통해 이벤트 발생을 시킬 수 있다.
  • 3rd Party 에서 Lambda 를 바로 호출 할 수 있다면 Lambda 를 바로 사용하면 되고, 그렇지 않을경우(대부분이 사설망이다보니 바로호출이 불가함) API Gateway 를통해서 Lambda 를 호출하면 된다.
  • 3rd Party[webhook] -> API gateway URL -> Lambda -> EventBridge -> SNS 순으로 완성되게 된다.

[Event 발생시키는 Lambda Code]

from datetime import datetime
import json
import boto3
import datetime

client = boto3.client('events')

def lambda_handler(event, context):

    response = client.put.events(
        Entries=[
            {
                'Time': datetime.datetime.now(),
                'Source': 'Lambda Publish',
                'Resources': [],
                'DetailType': 'Custom event demo'
                'Detail': json.dumps(event),
                'EventBusName': 'arn:aws:events:ap-northeast-2:xxxxxxxxxxxxxxxxxxxxxxxxxx:event-but/default'
            }
        ]
    )
return response

 

'AWS' 카테고리의 다른 글

EKS 최초 생성 권한 문제  (0) 2023.04.16
AWS LB Annotations  (0) 2023.01.23
AWS EKS nodegroup 생성 시 필요 조건  (0) 2023.01.20
AWS Instance Network Bandwidth  (0) 2022.10.30
AWS Certification 종류  (0) 2022.10.30

보안그룹이 모두 열려있는 개인이 가진 AWS 콘솔에서는 문제가 없겠지만, 사설망에서 사용하는경우 와 빡빡하게 보안그룹을 관리하는 경우에는 EKS 생성시 필요한 조건이 충족되지 못하여 EKS Cluster Join Failed 에러가 종종 발생한다.

 

이를 해결하기 위해 몇일 찾아봤지만 마땅한 답을 찾지 못했다. 그래서 AWS 서포트에 문의를 했고 해당 원인을 찾을 수 있었다.

 

EKS 생성에는 여러가지 조건이 있겠지만 내가 놓친 부분은 Endpoint 에 대한 부분 이었다.

같은 VPC 대역대이고, IAM 권한등을 다 확인을 했지만 문제를 찾지 못했는데 예상외로 EKS 생성시 필요한 Endpoint 가 많았다. 

 

1. EC2 Endpoint

2.  ECR.API Endpoint

3. ECR.dkr Endpoint 

4. S3 Endpoint 

EKS nodegroup 생성시 join failed error 가 발생하면 위 Endpoint 의 보안그룹을 확인해 보는걸 추천한다.

 

EKS 문서를 보면 자세하게 나와 있으니 참고하면 된다.

https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-worker-nodes-cluster/

 

작업자 노드를 Amazon EKS 클러스터에 조인

내 워커 노드를 내 Amazon EKS 클러스터에 조인하려면 어떻게 해야 합니까? 최종 업데이트 날짜: 2022년 7월 29일 내 워커 노드가 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에 조인되지 않습니다. 간

aws.amazon.com

https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshooteksworkernode.html

 

AWSSupport-TroubleshootEKSWorkerNode - AWS Systems Manager Automation runbook reference

To successfully run this automation, the state of your Amazon EC2 worker node must be running , and the Amazon EKS cluster state must be ACTIVE .

docs.aws.amazon.com

 

 

'AWS' 카테고리의 다른 글

EKS 최초 생성 권한 문제  (0) 2023.04.16
AWS LB Annotations  (0) 2023.01.23
EventBridge 를 사용한 알람 발송  (0) 2023.01.20
AWS Instance Network Bandwidth  (0) 2022.10.30
AWS Certification 종류  (0) 2022.10.30

 

 

Grafaka SSL 방법 1. [ AWS NLB, AWS ACM 사용]


개념설명 : AWS NLB 에서는 SSL offload 기능을 지원함으로써 인증처리를 진행 할 수 있다

User -----ⓐ-----> NLB -----ⓑ-----> Grafana 
위 구성으로 흐름이 진행 될때 

1. ⓐ 구간에서는 https 를 사용한 통신이 진행
2. ⓑ 구간에서는 NLB 가 SSL offload 기능을 지원함으로써 NLB 와 Grafana 사이에서는 SSL 통신이 아닌 http 통신이 이루어진다

장점 : Grafana 설정의 변경 없이 NLB 구성만으로 인증 적용이 가능
단점 : 모든통신이 암호화 되어야 한다는 조건이 있어야 한다면 해당 기능은 위배됨

 

 

1. Grafana SSL의 경우 EKS에서 구성을 하여 앞단 NLB를 사용하여 SSL 구성

Grafana.ini 설정은 아래와 같음

  • protocol : http
  • http_port: 3000

2. Grafana 설치한 SVC 에서 LB를 NLB로 설정

  • annotations -> service.beta.kubernetes.io/aws-load-balancer-type: nlb
  • port 443 -> targetgroup : 3000

 

3. Grafana SVC 로 생성된 LB 설정 변경

  • protocol : tls
  • port : 443
  • key : ACM 에 등록해 놓은 key value

 

 


Grafaka SSL 방법 2. [k8s secret 사용]

인증서가 있다는 가정 하에 방법만 소개

1. k8s secret 에 인증 정보를 등록

kubectl create secret tls {secret Name} --key {key file 위치} --cert {cert 파일 위치}

ex) kubectl create secret tls grafana-tls --key ./grafana.pem --cert grafana.crt

2. Grafana.ini 수정

  • server 부분에 아래와 같이 인증을 위한 구문 추가
apiVersion: v1
data:
  grafana.ini: |
    [analytics]
    check_for_updates = true
    [grafana_net]
    url = https://grafana.net
    [log]
    mode = console
    [paths]
    data = /var/lib/grafana/
    logs = /var/log/grafana
    plugins = /var/lib/grafana/plugins
    provisioning = /etc/grafana/provisioning
    [server]
    domain = ''
    protocol = https
    http_port = 3000
    cert_file = /etc/grafana/certs/tls.crt
    cert_key = /etc/grafana/certs/tls.key
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: grafana
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2023-01-08T10:53:50Z"
  labels:
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: grafana
    app.kubernetes.io/version: 9.3.1
    helm.sh/chart: grafana-6.49.0
  name: grafana
  namespace: default

3. Grafana deploy 수정

  • livenessProbe 수정 [HTTP -> HTTPS]
  • readnessProbe 수정 [ HTTP -> HTTPS]
  • volumeMounts 수정 [secret 정보 추가]
  • volumes 수정 [ secret 정보 추가]
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "11"
    meta.helm.sh/release-name: grafana
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2023-01-08T10:53:50Z"
  generation: 11
  labels:
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: grafana
    app.kubernetes.io/version: 9.3.1
    helm.sh/chart: grafana-6.49.0
  name: grafana
  namespace: default
  resourceVersion: "933445"
  uid: eefb9039-1a0b-42a2-93f4-b00202952b4d
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/instance: grafana
      app.kubernetes.io/name: grafana
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      annotations:
        checksum/config: a2595b85e18556bc0de1f2f372e9e359553d9ae9bd18508e1a0084f27c7feb38
        checksum/dashboards-json-config: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
        checksum/sc-dashboard-provider-config: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
        checksum/secret: 1ea061ca428873f84f692fc1dfc086f12326157440acf50b5acfd7b25b711037
      creationTimestamp: null
      labels:
        app.kubernetes.io/instance: grafana
        app.kubernetes.io/name: grafana
    spec:
      automountServiceAccountToken: true
      containers:
      - env:
        - name: GF_SECURITY_ADMIN_USER
          valueFrom:
            secretKeyRef:
              key: admin-user
              name: grafana
        - name: GF_SECURITY_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              key: admin-password
              name: grafana
        - name: GF_PATHS_DATA
          value: /var/lib/grafana/
        - name: GF_PATHS_LOGS
          value: /var/log/grafana
        - name: GF_PATHS_PLUGINS
          value: /var/lib/grafana/plugins
        - name: GF_PATHS_PROVISIONING
          value: /etc/grafana/provisioning
        image: grafana/grafana:9.3.1
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 10
          httpGet:
            path: /api/health
            port: 3000
            scheme: HTTPS
          initialDelaySeconds: 60
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 30
        name: grafana
        ports:
        - containerPort: 3000
          name: grafana
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /api/health
            port: 3000
            scheme: HTTPS
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /etc/grafana/grafana.ini
          name: config
          subPath: grafana.ini
        - mountPath: /var/lib/grafana
          name: storage
        - mountPath: /etc/grafana/certs/
          name: grafana-certs
          readOnly: true
      dnsPolicy: ClusterFirst
      enableServiceLinks: true
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 472
        runAsGroup: 472
        runAsUser: 472
      serviceAccount: grafana
      serviceAccountName: grafana
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 420
          name: grafana
        name: config
      - name: grafana-certs
        secret:
          defaultMode: 420
          items:
          - key: tls.crt
            path: tls.crt
          - key: tls.key
            path: tls.key
          secretName: grafana-tls
      - emptyDir: {}
        name: storage

 

4. svc 수정

  • ports 정보를 80 에서 443 으로 변경
kubectl edit svc grafana

------
  ports:
  - name: service
    port: 443
    protocol: TCP
    targetPort: 3000
------

 


 

 

 

 

 

 

Keycloak SSL [ keycloak 에 인증서 직접 부여]


1. 인증에 사용할 crt / key 파일은 secret 파일로 생성

2. Statefulset 수정 

apiVersion: apps/v1
kind: StatefulSet
metadata:
  annotations:
    meta.helm.sh/release-name: keycloak
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2023-01-07T08:55:19Z"
  generation: 11
  labels:
    app.kubernetes.io/instance: keycloak
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: keycloak
    app.kubernetes.io/version: latest
    helm.sh/chart: keycloak-18.4.0
  name: keycloak
  namespace: default
  resourceVersion: "22219"
  uid: fbe91bf4-e242-4848-89dc-bffb402512ba
spec:
  podManagementPolicy: Parallel
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/instance: keycloak
      app.kubernetes.io/name: keycloak
  serviceName: keycloak-headless
  template:
    metadata:
      annotations:
        checksum/config-startup: 7a33485f722479daf33e6401e30c167baa16006e262f9ec19b58100bb4e722c4
        checksum/secrets: 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
      creationTimestamp: null
      labels:
        app.kubernetes.io/instance: keycloak
        app.kubernetes.io/name: keycloak
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app.kubernetes.io/component
                  operator: NotIn
                  values:
                  - test
                matchLabels:
                  app.kubernetes.io/instance: keycloak
                  app.kubernetes.io/name: keycloak
              topologyKey: failure-domain.beta.kubernetes.io/zone
            weight: 100
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app.kubernetes.io/component
                operator: NotIn
                values:
                - test
              matchLabels:
                app.kubernetes.io/instance: keycloak
                app.kubernetes.io/name: keycloak
            topologyKey: kubernetes.io/hostname
      containers:
      - env:
        - name: DB_VENDOR
          value: mariadb
        - name: DB_ADDR
          value: {IP입력}
        - name: DB_PORT
          value: "3306"
        - name: DB_DATABASE
          value: keycloak
        - name: DB_USER
          value: keycloak
        - name: DB_PASSWORD
          value: {Passwd}
        - name: KEYCLOAK_USER
          value: admin
        - name: KEYCLOAK_PASSWORD
          value: admin
        - name: KC_HTTPS_CERTIFICATE_KEY_FILE
          value: /ect/x509/https/tls.key
        - name: KC_HTTPS_CERTIFICATE_FILE
          value: /ext/x509/https/tls.crt
        - name: KC_HTTPS_PROTOCOLS
          value: TLSv1.3
        - name: KC_HTTP_PORT
          value: "8080"
        - name: KC_HTTPS_PORT
          value: "8443"
        - name: KC_HOSTNAME
          value: keycloak1.kgmarket.net
        image: jboss/keycloak:latest
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /auth/
            port: http
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        name: keycloak
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
        - containerPort: 9990
          name: http-management
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /auth/realms/master
            port: http
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources: {}
        securityContext:
          runAsNonRoot: true
          runAsUser: 1000
        startupProbe:
          failureThreshold: 60
          httpGet:
            path: /auth/
            port: http
            scheme: HTTP
          initialDelaySeconds: 30
          periodSeconds: 5
          successThreshold: 1
          timeoutSeconds: 1
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /opt/jboss/startup-scripts/keycloak.cli
          name: startup
          readOnly: true
          subPath: keycloak.cli
        - mountPath: /etc/x509/https/
          name: keycloal-cert
          readOnly: true
      dnsPolicy: ClusterFirst
      enableServiceLinks: true
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 1000
      serviceAccount: keycloak
      serviceAccountName: keycloak
      terminationGracePeriodSeconds: 60
      volumes:
      - configMap:
          defaultMode: 365
          items:
          - key: keycloak.cli
            path: keycloak.cli
          name: keycloak-startup
        name: startup
      - name: keycloal-cert
        secret:
          defaultMode: 420
          items:
          - key: tls.crt
            path: tls.crt
          - key: tls.key
            path: tls.key
          secretName: keycloal-tls
  updateStrategy:
    type: RollingUpdate
status:
  availableReplicas: 1
  collisionCount: 0
  currentReplicas: 1
  currentRevision: keycloak-689d878b78
  observedGeneration: 11
  readyReplicas: 1
  replicas: 1
  updateRevision: keycloak-689d878b78
  updatedReplicas: 1

3. SVC 설정 확인

apiVersion: v1
kind: Service
metadata:
  annotations:
    meta.helm.sh/release-name: keycloak
    meta.helm.sh/release-namespace: default
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
  creationTimestamp: "2023-01-07T08:55:19Z"
  finalizers:
  - service.kubernetes.io/load-balancer-cleanup
  labels:
    app.kubernetes.io/component: http
    app.kubernetes.io/instance: keycloak
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: keycloak
    app.kubernetes.io/version: latest
    helm.sh/chart: keycloak-18.4.0
  name: keycloak-http
  namespace: default
  resourceVersion: "17158"
  uid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: xxxxxx
  clusterIPs:
  - xxxxxxxxx
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http
    nodePort: 31096
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    nodePort: 31097
    port: 443
    protocol: TCP
    targetPort: 8443
  - name: http-management
    nodePort: 31886
    port: 9990
    protocol: TCP
    targetPort: http-management
  selector:
    app.kubernetes.io/instance: keycloak
    app.kubernetes.io/name: keycloak
  sessionAffinity: None
  type: LoadBalancer

 

3. 접속 확인

 

+ Recent posts