사용자 → Jenkins 콘솔 → Credentials Store → GitHub → 레지스트리 → Kubernetes
| 단계 | 인증 수단 |
|---|---|
| 사용자 → Jenkins UI | 로컬 계정 · LDAP · AD · SAML · OAuth SSO · API 토큰 |
| Jenkins → GitHub | PAT(HTTPS) · SSH Deploy Key · GitHub App |
| Jenkins → 컨테이너 레지스트리 | 레지스트리 계정 또는 로봇 계정 |
| Jenkins → Kubernetes | ServiceAccount 토큰이 담긴 kubeconfig |
파이프라인이 외부 시스템에 접근할 때 쓰는 비밀은 Jenkins 내부 암호화 저장소에 넣고 ID 로 참조한다. 값은 로그에서 **** 로 마스킹된다.
withCredentials([
string(credentialsId: 'github-token', variable: 'GH_TOKEN'),
usernamePassword(credentialsId: 'harbor-cred', usernameVariable: 'REG_USER', passwordVariable: 'REG_PASS'),
file(credentialsId: 'kubeconfig-prod', variable: 'KUBECONFIG')
]) {
sh 'git clone https://${GH_TOKEN}@github.com/org/repo.git'
sh 'echo ${REG_PASS} | docker login registry.example.com -u ${REG_USER} --password-stdin'
sh 'kubectl --kubeconfig=${KUBECONFIG} apply -f k8s/'
}
| 방식 | 특징 |
|---|---|
| PAT | HTTPS URL 에 토큰을 넣는다. 만료 기간을 짧게 두고 저장소 범위를 제한한다 |
| SSH Deploy Key | 저장소에 공개키를 등록하고 Jenkins 에 개인키를 둔다. 저장소 단위 권한 |
| GitHub App | 조직 단위 권한 관리, JWT 기반 단기 토큰. 가장 권장된다 |
Webhook 으로 빌드를 트리거할 때는 secret 을 설정해 서명(X-Hub-Signature-256)을 검증하고, Jenkins 쪽 엔드포인트가 외부에 열려 있으면 IP 제한을 함께 건다.
Jenkins 가 Kubernetes 에 배포하려면 대상 클러스터의 kubeconfig 를 Secret file 자격증명으로 등록하고 위처럼 주입한다. Jenkins 자체가 Kubernetes 안에서 돌면 Pod 의 ServiceAccount 에 배포 네임스페이스 권한(Role · RoleBinding)만 주는 편이 안전하다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: app-prod
name: jenkins-deployer
rules:
- apiGroups: ["apps", ""]
resources: ["deployments", "services", "configmaps", "pods"]
verbs: ["get", "list", "create", "update", "patch"]
클러스터 관리자 권한(cluster-admin)을 그대로 쓰는 구성은 피한다.